🦺 Ejecución de trabajos#

Para ejecutar programas se usa SLURM, que es un sistema de gestión de trabajos utilizado en clusters para distribuir y gestionar tareas de manera eficiente.

Para correr un trabajo, se necesita crear un script de lanzamiento que describa los recursos requeridos por el trabajo y las tareas que realiza. Más abajo encontrará ejemplos de scripts.

Comandos básicos#

  • sbatch: Para encolar un trabajo cuyo submit script es job.sh, luego de encolar el trabajo le devolverá un número que lo identifica.

    $ sbatch job.sh
    Submitted batch job 1234
    
  • squeue: Muestra la cola de trabajos pendientes o en ejecución.

    $ squeue --me
    
  • sinfo: Proporciona información sobre el estado de los nodos en el cluster.

    $ sinfo
    
  • scancel: Para eliminar un trabajo de la cola o cancelar su ejecución, usando el identificador del trabajo.

    $ scancel 1234
    

Ver trabajos encolados#

Para ver todos los trabajos pendientes y en ejecución, utilice squeue:

$ squeue
JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
55060     multi   script    alice PD       0:00      4 (Resources)
55079     multi   script    alice PD       0:00      1 (Priority)
55081     multi   script      bob PD       0:00      1 (AssocMaxJobsLimit)
55008     short   script      bob PD       0:00      1 (Dependency)
54915     multi   script    alice  R    1:27:18      4 rome[09,14,16,33]
55007     short   script      bob  R      30:58      1 rome05

Explicación:

  • JOBID: El identificador.

  • PARTITION: La partición en la que está.

  • NAME: El nombre.

  • USER: El usuario que lo encoló.

  • ST: El estado, algunos estados comunes son:

  • TIME: El tiempo que lleva ejecutando.

  • NODES: La cantidad de nodos que se solicitaron.

  • NODELIST(REASON): Los nodos en los que está corriendo el trabajo, o la razón por la que todavía no se está ejecutando. Algunas razones comunes son:

    • (Resources): No hay recursos libres en el cluster para ejecutarlo.

    • (Priority): Hay trabajos con mayor prioridad esperando a ser ejecutados.

    • (AssocMaxJobsLimit): El usuario excede la cantidad de trabajos máxima en ejecución simultánea.

    • (Dependency): El trabajo tiene dependencia sobre otro trabajo que aún no finalizó.

    • (JobHeldUser): El usuario ha suspendido el trabajo.

    • (JobHeldAdmin): Un administrador ha suspendido el trabajo.

    • (launch failed requeued held): SLURM encontró un error al iniciar el trabajo y lo ha suspendido.

    • (Nodes required for job are DOWN, DRAINED or reserved): Si alguno de los nodos que están down se levanta este job lo ocuparía.

    • Para ver la lista completa, ver la documentación de SLURM.

Ejemplos#

Hola Mundos#

A continuación unos ejemplos básicos para probar y usar de base, pero asegúrese de terminar de configurar el resto de parametros:

El script más simple posible: Corre en un sólo nodo, lanza una sola task, que usa un sólo core e imprime el nombre del nodo. Funciona en cualquiera de los clusters.

job.sh#
1#!/bin/bash
2#SBATCH --nodes=1
3#SBATCH --ntasks-per-node=1
4
5srun bash -c 'echo "Hola, me ejecuté en el nodo $SLURMD_NODENAME"'

Tarea

Pruebe cambiar #SBATCH --nodes=1 por #SBATCH --nodes=2.

Acá vamos a pedir y aprovechar un 1 nodo completo de Serafín.

El siguiente script representa nuestro programa:

hello.sh#
1#!/bin/bash
2
3echo $(date): En el nodo $SLURMD_NODENAME soy la task $SLURM_PROCID
4sleep 5 # "calculos"
5echo $(date): task $SLURM_PROCID terminó

Este es el script de lanzamiento para sbatch:

job.sh#
1#!/bin/bash
2#SBATCH --nodes=1
3#SBATCH --ntasks-per-node=64
4#SBATCH --partition=short
5
6srun hello.sh

Correrlo de la siguiente manera:

$ chmod +x hello.sh # solo una vez
$ sbatch job.sh

Tarea

Debe revisar los logs y ponga atención a los tiempos entre los dos echos.

Pruebe cambiar #SBATCH --nodes=1 por #SBATCH --nodes=2.

Pedir una GPU en Mendieta.

