This is an old revision of the document!
Slurm (Simple Linux Utility for Resource Management) es un sistema de gestión de recursos en clusters de computadoras. Nos permite asignar los recursos computacionales (núcleos, memoria, gpu, etc.) de una forma equitativa a medida de su disposición.
Nodos: Sistema multiprocesador perteneciente al cluster
Particiones: es un mecanismo de agrupar en forma lógica los nodos. Sin importar el número de nodos que se disponen se puede crear la cantidad de particiones que uno desee. Un nodo puede pertenecer a varias particiones. Cada partición tiene sus propios parámetros: tiempo límite de trabajo, usuarios permitidos, que nodos la componen, etc.
Trabajos: Un trabajo o job es la asignación de recursos a un usuario específico por una cantidad de tiempo determinada.
Tareas: Son el conjunto de programas (seriales o paralelas) que serán ejecutadas dentro de un trabajo.
Slurm proporciona una interfaz de usuario donde se pueden ejecutar comandos slurm desde el shell del sistema operativo.
El usuario envía los trabajos y Slurm se encarga de ubicarlo en la cola de espera. Si hay recursos pasa a ejecutar el trabajo.
En caso de estar ocupado el trabajo se ejecutará cuando estén disponibles los recursos.
En general, los pasos a seguir para ejecutar un trabajo son:
Envía el trabajo para ser ejecutado a Slurm. Si no posee recursos para el trabajo el shell queda esperando a que se desocupen. Si posee recursos ejecuta el programa y nos proporciona por la consola los resultados de la ejecución
Parámetros de srun
-n, --ntask: especifica la cantidad de tareas para correr. Por default 1 tarea por 1 CPU.
-j, --job-name: especifica el nombre de la tarea
-N, --nodes: especifica el mínimo de nodos que deben ser reservado para el trabajo
-p, --partition: especifica la partición donde el trabajo se va a ejecutar.
-v -vv -vvv : Aumenta el nivel de verbosidad.
-o <ArchivoSalida>: Redirecciona la salida al archivo especificado.
Ejecuta miPrograma en 2 tareas, cada una en diferentes CPUs
Ejecuta miPrograma en 6 tareas distribuida en dos nodos, en la partición debug.
SBATCH es la forma más adecuada de ejecutar un trabajo. Se utiliza un archivo script para la configuración de Slurm y del sistema operativo para ejecutar el trabajo.
Parámetros de sbatch
-n, --ntask: especifica la cantidad de tareas (procesos) para correr
-j, --job-name: especifica el nombre de la tarea
-N, --nodes: especifica el mínimo de nodos que deben ser reservado para el trabajo
-p, --partition: especifica la partición donde el trabajo se va a ejecutar.
--mail-user <email>--mail-type=ALL: Envía un mail notificando el cambio de estado en el trabajo
Ejecuta el script NombreScriptSlurm en 2 nodos y enviá mail por cambios de estados
Ejecuta el script NombreScriptSlurm en 3 nodos y como limite máximo de tiempo 1 hora .
Para más información ver la sección "Script de lanzamientos y comandos SBATCH".
Ejemplo de sinfo en el cluster Clemente
Información que brinda sinfo:
PARTIT: Nombre de la partición. El sufijo * indica que es la partición estándar.
AVAIL: Estado de la partición: UP es disponible y DOWN no disponible.
TIMELIMIT: Tiempo máximo de ejecución de un trabajo, en formato días-horas:minutos:segundos.
NODES: Cantidad de nodos.
STATE: Estados de los nodos en formato:
ALLOCATED: El nodo esta asignado a uno o más trabajos.NODELIST: Nombres de los nodos.
Ejemplo de squeue en el cluster Clemente
Información que brinda squeue:
PARTITION: El nombre de la partición en que esta asignado el trabajo.
JOBID:
PRIO: La prioridad del trabajo. Actualmente todos tienen la misma prioridad y se van asignando por orden de llegada.
NAME: Nombre del trabajo.
USER: El usuario que envío el trabajo.
TIME: El tiempo que lleva ejecutando en formato días-horas:minutos:segundos. Si su tiempo es 0:00:00 significa que esta esperando por recursos.
NO: La cantidad de nodos reservados para el trabajo.
CPU: La cantidad de cores totales que se reservo.
GRES: Los aceleradores que reservo.
NODELIST(REASON): Los nodos en los que está corriendo el trabajo, o la razón por la que no se está ejecutando todavía. Algunas razones comunes son:
Resources: No hay recursos libres en el cluster para ejecutarlo.
Priority: Hay trabajos con mayor prioridad esperando a ser ejecutados.
AssociationJobLimit: El usuario ya excede la cantidad de trabajos máxima en ejecución simultánea.
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.
Para mostrar la información de todos los nodos "scontrol show nodes".
Para mostrar la información de un nodo en particular scontrol show nodes <NombreNodo>
Ejemplo de scontrol show nodes <NombreNodo>
Explicación de scontrol show nodes
Resaltado en color rojo se puede observar los datos más importantes: la cantidad de núcleos del nodo, si posee GPU, el nombre del nodo y las particiones a la que pertenece
Por la complejidad de la configuración existen muchos casos donde el trabajo se realiza incorrectamente, para corroborar los parámetros del trabajo podemos utilizar el comando "scontrol show job <JOBID>".
Ejemplo de scontrol show job <JOBID>
Explicación de scontrol show job <JOBID>
En
En
En
En
En
En
Cancela el trabajo con el <JOBID>
Enviá la señal SIGTERM a las tareas 4 y 8 del trabajo 1111
Los comandos de slurm son necesarios para la iniciación y configuración de los cluster. Tienen una estructura definida donde deben cumplirse ciertas reglas:
Comandos shell UNIX (generalmente bash) y comandos que extienden el shell (por ejemplo Environment Module). Son tareas a ser ejecutadas en el momento de que corre el trabajo.
#!/bin/bash ### Las líneas #SBATCH configuran los recursos de la tarea ### (aunque parezcan estar comentadas) ### Nombre de la tarea #SBATCH --job-name=gpu_job ### Cola de trabajos a la cual enviar. #SBATCH --partition=gpu #SBATCH --gres=gpu:1 ### Procesos a largar. ### Por defecto, se usa un solo proceso para tareas GPU. #SBATCH --ntasks-per-node=1 ### Tiempo de ejecucion. Formato dias-horas:minutos. #SBATCH --time 7-0:00 ### Script que se ejecuta al arrancar el trabajo ### Cargar el entorno del usuario incluyendo la funcionalidad de modules ### No tocar . /etc/profile ### Cargar los módulos para la tarea # FALTA: Agregar los módulos necesarios module load cuda/6.5 ### Largar el programa # FALTA: Cambiar el nombre del programa srun NOMBRE_DEL_PROGRAMA
#!/bin/bash ### Las líneas #SBATCH configuran los recursos de la tarea ### (aunque parezcan estar comentadas) ### Nombre de la tarea #SBATCH --job-name=mpi_job ### Tiempo de ejecucion. Formato dias-horas:minutos. #SBATCH --time 2-0:00 ### Numero de procesos a ser lanzados. #SBATCH --ntasks=2 ### Nombre de partcion #SBATCH --partition=batch ### Script que se ejecuta al arrancar el trabajo ### Cargar el entorno del usuario incluyendo la funcionalidad de modules ### No tocar . /etc/profile ### Cargar los módulos para la tarea # FALTA: Agregar los módulos necesarios module load etc... ### Largar el programa con los cores detectados ### La cantidad de nodos y cores se detecta automáticamente # FALTA: Cambiar el nombre del programa srun NOMBRE_DEL_PROGRAMA
#!/bin/bash ### Las líneas #SBATCH configuran los recursos de la tarea ### (aunque parezcan estar comentadas) ### Nombre de la tarea #SBATCH --job-name=openmp_job ### Cola de trabajos a la cual enviar. #SBATCH --partition=batch ### Procesos a largar. ### Es OpenMP, o sea que un proceso en un nodo y muchos hilos. #SBATCH --ntasks=1 ### Hilos por proceso ### Poner el mismo valor acá que en OMP_NUM_THREADS/MKL_NUM_THREADS #SBATCH --cpus-per-task=16 ### Tiempo de ejecucion. Formato dias-horas:minutos. #SBATCH --time 2-0:00 ### Script que se ejecuta al arrancar el trabajo ### Cargar el entorno del usuario incluyendo la funcionalidad de modules ### No tocar . /etc/profile ### Configurar OpenMP/MKL/etc con la cantidad de cores detectada. export OMP_NUM_THREADS=16 export MKL_NUM_THREADS=16 ### Cargar los módulos para la tarea # FALTA: Agregar los módulos necesarios module load etc... ### Largar el programa # FALTA: Cambiar el nombre del programa srun NOMBRE_DEL_PROGRAMA
#!/bin/bash ### Las líneas #SBATCH configuran los recursos de la tarea ### (aunque parezcan estar comentadas) ### Nombre de la tarea #SBATCH --job-name=gpu_job ### Cola de trabajos a la cual enviar. #SBATCH --partition=gpu #SBATCH --gres=gpu:1 ### Procesos a largar. ### Por defecto, se usa un solo proceso para tareas GPU. #SBATCH --ntasks-per-node=1 ### Tiempo de ejecucion. Formato dias-horas:minutos. #SBATCH --time 3-0:00 ### Script que se ejecuta al arrancar el trabajo ### Cargar el entorno del usuario incluyendo la funcionalidad de modules ### No tocar . /etc/profile ### Cargar los módulos para la tarea # FALTA: Agregar los módulos necesarios module load gpu cuda/9.1.85 ### Largar el programa # FALTA: Cambiar el nombre del programa srun NOMBRE_DEL_PROGRAMA
#!/bin/bash ### Las líneas #SBATCH configuran los recursos de la tarea ### (aunque parezcan estar comentadas) ### Nombre de la tarea #SBATCH --job-name=mpi_job ### Tiempo de ejecucion. Formato dias-horas:minutos. #SBATCH --time 3-0:00 ### Numero de procesos a ser lanzados. #SBATCH --ntasks=2 ### Nombre de partcion #SBATCH --partition=batch ### Script que se ejecuta al arrancar el trabajo ### Cargar el entorno del usuario incluyendo la funcionalidad de modules ### No tocar . /etc/profile ### Cargar los módulos para la tarea # FALTA: Agregar los módulos necesarios module load clemente ... ### Largar el programa con los cores detectados ### La cantidad de nodos y cores se detecta automáticamente # FALTA: Cambiar el nombre del programa srun NOMBRE_DEL_PROGRAMA
#!/bin/bash ### Las líneas #SBATCH configuran los recursos de la tarea ### (aunque parezcan estar comentadas) ### Nombre de la tarea #SBATCH --job-name=openmp_job ### Cola de trabajos a la cual enviar. #SBATCH --partition=batch ### Procesos a largar. ### Es OpenMP, o sea que un proceso en un nodo y muchos hilos. #SBATCH --ntasks=1 ### Hilos por proceso ### Poner el mismo valor acá que en OMP_NUM_THREADS/MKL_NUM_THREADS #SBATCH --cpus-per-task=56 ### Tiempo de ejecucion. Formato dias-horas:minutos. #SBATCH --time 3-0:00 ### Script que se ejecuta al arrancar el trabajo ### Cargar el entorno del usuario incluyendo la funcionalidad de modules ### No tocar . /etc/profile ### Configurar OpenMP/MKL/etc con la cantidad de cores detectada. export OMP_NUM_THREADS=56 export MKL_NUM_THREADS=56 ### Cargar los módulos para la tarea # FALTA: Agregar los módulos necesarios module load clemente etc... ### Largar el programa # FALTA: Cambiar el nombre del programa srun NOMBRE_DEL_PROGRAMA
#!/bin/bash #### NOTA: ESTE SCRIPT ES VIEJO ### Las líneas #SBATCH configuran los recursos de la tarea ### (aunque parezcan estar comentadas) ### Nombre de la tarea #SBATCH --job-name=nombre ### Cantidad de nodos a usar #SBATCH --nodes=1 ### GPUs por nodo (menor o igual 2) ### OJO: Todos los procesos en un nodo ven ambas GPU con gpu:2! ### Llamar al programa con /opt/mendieta/bin/split_cpu.sh para dividirlas. #SBATCH --gres=gpu:1 ### Procesos por nodo #SBATCH --ntasks-per-node=1 ### Cores por proceso (OpenMP/Pthreads/etc) ### Recordar exportar OMP_NUM_THREADS/MKL_NUM_THREADS/etc con el mismo valor #SBATCH --cpus-per-task=1 export OMP_NUM_THREADS=1 ### Tiempo de ejecucion. Formato dias-horas:minutos. Maximo una semana. #SBATCH --time 7-0:00 ### Environment setup . /etc/profile ### Environment modules module load cuda/5.0 ### Ejecutar la tarea ### NOTA: srun configura MVAPICH2 y MPICH con lo puesto arriba, ### no hay que llamar a mpirun. srun algun_programa_gpu
#!/bin/bash ### Las líneas #SBATCH configuran los recursos de la tarea ### (aunque parezcan estar comentadas) ### Nombre de la tarea #SBATCH --job-name=programa_mpi ### Cola a usar (capacity, capability, gpu) #SBATCH --partition=capability ### Cantidad de nodos a usar #SBATCH --nodes=1 ### Cantidad de procesos a lanzar por nodo ### capacity=16, capability=18, gpu=20 #SBATCH --ntasks-per-node=18 ### Cores por proceso (para MPI+OpenMP) #SBATCH --cpus-per-task=1 export OMP_NUM_THREADS=1 export MKL_NUM_THREADS=1 ### GPUs por nodo ### capacity/capability=0, gpu=1 (K20X) o 2 (M2090) #SBATCH --gres=gpu:0 ### Tiempo de ejecucion. Formato dias-horas:minutos. Maximo una semana. #SBATCH --time 7-0:00 ### Script que se ejecuta al arrancar el trabajo ### Cargar el entorno del usuario incluyendo la funcionalidad de modules ### No tocar . /etc/profile ### Cargar los módulos para la tarea # FALTA: Agregar los módulos necesarios module load etcetera ### Largar el programa con los cores detectados ### La cantidad de nodos y cores se detecta automáticamente # FALTA: Cambiar el nombre del programa srun programa
#!/bin/bash ### Las líneas #SBATCH configuran los recursos de la tarea ### (aunque parezcan estar comentadas) ### Nombre de la tarea #SBATCH --job-name=programa_openmp ### Cola de trabajos a usar ### Es OpenMP, no podemos usar más de un nodo, así que capacity #SBATCH --partition=capacity ### Procesos a largar. ### Es OpenMP, o sea que un proceso en un nodo y muchos hilos. #SBATCH --ntasks=1 ### Hilos por proceso ### Poner el mismo valor acá que en OMP_NUM_THREADS/MKL_NUM_THREADS #SBATCH --cpus-per-task=16 ### GPUs (0 o 1) #SBATCH --gres=gpu:0 ### Tiempo de ejecucion. Formato dias-horas:minutos. Maximo una semana. ### Traten de acotarlo. #SBATCH --time 7-0:00 ### Script que se ejecuta al arrancar el trabajo ### Cargar el entorno del usuario incluyendo la funcionalidad de modules ### No tocar . /etc/profile ### Configurar OpenMP/MKL/etc con la cantidad de cores detectada. export OMP_NUM_THREADS=16 export MKL_NUM_THREADS=16 ### Cargar los módulos para la tarea # FALTA: Agregar los módulos necesarios module load etcetera ### Largar el programa # FALTA: Cambiar el nombre del programa srun programa
#!/bin/bash ### NOTA: ### GAMESS requiere un directorio ~/scr en el home del usuario para correr ### Cantidad de cores (menor o igual a 16) #SBATCH --ntasks=16 CORES=16 ### Nombre de la tarea #SBATCH --job-name=gamess ### Correr en un solo nodo hasta que veamos cómo hacer para lanzar en muchos #SBATCH --nodes=1 ### Cores por proceso (OpenMP/Pthreads/etc) ### GAMESS corre uno solo #SBATCH --cpus-per-task=1 export OMP_NUM_THREADS=1 export MKL_NUM_THREADS=1 ### Tiempo de ejecucion. Formato dias-horas:minutos. Maximo una semana. #SBATCH --time 1-0:00 ### Environment setup . /etc/profile ### Environment modules module load md/gamess/20130501 ### Ejecutar la tarea ### NOTA: srun configura MVAPICH2 y MPICH con lo puesto arriba, ### no hay que llamar a mpirun. rungms $1 00 ${CORES}
#!/bin/bash ### Las líneas #SBATCH configuran los recursos de la tarea ### (aunque parezcan estar comentadas) ### Usar cola gpu #SBATCH --partition=gpu ### Nombre de la tarea #SBATCH --job-name=gromacs ### Cantidad de nodos a usar #SBATCH --nodes=2 ### Procesos por nodo #SBATCH --ntasks-per-node=1 ### GPUs por nodo #SBATCH --gres=gpu:1 ### Cores por nodo #SBATCH --cpus-per-task=20 export OMP_NUM_THREADS=20 export MKL_NUM_THREADS=20 ### Tiempo de ejecucion. Formato dias-horas:minutos. Maximo una semana. #SBATCH --time 7-0:00 ### Environment setup . /etc/profile ### Environment modules module load md/gromacs/5.0.2 ### Largar el progrma en cuestion srun mdrun_mpi
#!/bin/bash ### Las líneas #SBATCH configuran los recursos de la tarea ### (aunque parezcan estar comentadas) ### Nombre de la tarea #SBATCH --job-name=lammps ### Cola a usar (capacity, capability, gpu) #SBATCH --partition=gpu ### Cantidad de nodos a usar #SBATCH --nodes=1 ### Cantidad de procesos a lanzar por nodo ### capacity=16, capability=18, gpu=20 #SBATCH --ntasks-per-node=20 ### Cores por proceso ### LAMMPS está compilado con OpenMP, probar combinaciones #SBATCH --cpus-per-task=1 export OMP_NUM_THREADS=1 export MKL_NUM_THREADS=1 ### GPUs por nodo ### capacity/capability=0, gpu=1 (K20X) o 2 (M2090) #SBATCH --constraint=kepler #SBATCH --gres=gpu:1 ### Tiempo de ejecucion. Formato dias-horas:minutos. Maximo una semana. #SBATCH --time 7-0:00 ### Script que se ejecuta al arrancar el trabajo ### Cargar el entorno del usuario incluyendo la funcionalidad de modules ### No tocar . /etc/profile ### Cargar los módulos para la tarea # FALTA: Agregar los módulos necesarios module load md/lammps/15may15 ### Largar el programa con los cores detectados ### La cantidad de nodos y cores se detecta automáticamente # FALTA: agregar parámetros srun lmp_mendieta (...)
#!/bin/bash ### Las líneas #SBATCH configuran los recursos de la tarea ### (aunque parezcan estar comentadas) ### Nombre de la tarea #SBATCH --job-name=test-phi-mpi ### Cola a usar #SBATCH --partition=phi ### No queremos compartir xeon phis, poca memoria #SBATCH --exclusive ### Usar un xeon phi de 57 cores #SBATCH --nodes=1 #SBATCH --ntasks-per-node=57 ### Cores por proceso (para MPI+OpenMP) #SBATCH --threads-per-core=4 ### Tiempo de ejecucion. Formato dias-horas:minutos. Maximo una semana. #SBATCH --time 7-0:00
CC=mpiicc CFLAGS=-Wall -Wextra -O2 -mmic -openmp -mkl=parallel TARGETS=proctest proctest: proctest.o $(CC) $(CFLAGS) -o $@ $< .PHONY: clean clean: rm -f *.o $(TARGETS)
#include <stdio.h> #include <omp.h> #include "mpi.h" int main(int argc, char ** argv) { MPI_Init(&argc, &argv); int commsize, commrank; MPI_Comm_size(MPI_COMM_WORLD, &commsize); MPI_Comm_rank(MPI_COMM_WORLD, &commrank); #pragma omp parallel { int omptid = omp_get_thread_num(); int ompthreads = omp_get_num_threads(); #pragma omp critical } MPI_Finalize(); return 0; }
#!/bin/bash ### Las líneas #SBATCH configuran los recursos de la tarea ### (aunque parezcan estar comentadas) ### Nombre de la tarea #SBATCH --job-name=test-phi-openmp ### Cola a usar #SBATCH --partition=phi ### No queremos compartir xeon phis, poca memoria #SBATCH --exclusive ### Un solo proceso para OpenMP #SBATCH --ntasks=1 ### Cores por proceso #SBATCH --cpus-per-task=57 #SBATCH --threads-per-core=4 ### Tiempo de ejecucion. Formato dias-horas:minutos. Maximo una semana. #SBATCH --time 7-0:00 ### Script que se ejecuta al arrancar el trabajo ### Cargar el entorno del usuario ### (en phi: MKL e Intel MPI) ### No tocar . /etc/profile ### No tenemos módulos en los xeon phi ### Hasta 4 hilos por core export OMP_NUM_THREADS=228 export MKL_NUM_THREADS=228 ### Largar el programa srun ./proctest
CC=icc CFLAGS=-Wall -Wextra -O2 -mmic -openmp -mkl=parallel TARGETS=proctest proctest: proctest.o $(CC) $(CFLAGS) -o $@ $< .PHONY: clean clean: rm -f *.o $(TARGETS)
#include <stdio.h> #include <omp.h> int main(int argc, char ** argv) { #pragma omp parallel { int omptid = omp_get_thread_num(); int ompthreads = omp_get_num_threads(); #pragma omp critical } return 0; }