Llama 400B en agustina
- Alejandro Rivero
- 10 dic 2024
- 2 Min. de lectura
He estado preparando una demo para correr el fp16 del Llama3.1 grande en nuestro fragmento de tarjetas L40s. Es basicamente el ejemplo que aparece en https://github.com/NVIDIA/TensorRT-LLM/tree/main/examples/llama con algunos detallitos que es facil saltarse.
Lo primero es decidir la paralelizacion. Usando 24 GPUs me ha dado ocasionalmente problemas de vRAM asi que por ir a lo seguro conviene llenar la particion -dejando una maquina libre- y por tanto usar 8 maquinas con 4 GPUs cada una. Esto nos permite hacer Tensor Parallelism = 4 y Pipeline Parallelism = 8. Y dejamos el paralelismo de contexto a 1, porque en el ejemplo tampoco lo mencionan mucho.
Lo primero es pues preparar el modelo siguiendo las instrucciones pero usando una de nuestras tarjetas graficas. Para ello primero se prepara el checkpoint. Aqui usamos srun + mpirun, lanzando por tanto en interactivo… hay que tener cuidado que no se corte la terminal, porque las tareas llevan horas.
cd TensorRT-LLM/examples/llama/ln -s ../../../.cache/huggingface/hub/models--meta-llama--Llama-3.1-405B-Instruct/snapshots/be673f326cab4cd22ccfef76109faf68e41aa5f1/ llama400 srun --account=... --partition=... -N 1 -n 1 --nodelist=... --gpus=4 --time=05:00:00 mpirun -n 1 python convert_checkpoint.py --dtype float16 --tp_size 4 --pp_size 8 --model_dir llama400 --output_dir llama400_8_4.ckpt
y luego propiamente el modelo. Ojo, el modelo se crea con la misma arquitectura que las tarjetas en la que se ejecute la compilacion, y las L40s son la arquitectura anterior a las H100, luego hay que ejecutarlo en una particion de las L40s
srun --account=... --partition=ada -N 1 --ntasks-per-node=1 --gpus=4 --time=12:00:00 mpirun trtllm-build --checkpoint_dir llama400_8_4.ckpt --output_dir llama400_8_4.adaengine
Despues de esto viene el gran truco: las instrucciones por defecto crean el modelo asumiendo 8 GPUs por maquina y el pytorch se queja. Esto se debe aque si bien el build tiene el comando –gpus_per_node, el mapping ya lo ha creado el conversor, que no lo tiene previsto. Asi que hay que editar bien el config.json del engine bien el del checkpoint.
"mapping": { "world_size": 32,
"gpus_per_node": 4,
"cp_size": 1, "tp_size": 4, "pp_size": 8, "moe_tp_size": 4, "moe_ep_size": 1 },
y ahora a ejecutar.
NO HE CONSEGUIDO EJECUTARLO VIA SBATCH. Tengo que asignar primero los recursos con salloc y lanzar tras haber configurado correctamente los modulos (solo hay soporte para python 3.10 en el codigo liberado por nvidia). Basicamente
salloc --account=... --partition=ada -N 8 --ntasks-per-node=1 --gpus=32 --time=23:00:00
Y ya dentro de la sesion interactiva arreglar los modulos y lanzar:
module use /opt/amd/spack/share/spack/modules/linux-rocky8-zen3module load openmpi/4.1.5module load pythonmodule load nvidia-hpc-sdk/24.5module load numactl/2.0.14cd TensorRT-LLM/examples/llama/mpirun -v --display-allocation --display-map --report-pid - --report-uri - -n 32 --oversubscribe python ../run.py --engine_dir llama400_8_4.adaengine --tokenizer_dir llama400 --max_output_len 100 --input_text "A que instituto de Unizar corresponden las siglas BIFI?"
El mpirun cumple y lanza todo sin sorpresas.



Comentarios