SLURM

De usuarios.nlhpc.cl
Saltar a: navegación, buscar

SLURM es el gestor de colas instalado en muchos de los súper computadores del TOP500, y también en Leftraru. Si Ud. quiere lanzar tareas dentro de Leftaru, debe hacerlo a través de Slurm.

Este es un pequeño tutorial que esperamos sirva a los usuarios para entender el funcionamiento básico de Slurm.

Login y Transferencia de Archivos

Descripción de cómo iniciar la sesión utilizando la shell y transferencia segura de archivos hacia y desde el clúster.

Sólo los inicios de sesión mediante Secure Shell (ssh) están permitidos. La transferencia de archivos debe utilizar un protocolo seguro, como sftp.

Al clúster se puede acceder desde el dominio de red leftraru.nlhpc.cl en el puerto 22. Cabe destacar que Leftraru cuenta con cuatro nodos de login que están balanceados, por lo que es probable que no entre dos veces al mismo nodo.

Introducción a los comandos slurm

srun - ejecutar un comando en nodos de cómputo asignados
sbatch - presentar un script de trabajo
squeue - Mostrar estado de los trabajos en la cola
scancel - eliminar un trabajo
sinfo - Muestra el estado de los nodos de cómputo

Enviar un script

Particiones SLURM Leftraru

  • slims: 132 nodos livianos de 20 cores.
  • debug: 4 nodos destinados a pruebas de máximo 30 minutos.
  • general: 48 nodos de 44 cores c/u y 192GB de RAM.
  • largemem: 9 nodos de 44 cores c/u y 777GB de RAM.
  • gpus: 2 nodos de 4 cores c/u, 192GB de RAM y 4 GPUs Nvidia Tesla V100.
 #!/bin/bash
 #SBATCH --job-name=example
 #SBATCH --partition=slims
 #SBATCH -n 1
 #SBATCH --output=example_%j.out
 #SBATCH --error=example_%j.err
 #SBATCH --mail-user=user@gmail.com
 #SBATCH --mail-type=ALL
 
 ./program

Ejecución de una tarea que ocupa mucha RAM por CPU

Debemos tener en cuenta que la RAM que SLURM reserva por defecto son 1000 MB. Un típico error de cancelación de tarea por falta de memoria es el siguiente:

/tmp/slurmd/job136839939/slurm_script: line 15: 23547 Killed                  ./programa.sh
slurmstepd: error: Detected 1 oom-kill event(s) in step 136839939.batch cgroup. Some of your processes 
may have been killed by the cgroup out-of-memory handler.

Si su tarea ocupa más de la memoria por defecto, puede utilizar el siguiente parámetro:

#SBATCH --mem-per-cpu=2400 #Máxima RAM por CPU

Esto hará que SLURM reserve más RAM por CPU para sus tareas.

Tenga en cuenta que nuestros nodos tienen 48 GB de memoria RAM (Partición slims), 192 GB (Partición general) y 768 GB (Partición largemem) por nodo: http://usuarios.nlhpc.cl/index.php/Recursos_Computacionales_NLHPC

Otra forma de reservar memoria es utilizando el siguiente parámetro:

#SBATCH --mem=2400

En este caso SLURM realizará una reserva de memoria de 2400 MB pero por la totalidad del trabajo.

Los parámetros anteriores al igual que el número de CPUs que se van a usar, hay que afinarlos lo mejor posible. Para ello lo que se puede hacer es hacer pruebas en los nodos logins, sin lanzar en las colas, y así estudiar el uso de RAM y CPU por parte de sus procesos.

Ejecución de programas con MPI

El siguiente es un ejemplo de ejecución de un programa compilado con Open MPI:

 #!/bin/bash
 #SBATCH --job-name=example
 #SBATCH --partition=slims
 #SBATCH -n 120 # Debe de ser un número múltiplo de 20
 #SBATCH --ntasks-per-node=20 # Con esto se fuerza a que se lancen 20 tareas MPI en cada uno de los nodos, ocupando de este modo nodos completos. En este caso 6 nodos completos
 #SBATCH --output=example_%j.out
 #SBATCH --error=example_%j.err
 #SBATCH --mail-user=user@gmail.com
 #SBATCH --mail-type=ALL
 module load intel impi
 
 srun ./mpi_test