job.sh#
1#!/bin/bash
2#SBATCH --nodes=1
3#SBATCH --ntasks=1
4#SBATCH --partition=short
5#SBATCH --gres=gpu:1
6
7echo En el nodo $(hostname) tengo acceso a las siguientes GPUs:
8nvidia-smi -L

Preámbulo para 2 nodos completos:

job.sh#
1#!/bin/bash
2#SBATCH --nodes=2
3#SBATCH --ntasks-per-node=64
4#SBATCH --cpus-per-task=4

Preámbulo para 1 nodo completo:

job.sh#
1#!/bin/bash
2#SBATCH --nodes=1
3#SBATCH --ntasks-per-node=32
4#SBATCH --cpus-per-task=1

Quantum Espresso#

job.sh#
 1#!/bin/bash
 2#SBATCH --job-name=espresso
 3#SBATCH --partition=multi
 4#SBATCH --nodes=1
 5#SBATCH --ntasks-per-node=64
 6#SBATCH --cpus-per-task=1
 7
 8# Cargar el entorno del usuario incluyendo la funcionalidad de modules
 9# No tocar
10. /etc/profile
11
12# Configurar OpenMP y otras bibliotecas que usan threads
13# usando los valores especificados arriba
14export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
15export MKL_NUM_THREADS=$SLURM_CPUS_PER_TASK
16
17# Cargar los módulos para la tarea
18module load quantum-espresso/7.2
19
20# Lanzar el programa
21srun pw.x -nk 1 -inp input > output
job.sh#
 1#!/bin/bash
 2#SBATCH --job-name=espresso
 3#SBATCH --partition=multi
 4#SBATCH --nodes=1
 5#SBATCH --ntasks-per-node=64
 6#SBATCH --cpus-per-task=1
 7
 8. /etc/profile
 9
10# Configurar OpenMP y otras bibliotecas que usan threads
11# usando los valores especificados arriba
12export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
13export MKL_NUM_THREADS=$SLURM_CPUS_PER_TASK
14
15# Cargar los módulos para la tarea
16module load quantum-espresso/7.1
17
18# Lanzar el programa
19srun pw.x -nk 1 -inp input > output

GROMACS#

job.sh#
 1#!/bin/bash
 2#SBATCH --job-name=gmx
 3#SBATCH --nodes=1
 4#SBATCH --ntasks=1
 5#SBATCH --cpus-per-task=64
 6#SBATCH --partition=multi
 7
 8. /etc/profile
 9module load gromacs
10srun gmx_mpi mdrun -ntomp ${SLURM_CPUS_PER_TASK} (...)
job.sh#
 1#!/bin/bash
 2#SBATCH --job-name=gmx
 3#SBATCH --nodes=1
 4#SBATCH --ntasks=1
 5#SBATCH --cpus-per-task=10
 6#SBATCH --gpus-per-task=1
 7#SBATCH --partition=multi
 8#SBATCH --gres=gpu:1
 9
10. /etc/profile
11module load gromacs
12srun gmx_mpi mdrun -nb gpu -pme gpu -bonded gpu -update gpu -ntomp ${SLURM_CPUS_PER_TASK} (...)
job.sh#
 1#!/bin/bash
 2#SBATCH --job-name=gmx
 3#SBATCH --nodes=1
 4#SBATCH --ntasks=1
 5#SBATCH --cpus-per-task=64
 6#SBATCH --partition=multi
 7
 8. /etc/profile
 9module load gromacs
10srun gmx_mpi mdrun -ntomp ${SLURM_CPUS_PER_TASK} (...)

Sesión interactiva#

Se puede reservar un nodo y ejecutar comandos interactivamente

$ srun --pty bash
Sólo en Mendieta!#
$ srun --gres=gpu:1 --pty bash

Otros comandos útiles#

  • Validar un script sin ejecutarlo

    $ sbatch --test-only script.sh
    

    Este comando verifica si el script es válido y estima cuándo podría ejecutarse según los recursos solicitados, pero no lo pone en la cola.

  • Historial de trabajos del último mes

    $ sacct -X -S now-4weeks
    

    Muestra información detallada sobre trabajos pasados o en ejecución.

  • Consultar el uso de recursos

    $ sreport cluster AccountUtilizationByUser -t hours users=$USER start=2025-01-01 end=2026-01-01
    
  • Consultar información de un job

    $ scontrol show job $JOBID
    

    Donde la variable $JOBID debe ser reemplazada por el número del job.

    Con este comando es posible verificar que SLURM haya encolado el trabajo de acuerdo a lo solicitado en el preámbulo.