🚀 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.

Partición#

Los distintos recursos de cómputo de los clusters son accesibles a través de particiones 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 particiones disponibles y sus límites dependen de cada cluster.

Para seleccionar la partición 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 a mpirun o mpiexec.

  • 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
    

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

Hilos (cpus, opcional)#

Cada proceso del trabajo puede dividirse en más de un hilo de ejecución.

A cada hilo 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. Ver Variables de entorno.

Memoria (opcional)#

Por defecto, no hay límite en la cantidad de memoria (RAM) reservada. En general no hace falta especificarla.

Sólo para casos particulares, puede ser necesario pedir explícitamente toda la memoria disponible:

#SBATCH --mem=0

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 X GPUs por nodo:

#SBATCH --gres=gpu:X

Reserva (opcional)#

Si tiene una reserva asignada, puede usarla con el siguiente línea:

#SBATCH --reservation=nombre

Job Array (opcional)#

Puede generar múltiples jobs casi idénticos usando Job Array.

Puede ser útil en las siguientes situaciones:

  1. Ejecutar el mismo programa de análisis varias veces con diferentes archivos o conjuntos de datos.

  2. Ejecutar el mismo programa con distintos argumentos.

  3. 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 reemplaza la funcionalidad de mpirun o mpiexec lanzando tantos procesos como sean necesarios en los recursos asignados al trabajo.

srun programa