Para enviarlo al clúster dbe ejecutar el comando sbatch script.sh El ejemplo anterior ejecutará una tarea OpenMPI con 120 procesadores.

Ejecución de tareas en GPUs

El siguiente es un script de ejemplo para poder lanzar en la partición gpus:

#SBATCH --job-name=ejemplo
#SBATCH --partition=gpus
#SBATCH -n 1
#SBATCH --output=ejemplo_%j.out
#SBATCH --error=ejemplo_%j.err
#SBATCH --mail-user=correo@gmail.com
#SBATCH --mail-type=ALL
#SBATCH --mem-per-cpu=4365
#SBATCH --gres=gpu:1
 
./programa

El parámetro gpu:1 indica la cantidad de tarjetas a utilizar (cada nodo tiene 2 GPUs).

Para enviarlo al cluster debe ejecutar el comando sbatch script.sh

Comprobación del estado de tareas

squeue: Comprobar estados de los trabajos

Puede utilizar squeue para saber el estado de una o varias de sus tareas

 $ squeue -o "%.15i %.6P %.8j %.20S %.11M %.11L %.20V %.10Q %.4C %.2D %.6m" -S -t,-Q          JOBID PARTIT     NAME           START_TIME        TIME   TIME_LEFT          SUBMIT_TIME   PRIORITY CPUS NO MIN_ME
       10837561  slims TEST1     2018-06-18T18:51:01    19:00:31  2-04:59:29  2018-06-18T18:51:01     119972    1  1  1000M
       10838562  slims TEST2     2018-06-19T11:30:47     2:20:45  2-21:39:15  2018-06-19T11:30:46     119946    1  1  1000M

para mas opciones puede revisar con el comando man squeue las opciones restantes

scontrol show job

Para revisar el detalle de las opciones de un trabajo

$ scontrol show job 10837561 -ddJobId=10837561 JobName=TEST1
   UserId=usuario(1000) GroupId=group(1000) MCS_label=N/A
   Priority=1100 Nice=0 Account=account QOS=120
   JobState=RUNNING Reason=None Dependency=(null)
   Requeue=0 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
   DerivedExitCode=0:0
   RunTime=19:03:08 TimeLimit=3-00:00:00 TimeMin=N/A
   SubmitTime=2018-06-18T18:51:01 EligibleTime=2018-06-18T18:51:01
   StartTime=2018-06-18T18:51:01 EndTime=2018-06-21T18:51:01 Deadline=N/A
   PreemptTime=None SuspendTime=None SecsPreSuspend=0
   Partition=slims AllocNode:Sid=leftraru2:5471
   ReqNodeList=(null) ExcNodeList=(null)
   NodeList=cn021
   BatchHost=cn021
   NumNodes=1 NumCPUs=1 NumTasks=1 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
   TRES=cpu=1,mem=1000M,node=1
   Socks/Node=* NtasksPerN:B:S:C=1:0:*:* CoreSpec=*
     Nodes=cn021 CPU_IDs=1 Mem=1000 GRES_IDX=
   MinCPUsNode=1 MinMemoryCPU=1000M MinTmpDiskNode=0
   Features=(null) DelayBoot=00:00:00
   Gres=(null) Reservation=(null)
   OverSubscribe=OK Contiguous=0 Licenses=matlab Network=(null)
   Command=/home/usuario/script.sh
   WorkDir=/home/usuario/
   StdErr=/home/usuario/10837561_%x.err
   StdIn=/dev/null
   StdOut=/home/usuario/10837561_%x.out
   Power=
   BatchScript=
#!/bin/bash
#SBATCH --job-name=TEST1
#SBATCH --mail-user=usaurio@correo.cl
#SBATCH --mail-type=ALL
#SBATCH --output=%j_%x.out
#SBATCH --error=%j_%x.err
#SBATCH --partition=slims
#SBATCH -n 1
#SBATCH --ntasks-per-node=1
#SBATCH --license=matlab 
 
 
module load MATLAB/2017a
 
