Uso de SLURM
Introducción
SLURM (Simple Linux Utility for Resource Management) es el sistema de gestión de recursos y planificación de trabajos (scheduler) utilizado en el clúster. Su función principal es administrar las colas de ejecución, asignar recursos de cómputo y coordinar el uso eficiente de los nodos disponibles.
La versión instalada en el clúster es la 26.05.0.
Funcionalidades principales
SLURM permite:
- Gestión de colas de trabajos
- Asignación eficiente de recursos
- Ejecución distribuida y paralela
- Monitoreo y control de trabajos
- Control de uso compartido del clúster
Arquitectura de SLURM en el clúster
SLURM utiliza una arquitectura tipo controller/worker:
- El nodo controlador ejecuta el servicio
slurmctld, encargado de administrar la cola y coordinar los recursos. - Los nodos de cómputo ejecutan el servicio
slurmd, responsable de ejecutar las tareas asignadas.
En este clúster, el controlador principal se encuentra en: kraken.ing.puc.cl.
Particiones
SLURM organiza los nodos en grupos llamados particiones (partitions).
Cada partición define: recursos disponibles, tiempo máximo de ejecución, límites de memoria, cantidad máxima de tareas, y políticas de acceso y prioridad.
Los usuarios envían trabajos a una partición específica dependiendo de las necesidades computacionales de su tarea.
| Partition | Memoria por CPU (DefMemPerCPU) |
Máxima memoria por nodo (MaxMemPerNode) |
Máximo de tiempo por tarea (MaxTime) |
|---|---|---|---|
| ialab | 4 GB | 128 GB | 24 hrs |
Comandos básicos
Existe documentación para cada comando en la página oficial de SLURM. Algunos de los comandos básicos para el uso del scheduler se encuentran detallados a continuación.
Comandos esenciales de SLURM
| Comando | Acción | Documentación |
|---|---|---|
sinfo |
Ver estado general del cluster | link |
squeue |
Ver trabajos en la cola | link |
sq |
Versión mejorada de squeue |
— |
sfree |
Ver recursos disponibles | — |
scontrol show node <node> |
Ver detalles de un nodo | link |
sbatch script.sh |
Enviar un script batch | link |
srun --pty bash |
Enviar trabajo interactivo | link |
scancel <jobid> |
Cancelar un trabajo | link |
scontrol show job <jobid> |
Ver detalles de un trabajo | link |
serror <jobid> |
Ver errores de un job | — |
stail <jobid> |
Ver salida estándar de un job | — |
sacct -u $USER |
Ver historial de trabajos | link |
Ejemplos de uso:
# Ver particiones disponibles
sinfo
sinfo -s # vista resumida
# Ver jobs en cola
squeue -u $USER # solo los tuyos
squeue # todos
# Versión mejorada de squeue
sq
# Ver recursos disponibles en el cluster (CPU / RAM / GPU disponibles)
sfree
# Ver el estado de un nodo.
scontrol show <node>
# Comandos para interactuar con trabajos en SLURM
# Ejecutar un trabajo SLURM bloqueando tu terminal con 2 tareas o procesos
srun -n 2 python main.py
# Enviar un trabajo SLURM utilizando un script de bash
sbatch script.sh
# Cancelar un trabajo
scancel <jobid> # por job ID
scancel -u $USER # todos los tuyos
# Ver o modificar el estado de un trabajo.
scontrol show job <jobid>
sshow <jobid> # Equivalente al comando de arriba
# Pausar y reanudar un trabajo
scontrol hold <jobid> # detiene la ejecución
scontrol release <jobid> # la retoma
# Mostrar output de errores del trabajo.
serror <jobid>
# Mostrar output del trabajo.
stail <jobid>
Ejecutar trabajos en SLURM
Ejecución interactiva con srun
srun ejecuta un trabajo de manera interactiva, bloqueando tu terminal hasta que termine y mostrando la salida directamente en pantalla. Es útil para pruebas rápidas, depuración o sesiones interactivas. A diferencia de sbatch (descrito más abajo), no envía un script a la cola para ejecutarse de forma desatendida.
# Ejecutar un comando directamente en un nodo de cómputo
srun python main.py
# Solicitar 2 CPUs para la tarea
srun --cpus-per-task=2 python main.py
# Solicitar una GPU
srun --gres=gpu python train.py
Para abrir una shell interactiva dentro de un nodo de cómputo (por ejemplo, para inspeccionar el entorno o ejecutar comandos manualmente):
# Abrir una terminal interactiva en un nodo
srun --pty bash
# Terminal interactiva con una GPU asignada
srun --gres=gpu --pty bash
srun acepta los mismos flags de solicitud de recursos que se describen en la sección Flags comunes (por ejemplo --cpus-per-task, --mem, --gres, --nodelist). Ten en cuenta que la sesión termina y los recursos se liberan al cerrar la terminal o al finalizar el comando.
Ejecución batch con sbatch
Cuando corres un script con sbatch, e.g. sbatch script.sh, debes indicar los parámetros de la ejecución en el inicio del script. Abajo hay un ejemplo de como se deben indicar las opciones, y en la sección Ejemplos de SLURM puedes encontrar scripts de ejemplos útiles para distintas situaciones:
#!/bin/bash
#SBATCH --job-name=compile
#SBATCH -t 0-2:00 # tiempo maximo en el cluster (D-HH:MM)
#SBATCH -o c_job.out # STDOUT
#SBATCH -e c_job.err # STDERR
#SBATCH --mail-type=END,FAIL # notificacion cuando el trabajo termine o falle
#SBATCH --mail-user=usuario@uc.cl # mail donde mandar las notificaciones
#SBATCH --chdir=/user/miusuario # direccion del directorio de trabajo
#
#SBATCH --nodes 1 # numero de nodos a usar
#SBATCH --ntasks-per-node=24 # numero de trabajos (procesos) por nodo
#SBATCH --cpus-per-task=1 # numero de cpus (threads) por trabajo (proceso)
#SBATCH --partition=ialab # partición donde correrá tu trabajo (proceso)
python main.py
echo "Finished with job $SLURM_JOBID"
Flags comunes
A continuación se muestra una lista de los flags más comunes que un usuario puede incluir en su trabajo, ya sean para solicitar recursos o características para el trabajo.
| Descripción | Slurm |
|---|---|
| Nombre del trabajo | #SBATCH --job-name=My-Job-Name |
| Número de nodos solicitados | #SBATCH --nodes=1 |
| Número de cores por nodo solicitados | #SBATCH --ntasks-per-node=24 |
| Copia las variables de entorno del usuario | #SBATCH --export=[ALL\|NONE\|Variables] |
| Restricción de tiempo | #SBATCH --time=24:0:0 |
| Reiniciar un trabajo en caso de falla | #SBATCH --requeue |
| Compartir los nodos | #SBATCH --oversubscribe |
| Reservar los nodos para uso exclusivo | #SBATCH --exclusive |
| Uso de un recurso específico | #SBATCH --constraint="XXX" |
| Uso de memoria | #SBATCH --mem=[mem \|M\|G\|T] o --mem-per-cpu |
| Email usuario | #SBATCH --mail-user=username@uc.cl |
| Notifica al usuario por evento | #SBATCH --mail-type=ALL / BEGIN / END or FAIL |
| Solicitud nodo específico | #SBATCH --nodelist=hydra |
Uso de GPU
Para solicitar el uso de GPU en tu trabajo se utilizan --gres=gpu ó --gres=gpu:N donde N es el número de GPUs por nodo.
Por ejemplo:
#!/bin/bash
#SBATCH -t 0-2:00 # time (D-HH:MM)
#SBATCH -N 4
#SBATCH --gres=gpu
El clúster es heterogéneo: distintos nodos tienen distintos modelos de GPU (revisa el Hardware del Clúster). Si tu trabajo necesita un modelo concreto, puedes pedirlo con la opción --gres=gpu:<modelo>:N:
#SBATCH --gres=gpu:a40:1 # 1 GPU A40
#SBATCH --gres=gpu:2080ti:2 # 2 GPUs RTX 2080Ti
Para ver los modelos (GRES) disponibles en cada nodo usa sfree o sinfo -o "%n %G" o scontrol show node <node>.
Variables de entorno relevantes en trabajos de SLURM
SLURM define automáticamente variables de entorno que puedes usar dentro de tu script. Las más comunes se listan a continuación; el listado completo está en la documentación oficial.
| Nombre | Variable | Descripción |
|---|---|---|
| JobID | $SLURM_JOBID |
ID único del trabajo. |
| Job Name | $SLURM_JOB_NAME |
Nombre del trabajo. |
| Submit Directory | $SLURM_SUBMIT_DIR |
Directorio desde donde se envió. |
| Submit Host | $SLURM_SUBMIT_HOST |
Nodo desde donde se envió. |
| Node List | $SLURM_JOB_NODELIST |
Nodos asignados al trabajo. |
| Number of Nodes | $SLURM_JOB_NUM_NODES |
Cantidad de nodos asignados. |
| Number of Tasks | $SLURM_NTASKS |
Cantidad total de tareas. |
| CPUs per Task | $SLURM_CPUS_PER_TASK |
CPUs asignadas por tarea. |
| Node ID | $SLURM_NODEID |
Índice del nodo dentro del trabajo. |
| Process ID (rank) | $SLURM_PROCID |
Rank global del proceso (MPI). |
| Local Task ID | $SLURM_LOCALID |
Índice local de la tarea en el nodo. |
| GPUs Asignadas | $CUDA_VISIBLE_DEVICES |
GPUs visibles para el trabajo. |
| Array Job ID | $SLURM_ARRAY_JOB_ID |
ID base de un job array. |
| Job Array Index | $SLURM_ARRAY_TASK_ID |
Índice de la tarea en un job array. |
| Array Task Count | $SLURM_ARRAY_TASK_COUNT |
Número total de tareas del array. |
Además, el clúster define las siguientes variables propias para acceder a las distintas áreas de almacenamiento:
| Nombre | Variable | Descripción |
|---|---|---|
| Home | $HOME |
Directorio personal del usuario. |
| Archive Directory | $ARCHIVE |
Almacenamiento de largo plazo. |
| Scratch Directory | $SCRATCH |
Almacenamiento temporal. |
| User Workspace | $WORKSPACE |
Directorio de trabajo de alto rendimiento. |