🚀 Script de lanzamiento#
Para lanzar un trabajo en SLURM, es necesario un script de lanzamiento que es un archivo que contiene:
Lineas
#SBATCH
que describen los recursos que requiere un trabajo. Cuando se encuentra una línea de la sección siguiente, el resto de las líneas#SBATCH
son ignoradas.El script para un shell UNIX (generalmente
bash
) propiamente dicho, que enumera las tareas a ejecutar cuando el cluster corre el trabajo.
Preámbulo#
Hashbang#
La primera línea del archivo siempre debe indicar el shell para el que está escrito el script:
#!/bin/bash
Nombre#
El trabajo debe tener un nombre, que le sirva para identificarlo.
#SBATCH --job-name=nombre
Notificaciones al usuario (opcional)#
Se le puede pedir al manejador de recursos que notifique por email al usuario sobre actualizaciones del estado de su trabajo.
#SBATCH --mail-type=ALL
#SBATCH --mail-user=direccion@de.email
Recursos#
Luego se deben enumerar los recursos requeridos por el trabajo.
Cola de ejecución#
Los distintos recursos de cómputo de los clusters son accesibles a través de colas de trabajos, que son líneas de espera en las que trabajos con requerimientos similares se ubican hasta que les toque su turno y los recursos requeridos estén disponibles. Las colas disponibles y sus límites dependen de cada cluster.
Para seleccionar la cola short
:
#SBATCH --partition=short
Procesos (tasks)#
Cada trabajo en ejecución consiste en una cantidad de procesos corriendo simultáneamente.
Los procesos se distribuyen en uno o más nodos de cómputo (computadoras del cluster) según la disponibilidad de recursos.
En las aplicaciones MPI, la cantidad de procesos es el parámetro
-np
pasado ampirun
ompiexec
.En el script, la cantidad P de procesos del trabajo se define con la línea:
#SBATCH --ntasks=P
Alternativamente se puede pedir una distribución exacta y equitativa de procesos entre nodos del cluster, especificando explícitamente la cantidad de nodos N y cantidad de procesos por nodo PPN:
#SBATCH --nodes=N #SBATCH --ntasks-per-node=PPN
Hilos (cpus, opcional)#
Cada proceso del trabajo puede dividirse en más de un hilo de ejecución.
A cada hilo del trabajo se le asigna un core de algún procesador del cluster. En el script, la cantidad H de hilos por proceso se define con la línea:
#SBATCH --cpus-per-task=H
Entonces, si un trabajo pide P procesos con H hilos cada uno, requerirá P * H cores para correr.
Nota
En las aplicaciones OpenMP, la cantidad de hilos por
proceso está definida en la variable de entorno OMP_NUM_THREADS
.
Tiempo#
Es necesario especificar el tiempo máximo de ejecución del trabajo. Si
el trabajo se excede de este tiempo, el manejador de recursos mata los
procesos en ejecución y cancela el trabajo. Este tiempo debería ser lo
más cercano posible al tiempo de ejecución real del trabajo. El formato
del campo es días-horas:minutos
.
#SBATCH --time=dd-hh:mm
Aceleradores (opcional)#
Algunos de los clusters disponen de aceleradores (GPUs) que se solicitan por nodo, y son visibles para todos los procesos corriendo dentro del mismo nodo. Para pedir G GPUs por nodo:
#SBATCH --gres=gpu:G
Reserva (opcional)#
Si tiene una reserva asignada, puede usarla con el siguiente línea:
#SBATCH --reservation=R
Job Array (opcional)#
Puede generar múltiples jobs casi idénticos usando Job Array.
Puede ser útil en las siguientes situaciones:
Ejecutar el mismo programa de análisis varias veces con diferentes archivos o conjuntos de datos.
Ejecutar el mismo programa con distintos argumentos.
Repetir varias veces la ejecución de un programa.
#SBATCH --array=1-3
Ejemplo de variables
Para cada job, se definen las siguientes variables:
# 1
SLURM_JOB_ID=36
SLURM_ARRAY_JOB_ID=36
SLURM_ARRAY_TASK_ID=1
SLURM_ARRAY_TASK_COUNT=3
SLURM_ARRAY_TASK_MAX=3
SLURM_ARRAY_TASK_MIN=1
# 2
SLURM_JOB_ID=37
SLURM_ARRAY_JOB_ID=36
SLURM_ARRAY_TASK_ID=2
SLURM_ARRAY_TASK_COUNT=3
SLURM_ARRAY_TASK_MAX=3
SLURM_ARRAY_TASK_MIN=1
# 3
SLURM_JOB_ID=38
SLURM_ARRAY_JOB_ID=36
SLURM_ARRAY_TASK_ID=3
SLURM_ARRAY_TASK_COUNT=3
SLURM_ARRAY_TASK_MAX=3
SLURM_ARRAY_TASK_MIN=1
Script#
Entorno#
Primero es necesario importar la configuración de las variables de entorno compartida por todos los usuarios:
. /etc/profile
Módulos#
Una vez cargado el entorno por defecto tenemos acceso al sistema de módulos, por lo que cargamos los requeridos por el programa a correr:
module load modulo/del/programa
Variables de entorno (opcional)#
Luego podemos configurar variables de entorno que afecten el funcionamiento de nuestro programa.
Un caso común es el de las aplicaciones OpenMP, que deben configurar la
variable OMP_NUM_THREADS
al mismo valor que fue dado en #SBATCH --cpus-per-task
.
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
Lanzamiento del programa#
Finalmente se lanza el programa. Para esto se debe utilizar
srun
, que suplanta la
funcionalidad de mpirun
o mpiexec
lanzando tantos procesos como sean
necesarios en los recursos asignados al trabajo.
srun programa