matlab -nodisplay -nosplash -nodesktop < programa.m

scancel: Cancelar un trabajo

Con scancel Ud. puede matar un proceso en ejecución


[prueba@leftraru1 ~]$ squeue -u prueba
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
             45594     slims     TEST   prueba  R       0:59     20 cn[001-020]
[prueba@leftraru1 ~]$ scancel 45594
[prueba@leftraru1 ~]$ squeue -u prueba
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
[prueba@leftraru1 ~]$

sinfo - Mostrar el estado de los nodos

[prueba@leftraru1 ~]$ sinfo 
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
slims*       up   infinite    128   idle cn[001-128]
fats         up   infinite      4   idle cnf[001-004]
mics         up   infinite     12   idle cnf001-mic[0-2],cnf002-mic[0-2],cnf003-mic[0-2],cnf004-mic[0-2]
all          up   infinite    132   idle cn[001-128],cnf[001-004]
debug        up       5:00      4   idle leftraru[1-4]

Para filtrar los nodos que tengan incidencias se añade la opción -R. Incluso muestra información adicional sobre el nodo afectado.

[prueba@leftraru1 ~]$ sinfo -R
REASON               USER      TIMESTAMP           NODELIST
Not responding       slurm     2016-04-06T13:17:56 cnf001-mic[0-2]
Node unexpectedly re slurm     2016-04-06T15:58:44 cnf003-mic0
Node unexpectedly re slurm     2016-04-06T15:58:49 cnf003-mic1
Node unexpectedly re slurm     2016-04-06T15:58:57 cnf003-mic2
Node unexpectedly re slurm     2016-04-06T17:00:10 leftraru2 

Otro Ejemplo, se muestra sólo una partición específica

[prueba@leftraru1 ~]$ sinfo -p slims
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
slims*       up   infinite    128   idle cn[001-128]
[prueba@leftraru1 ~]$

Prioridad de tarea

Cómo ver la prioridad del trabajo. Los factores que determinan la prioridad del trabajo, incluyendo la fórmula y pesos.

Factores que determinan prioridad de tarea

  • Edad - la cantidad de tiempo que el trabajo ha estado esperando en la cola
  • Tamaño de la tarea - número de nodos solicitados por el trabajo
  • Partición - prioridad para una partición determinada
  • Mientras más tareas se ejecuten en el cluster, menor será la prioridad.
  • Mientras menos tareas se ejecuten en el clúster, más alta es la prioridad.

Mostrar Fairshare

  • sshare <flag>
    • --accounts=group_name
    • --all --accounts=group_name #Muestra FairShare para los miembros del grupo

Job Arrays

Un Job Array es una colección de trabajos similares que requieren ser ejecutados sin necesidad de que el usuario lance "n" veces el mismo script.


Ejemplo de un Script Job Array

 #!/bin/bash
 #SBATCH --job-name=example
 #SBATCH --partition=slims
 #SBATCH -n 1
 #SBATCH --output=example-%A_%a.out
 #SBATCH --error=example-%A_%a.error
 #SBATCH --array=1-20  ## Se generan 20 jobs distintos
 #SBATCH --mail-user=user@gmail.com
 #SBATCH --mail-type=ALL
 
 ./my_script.sh $SLURM_ARRAY_TASK_ID  ## Esta variable tomará los valores definidos en el array

my_script.sh debe aceptar un parámetro numérico que traduzca a la entrada correspondiente para la instancia a evaluar

Enviar el script:

[prueba@leftraru1 ~]$ sbatch job_array.sh

Visualización de sus Tareas

Si Ud. necesita visualizar información acerca de sus tareas de forma interactiva, puede utilizar el comando smap:

smap -i 3
Smap.png

De esta forma, tendrá una actualización cada 3 segundos de sus tareas en ejecución incluyendo los nodos en los cuales se encuentran ejecutándose.

Bibliografía

Manual Oficial de Slurm