Saltar a contenido

GPUs en TeideHPC#

Las GPUs (unidades de procesamiento gráfico) son procesadores especializados optimizados para hacer muchísimas operaciones en paralelo —ideal cuando tu trabajo hace muchos cálculos iguales sobre grandes bloques de datos (p. ej. redes neuronales, simulaciones, render). En este clúster tenemos GPUs NVIDIA que puedes pedir desde Slurm; aquí te explico de forma práctica cómo pedirlas y qué mirar para no llevarte sorpresas.

Consejo rápido: cuando pidas GPU piensa también en cuántos cores y cuánta RAM CPU necesitas —pedir más memoria de la que luego usas puede bloquear otros trabajos y hacer que tu tarea tarde más en entrar en cola.

Entre las principales usos de las GPUs están los siguientes:

  • Edición de vídeo
  • Renderización de gráficos 3D
  • Aprendizaje automático
  • Aplicaciones científicas
  • etc...

El clúster TeideHPC ofrece 2 modelos diferentes de GPU para usar con sus trabajos. Recomendamos echar un vistazo a la descripción del clúster para tener una idea de cómo se ve.

Modelos de GPU disponibles#

Estas son las GPU disponibles actualmente en TeideHPC:

modelos # nodos # GPU/nodo tipo slurm Cores CPU/nodo Memoria CPU/nodo Capacidad de cómputo (*) Memoria GPU (GiB)
Nvidia A100 16 4 a100 64 256GB 80 40 GB
Nvidia A100 1 8 a100 64 512GB 80 40 GB
Nvidia Tesla T4 4 1 t4 32 256GB 75 16 GB

(*) Capacidad de cómputo o Compute Capability es un término técnico creado por NVIDIA como una forma compacta de describir qué funciones de hardware están disponibles en algunos modelos de GPU y no en otros. No es una medida de rendimiento y solo es relevante si está compilando sus propios programas de GPU. Consulte la página sobre programación CUDA para obtener más información.

Computación GPU en TeideHPC#

El clúster TeideHPC tiene una serie de nodos que tienen conectadas unidades de procesamiento de gráficos de propósito general (GPGPU) de NVIDIA. Es posible usar herramientas CUDA para ejecutar trabajo computacional en ellas y, en algunos casos de uso, ver aceleraciones muy significativas.

Como explicamos en la sección cómo ejecutar trabajos podemos utilizar 3 formas diferentes de enviar un trabajo a la cola de trabajos: utilizando una sesión interactiva, iniciando la aplicación en tiempo real o medio de un script de ejecución.

Cómo solicitar recursos de GPU#

  • Para solicitar nodos de GPU o GPU primero debe comprender cómo está configurado su clúster así como las particiones, por este motivo, le recomendamos que consulte la página inicial donde tenemos una descripción del clúster que le puede ayudar.
  • Básicamente hay 2 arquitecturas: icelake (nodos de GPU) y sandy (nodos de CPU).
  • En base a estas arquitecturas se sólicitan los recursos dentro del cluster.

La forma de solicitar un nodo de GPU es utilizando la partición dedicada de gpu. Para poder utilizar esta partición hay que solicitar acceso. Además de especificar la partición, hay que utilizar las gres de SLURM

Recursos genéricos GRES (Generic Resource)#

En Slurm, GRES (Generic RESource) es la forma de indicar recursos especiales como GPUs. Piensa en GRES como la etiqueta que le pones al trabajo para decir "dame esta GPU concreta". Para ver qué tipos de GRES soporta el clúster usa:

$ scontrol show config | grep Gres
GresTypes = gpu

Y para ver cuántas y qué modelos hay en cada nodo:

$ sinfo -o "%40N  %10c  %10m  %35f  %30G"

Si ves entradas como gpu:3g.20gb:1 o gpu:a100:4 eso te indica cómo puedes pedirlas con --gres. Si no estás seguro de la etiqueta exacta, prueba en login con scontrol show nodes | egrep "NodeName|gres" y copia la etiqueta que aparezca.

La funcionalidad GRES de Slurm permite la asignación, la programación y el seguimiento eficientes de estos recursos para los trabajos enviados. Ayuda a garantizar que los recursos solicitados estén disponibles y sean utilizados correctamente por los trabajos que los requieren.

Para usar GRES de manera efectiva, debe comprender cómo está configurado su clúster, cómo se definen los tipos y cantidades de GRES disponibles y especificar los requisitos de GRES al enviar trabajos.

Alternativamente, también se puede ver enumerando y filtrando el listado de nodos:

$ scontrol show nodes | egrep "NodeName|gres"

....
NodeName=node1315-4 Arch=x86_64 CoresPerSocket=8
NodeName=node2204-3 Arch=x86_64 CoresPerSocket=10
...
NodeName=node17101-1 Arch=x86_64 CoresPerSocket=32
   CfgTRES=cpu=64,mem=257214M,billing=64,gres/gpu=4,gres/gpu:a100=4
NodeName=node17102-1 Arch=x86_64 CoresPerSocket=32
   CfgTRES=cpu=64,mem=257214M,billing=64,gres/gpu=4,gres/gpu:a100=4
NodeName=node17103-1 Arch=x86_64 CoresPerSocket=32
   CfgTRES=cpu=64,mem=257214M,billing=64,gres/gpu=4,gres/gpu:a100=4
NodeName=node17104-1 Arch=x86_64 CoresPerSocket=32
   CfgTRES=cpu=64,mem=257214M,billing=64,gres/gpu=4,gres/gpu:a100=4
...

Como se puede observar, actualmente cada nodo de GPU dispone de 4 tarjetas A100 de Nvidia.

Ejemplos de uso de GRES#

  • Para un nodo de GPU (icelake) con una GPU (Nvidia A100).
salloc -n 1 --cpus-per-task 8 -p gpu --mem 8000 --gres=gpu:a100=1

Tip

Recuerde que para utilizar GPUs tiene que utilizar la partición gpu, para la cual tiene que haber solicitado acceso.

Para solicitar una sola GPU en slurm simplemente agregue la directiva #SBATCH --gres=gpu:<model> a su script de envío de trabajo y le dará acceso a una GPU. Para solicitar varias GPU, agregue #SBATCH --gres=gpu:<modelo>:n, donde ‘n’ es la cantidad de GPU.

Entonces, si desea 1 CPU y 2 GPU de nuestros nodos GPU de uso general en la partición 'gpu', debe especificar:

#SBATCH -p gpu
#SBATCH -n 1
#SBATCH --gres=gpu:a100:1

Si prefiere usar una sesión interactiva, puede usar:

salloc -p gpu --mem 8000 --gres=gpu:a100:1

Mientras está en el nodo GPU, puede ejecutar nvidia-smi para obtener información sobre las GPU asignadas.

Scripts de ejemplo para un trabajo de GPU#

  • Ejemplo usando una GPU Nvidia A100 compleata
#!/bin/bash

#SBATCH --partition=gpu
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4
#SBATCH --gres=gpu:a100:1
#SBATCH --mem=8G
#SBATCH --time=1:00:00

module purge
module load CUDA/12.0.0

nvidia-smi
sleep 20
sbatch 01_gpu_basic_a100.sbatch

Más ejemplos#

Visita nuestro github https://github.com/hpciter/user_codes