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