🦺 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.
$ sinfoscancel: 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:PD: Pendiente (PENDING)R: Ejecutandose (RUNNING)CG: Finalizando (COMPLETING)Para ver todos los estados posibles, ver la documentación de SLURM.
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.
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:
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:
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.
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:
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:
1#!/bin/bash
2#SBATCH --nodes=1
3#SBATCH --ntasks-per-node=32
4#SBATCH --cpus-per-task=1
Quantum Espresso#
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
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#
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} (...)
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} (...)
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
$ 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
$JOBIDdebe 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.