| | 1 | |
| | 2 | == Uso de la Nvidia DGX == |
| | 3 | |
| | 4 | Para hacer uso de la Nvidia DGX no basta con tener un usuario en el HPC, es necesario solicitar acceso a través del [https://cau.info.uco.es/servicedesk/customer/portal/3/group/10/create/65 CAU]. Para saber si un usuario está autorizado a usar la DGX basta con ejecutar el comando {{{sinfo}}} desde el login server. En caso de estarlo, le aparecerá la partición {{{gpu}}}: |
| | 5 | |
| | 6 | {{{#!bash |
| | 7 | PARTITION AVAIL TIMELIMIT NODES STATE NODELIST |
| | 8 | normal* up infinite 4 mix x440-[01,15,17-18] |
| | 9 | normal* up infinite 6 alloc x440-[09-14] |
| | 10 | normal* up infinite 14 idle x440-[02-08,16,19-24] |
| | 11 | fast up infinite 4 idle x440-[21-24] |
| | 12 | fat up infinite 1 idle x808 |
| | 13 | gpu up infinite 1 idle averroes-dgx |
| | 14 | }}} |
| | 15 | |
| | 16 | Aquellos usuarios con acceso a la DGX tendrán en su home del login server un directorio especial llamado {{{dgx}}} cuyo contenido estará almacenado localmente en los discos de la DGX. Solo el contenido de este directorio estará disponible para los trabajos que se manden a la DGX. El motivo de esto es aprovechar los discos de la DGX ya que tienen una mayor velocidad de lectura y escritura que los empleados en Lustre, los cuales pueden suponer un cuello de botellas en tareas de IA como el entrenamiento de redes neuronales. |
| | 17 | |
| | 18 | A continuación se muestra un script sencillo de Slurm que lanza un trabajo en la DGX: |
| | 19 | |
| | 20 | {{{#!bash |
| | 21 | #!/bin/bash |
| | 22 | #SBATCH --job-name=dgx_job |
| | 23 | #SBATCH --partition=gpu |
| | 24 | #SBATCH --chdir=/home/rbarbudo |
| | 25 | #SBATCH --gres=gpu:2 # Número de GPUs |
| | 26 | #SBATCH --cpus-per-task=4 # Cores de CPU |
| | 27 | #SBATCH --mem=16G # Memoria RAM |
| | 28 | #SBATCH --output=%j.out |
| | 29 | |
| | 30 | . miniconda3/bin/activate |
| | 31 | conda activate vllm |
| | 32 | python check_gpus.py |
| | 33 | }}} |
| | 34 | |
| | 35 | Como se puede apreciar es muy similar a los que se utilizan para lanzar trabajos en el clúster y en el fat node, aunque hay una serie de puntos a considerar: |
| | 36 | |
| | 37 | - {{{#SBATCH --partition=gpu}}}: Indica que lo vamos a mandar a la cola en la que los nodos tienen GPUs, en nuestro caso a la DGX |
| | 38 | - {{{#SBATCH --gres=gpu:2}}}: Indica el número de GPUs que se reservan. Los jobs que lancemos no podrán acceder a más GPUs de las que se hayan reservado |
| | 39 | - {{{#SBATCH --chdir=/home/rbarbudo}}}: Es el directorio en el que vamos a trabajar dentro de la DGX. Hay que tener en cuenta que la ruta {{{/home/<usuario>/dgx}}} que se ve dentro del login server, en la DGX, se corresponde con {{{/home/<usuario>}}}. Por ejemplo, dentro del login server, el fichero {{{check_gpus.py}}} se encuentra dentro de {{{/home/rbarbudo/dgx}}}, aunque dentro de la DGX se encuentra en {{{/home/rbarbudo}}}. Se debe tener en cuenta que cuando mandamos un trabajo a la DGX está solo tiene acceso a los ficheros que están en sus discos. |
| | 40 | |
| | 41 | El script de python que se ejecuta en el shell script es el siguiente: |
| | 42 | |
| | 43 | {{{#!python |
| | 44 | import torch |
| | 45 | import os |
| | 46 | |
| | 47 | def main(): |
| | 48 | print("--- Verificación de Recursos en DGX ---") |
| | 49 | |
| | 50 | # Información de Slurm |
| | 51 | job_id = os.environ.get('SLURM_JOB_ID', 'N/A') |
| | 52 | print(f"ID del Trabajo: {job_id}") |
| | 53 | |
| | 54 | # Verificación de PyTorch y CUDA |
| | 55 | if torch.cuda.is_available(): |
| | 56 | device_count = torch.cuda.device_count() |
| | 57 | print(f"GPUs reservadas por Slurm y vistas por PyTorch: {device_count}") |
| | 58 | |
| | 59 | for i in range(device_count): |
| | 60 | props = torch.cuda.get_device_properties(i) |
| | 61 | print(f" -> GPU {i}: {props.name} ({props.total_memory / 1024**2:.0f} MB)") |
| | 62 | else: |
| | 63 | print("¡ERROR!: PyTorch no detecta GPUs. Verifica la reserva '--gres=gpu:X'.") |
| | 64 | |
| | 65 | if __name__ == "__main__": |
| | 66 | main() |
| | 67 | }}} |
| | 68 | |
| | 69 | |
| | 70 | Como se puede apreciar, estamos utilizando la librería {{{torch}}}, muy común en el contexto de IA, para imprimir el número de GPUs accesibles. Si ejecutásemos el script reservando dos GPUs tendríamos la siguiente salida: |
| | 71 | |
| | 72 | {{{ |
| | 73 | --- Verificación de Recursos en DGX --- |
| | 74 | ID del Trabajo: 832796 |
| | 75 | GPUs reservadas por Slurm y vistas por PyTorch: 2 |
| | 76 | -> GPU 0: Tesla V100-SXM3-32GB (32501 MB) |
| | 77 | -> GPU 1: Tesla V100-SXM3-32GB (32501 MB) |
| | 78 | }}} |