Utilización de SLURM
SLURM Workload Manager o formalmente (Simple Linux Utility for Resource Management) es un sistema de gestión de trabajos en clústeres de código abierto, el cual es tolerante a fallas y altamente escalable para clústeres Linux grandes y pequeños.
Funciones principales
- Asigna a los usuarios acceso exclusivo y/o no exclusivo a recursos de cómputo por un tiempo determinado, permitiéndoles así ejecutar trabajos (jobs) asignados.
- Provee un marco para iniciar, ejecutar y monitorear tareas (normalmente tareas paralelas) en un conjunto de nodos asignados.
- Coordina la solicitud de recursos a través de una cola de trabajos pendientes.
¿Cómo se encarga Slurm de gestionar los trabajos?
- Ejecutando el trabajo
- Asignando recursos de cómputo solicitados por el trabajo
- Reportando la salida de su ejecución al usuario.
Pasos para ejecutar un trabajo
- Preparar un script (el formato del script se encuentra a continuación)
- Enviar trabajo para ejecución.
1. Comandos básicos de Slurm
A continuación se muestran los comandos básicos utilizados para realizar la mayoría de las operaciones básicas con SLURM:
Comando | Descripción |
---|---|
squeue | Ver estado de los trabajos en la cola |
sinfo | Ver información de los nodos de cómputo |
sbatch | Enviar un trabajo a través de un script, para su posterior ejecución |
srun | Ejecutar un trabajo interactivo |
scancel | Eliminar un trabajo |
2. Parámetros básicos de comandos
Existen páginas de manual para todos los comandos de Slurm, las cuales contienen información más detallada. El parámetro –help
además proporciona un breve resumen de las opciones de cada comando. A continuación se muestra el resumen de los parámetros que más se suelen utilizar en SLURM por cada comando básico:
2.1. Envío de Trabajo (srun y sbatch)
Comando SLURM | Descripción |
–mem-per-cpu=<megabytes> | Memoria requerida para el trabajo por CPU asignada (en MegaBytes). El valor predeterminado es 1024 MB. |
-n, –ntasks=<cantidad de tareas> | Número de tareas (procesos) que serán asignadas para el trabajo. |
-c, –cpus-per-task=<cpus> | Número de CPUs (hilos) requeridas por tarea. El valor especificado aquí es el número “mínimo” de CPU que se asignará a su trabajo. Si hay CPU adicionales disponibles en un nodo más allá de lo solicitado, su trabajo recibirá esas CPU hasta que otros trabajos las necesiten. El valor predeterminado es 1 CPU. Intentar usar más CPU de las que se le asignaron dará como resultado que sus procesos adicionales se turnen en la misma CPU (ralentizando su trabajo). |
-J <name>, –jobname=<name> | Especificar un nombre a tu trabajo |
-o <STDOUT_log>, –output=<STDOUT_log> | Archivo en el que se desea almacenar la salida del trabajo. Usted puede especificar %j como parte del nombre de archivo de registro para indicar la ID del trabajo (como ejemplo, “#SBATCH -o ouptut_%j.o” redirigiría la salida a “output_123456.o”). |
-e <STDERR_log>, –error=<STDERR_log> | Archivo en el que se desea almacenar mensajes de error de trabajo. Funciona exactamente igual que “-o”. |
-t, –time=<days-hours:minutes:seconds> (ej. –time=08:00:00) | Permite ajustar el límite de tiempo del trabajo |
–array=<índices> (ej. –array=1-80) | Envía una lista (arreglo) de trabajos idénticos. Solo aplica para sbatch. |
–export=<name[=value]> (ej. –export=ALL) | Exportar variables de entorno identificadas |
–nodes=<nodos> | Cantidad de nodos de cómputo a utilizar |
–account=<cuenta> (ej. –account=dsmith) | Asignar el nombre de cuenta para monitorear el trabajo |
2.2. Gestión de Trabajo
scancel
–name=<name> | Cancela trabajos con nombre especificado |
–user=<name> | Cancela trabajos del usuario especificado |
squeue
–jobs=<job_id_list> | Lista separada por comas de IDs de trabajo para mostrar |
–name=<name> | Permite ver sólo trabajos con nombres especificados |
–users=<names> | Permite ver sólo trabajos para usuarios especificados |
3.1. Ejemplo básico 1 (multi-thread con OpenMP)
Este es un ejemplo de un script (ejemplo1.sh) con los elementos mínimos para ejecutar el programa gromacs a través de slurm:
#!/bin/bash #SBATCH --job-name=ejemplo1-simulacion # Nombre de la simulación, reemplazar según sea el caso #SBATCH --nodes=2 # Número de nodos donde se enviará el trabajo, el clúster posee 3 nodos de cómputo #SBATCH --nodelist=n002,n003 # Nodos específicos seleccionados (n001: Lautaro , n002: Troquil , n003: Soroban) #SBATCH --tasks-per-node=10 # Número de tareas a ejecutar por cada nodo asignado, de forma simultánea #SBATCH --cpus-per-task=1 # Número de núcleos a utilizar por tarea asignada #SBATCH --export=ALL # Exporta todas las variables de entorno #SBATCH --time=01:00:00 # Establece el máximo tiempo de ejecución (HH:MM:SS) #SBATCH --mem=20G # Memoria reservada para la simulación (en este caso 4 GB) #Programas o módulos necesarios para ejecutar esta simulación module load gromacs/2024.1-fftw-3.3.10-openmpi-4.1.6 # Ejecutar la simulación con gmx_mpi mpirun gmx_mpi mdrun -deffnm my_input_file
Para enviar este script a slurm, crear un job, y comenzar el procesamiento se requiere ejecutar el siguiente comando:
sbatch ejemplo1.sh
3.2. Ejemplo básico 2 (single thread)
Este es un ejemplo de un script (ejemplo2.sh) con los elementos mínimos para ejecutar el programa python a través de slurm. Este ejemplo envía un trabajo de 1 hilo a slurm con los parámetros del script, y con limitaciones establecidas al usuario y la partición.
#!/bin/bash #SBATCH --job-name=ejemplo2-simulacion # Nombre de la simulación, reemplazar según sea el caso #SBATCH --nodes=1 # Número de nodos donde se enviará el trabajo, el clúster posee 3 nodos de cómputo #SBATCH --nodelist=n002 # Nodos específicos seleccionados (n001: Lautaro , n002: Troquil , n003: Soroban) #SBATCH --tasks-per-node=1 # Número de tareas a ejecutar por cada nodo asignado, de forma simultánea #SBATCH --cpus-per-task=1 # Número de núcleos a utilizar por tarea asignada #SBATCH --export=ALL # Exporta todas las variables de entorno #SBATCH --time=00:01:00 # Establece el máximo tiempo de ejecución (HH:MM:SS) #SBATCH --mem=10G # Memoria reservada para la simulación # A partir de aquí puede ejecutar cualquier simulación que requiera alto cómputo module load python/3.12.1 #Módulo necesario cargado previamente, necesario para la simulación python --version
Para enviar este script a slurm, crear un job, y comenzar el procesamiento se requiere lo siguiente:
sbatch ejemplo2.sh
3.3. Ejemplo básico 3 (Array Jobs)
Este ejemplo (ejemplo3.sh) muestra como enviar varias tareas utilizando la propiedad de array-jobs en slurm, para más detalles consultar documentación oficial de slurm para ver todas las posibilidades ofrecidas en Array-Jobs.
#!/bin/bash #SBATCH --job-name=ejemplo3-simulacion # Nombre de la simulación, reemplazar según sea el caso #SBATCH --nodes=1 # Número de nodos donde se enviará el trabajo, el clúster posee 3 nodos de cómputo #SBATCH --nodelist=n003 # Nodos específicos seleccionados (n001: Lautaro , n002: Troquil , n003: Soroban) #SBATCH --tasks-per-node=1 # Número de tareas a ejecutar por cada nodo asignado, de forma simultánea #SBATCH --cpus-per-task=1 # Número de núcleos a utilizar por tarea asignada #SBATCH --export=ALL # Exporta todas las variables de entorno #SBATCH --time=00:01:00 # Establece el máximo tiempo de ejecución (HH:MM:SS) #SBATCH --mem=4G # Memoria reservada para la simulación #SBATCH --array=1-40 # Número de tareas similares que se ejecutan como una matriz de trabajos # A partir de aquí puede ejecutar cualquier simulación que requiera alto cómputo module load python/3.12.1 #Módulo necesario cargado previamente, necesario para la simulación whoami hostname python --version
Luego se ejecuta el siguiente comando para enviar el trabajo a la cola:
sbatch ejemplo3.sh