Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
s.l.u.r.m [2024/05/05 23:54] admin [3.2. Ejemplo básico 2 (single thread)] |
s.l.u.r.m [2024/09/16 17:58] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== 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 [[https://slurm.schedmd.com/man_index.html|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: | ||
+ | <code> | ||
+ | #!/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 | ||
+ | |||
+ | </code> | ||
+ | |||
+ | Para enviar este script a slurm, crear un job, y comenzar el procesamiento se requiere ejecutar el siguiente comando: | ||
+ | |||
+ | <code> | ||
+ | sbatch ejemplo1.sh | ||
+ | |||
+ | </code> | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | |||
+ | ===== 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. | ||
+ | <code> | ||
+ | #!/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 | ||
+ | |||
+ | </code> | ||
+ | |||
+ | Para enviar este script a slurm, crear un job, y comenzar el procesamiento se requiere lo siguiente: | ||
+ | |||
+ | <code> | ||
+ | sbatch ejemplo2.sh | ||
+ | |||
+ | </code> | ||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | ===== 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 [[https://slurm.schedmd.com/job_array.html|documentación oficial de slurm]] para ver todas las posibilidades ofrecidas en Array-Jobs. | ||
+ | <code> | ||
+ | |||
+ | #!/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 | ||
+ | |||
+ | </code> | ||
+ | |||
+ | Luego se ejecuta el siguiente comando para enviar el trabajo a la cola: | ||
+ | |||
+ | <code> | ||
+ | sbatch ejemplo3.sh | ||
+ | |||
+ | </code> | ||
+ | |||