Cómo ejecutar un trabajo
- Gestor de recursos
- Especificación de un trabajo
- Script para la ejecución de un trabajo
- Control de la ejecución de un trabajo
- Scripts para la ejecución de trabajos paralelos
Gestor de recursos
Todos los trabajos del ClusterUY son manejados por SLURM. SLURM es el encargado de gestionar los recursos de cómputo y planificar la ejecución de trabajos. En esta página se muestra como lanzar diferentes tipos de trabajos utilizando SLURM mediante ejemplos.
Especificación de un trabajo
Antes de iniciar un trabajo en el ClusterUY es necesario determinar los recursos de cómputo que serán necesarios para su ejecución. Asegúrese de verificar los Recursos disponibles.
Los principales recusos que deben especificarse son:
- Tiempo total de ejecución del trabajo
- Cantidad de núcleos utilizados
- Cantidad de memoria utilizada
- Cantidad de GPUs requeridas
El trabajo se verá restringido por estos recursos. En ningún momento se le asignarán más núcleos, memoria o GPUs que las solicitadas. Recuerde que el tiempo de ejecución de un trabajo se verá afectado si se solicitan menos núcleos o menos memoria de la que el trabajo realmente requiere. Notar que un trabajo nunca será cancelado por falta de núcleos o de memoria, sin embargo sí será cancelado en caso de excederse en su tiempo de ejecución. Por esta razón se recomienda sobre estimar el tiempo de ejecución en aproximadamente un 15%.
También es necesario especificar en que partición del cluster se ejecutará el trabajo. Estas particiones agrupan trabajos con características similares y les imponen diferentes limites. Las particiones públicas disponibles son:
-
normal: Permite ejecutar un trabajo por un tiempo máximo de ejecución de 5 días.
-
besteffort: Más memoria y núcleos disponibles que normal, y también permite la ejecución de trabajos por un tiempo máximo de 5 días. Estos trabajos tienen la característica de que pueden ser detenidos y pospuestos por otros trabajos. Por esta razón es altamente recomendado realizar algún tipo de guardado intermedio del cómputo realizado de forma periódica, ya sea manualmente o utilizando alguna herramienta,. Más detalle sobre el uso de esta partición en trabajos besteffort.
Especificación de las particiones públicas:
| Nombre | # Núcleos disponibles | Max. tiempo | Max. trabajos |
|---|---|---|---|
| normal | 560 | 5 días | 30 |
| besteffort | 1120 | 5 días | 80 |
Particiones reservadas:
- antel: Tiempo máximo de ejecución de 5 días - reservada para usuarios de Antel.
- ute: Tiempo máximo de ejecución de 5 días - reservada para usuarios de UTE.
En SLURM, una QoS (Quality of Service) es un conjunto de reglas que se utilizan para definir cómo se asignan los recursos y se priorizan los trabajos en un clúster. En el caso de ClusterUY, las QoS disponibles limitan los recursos disponibles a utilizar por cada trabajo, ya sea en mínimo y/o máximo.
Es necesario seleccionar la QoS en el archivo sbatch o al solicitar un trabajo interactivo de acuerdo a sus necesidades:
| qos | Max. recursos | Min. recursos | Partición compatible |
|---|---|---|---|
| gpu | 80 núcleos, 384 GB RAM, 4 GPU | 1 GPU | normal |
| rapida | 8 núcleos, 16GB RAM | - | normal |
| normal | 80 núcleos, 384 GB RAM, 0 GPU | - | normal |
| manycore | - | 30 núcleos | normal |
| besteffort | 120 núcleos, 768 GB RAM | - | besteffort |
| besteffort_gpu | 120 núcleos, 768 GB RAM, 8 GPU | - | besteffort |
| bigmem | 40 núcleos, 512 GB RAM | 128 GB | besteffort |
Nota: Las particiones gpu y besteffort_gpu tienen un tiempo máximo de ejecución de 3 días por trabajo. La cantidad máxima de GPUs P100 que se pueden utilizar a la vez es de 6.
Script para la ejecución de un trabajo
Comúnmente los trabajos que se ejecutan en el cluster son de largo aliento y por lo tanto son ejecutados fuera de línea. Esto permite al usuario desconectarse del cluster y recibir una notificación cuando su trabajo termina su ejecución. La ejecución de este tipo de trabajos es iniciada con el comando sbatch. Este comando recibe como argumento un script que contiene la especificación del trabajo a ejecutar y los comandos necesarios para su ejecución. La especificación del trabajo se realiza mediante comentarios speciales que comienzan con #SBATCH. Por ejemplo, para especificar un trabajo de nombre mitrabajo que requiere un único CPU, 2 GB de memoria RAM, 6 horas de tiempo de cómputo y 9 GB de espacio de /scratch se deberá indicar:
#!/bin/bash
#SBATCH --job-name=mitrabajo
#SBATCH --ntasks=1
#SBATCH --mem=2048
#SBATCH --time=6:00:00
#SBATCH --tmp=9G
#SBATCH --partition=normal
#SBATCH --qos=normal
#SBATCH --mail-type=ALL
#SBATCH --mail-user=mi@correo
source /etc/profile.d/modules.sh
cd ~/miaplicacion
./mibinario arg1 arg2
El trabajo es cargado en el sistema con el comando sbatch miscript.sh. Se le asignará un idéntificador único (ID) y quedará en espera hasta que se encuentren disponibles los recursos de cómputo necesarios para su ejecución. Una vez disponibles, el sistema asigna los recursos al trabajo y lanza su ejecución ejecutando secuencialmente el contenido del script de especificación. El usuario será notificado de la finalización del trabajo vía e-mail a mi@correo, si fue especificado. Más opciones en man sbatch.
Una vez finalizada su ejecución, SLURM dejará disponibles el archivo slurm-<ID>.out con el contenido de la salida a pantalla de la ejecución donde <ID> es el ID asignado al trabajo. Este archivo incluye la salida estándar y la salida de error.
Control de la ejecución de un trabajo
Para ver un listado de todos los trabajos en el sistema:
$ squeue
Para ver un listado de los trabajos del usuario <usuario>:
$ squeue -u <usuario>
Más opciones en man squeue.
Para obtener información detallada del trabajo <ID>:
$ scontrol show job <ID>
Más opciones en man scontrol.
Para cancelar la ejecución del trabajo <ID>:
scancel <ID>
Más opciones en man scancel.
Scripts para la ejecución de trabajos paralelos
A continuación se presentan ejemplos de trabajos multihilados, trabajos distribuidos utilizando MPI y trabajos paralelos en GPU.
Trabajo multihilado
Este script solicita la asignación de 4 CPUs y 2 GB de RAM en un único servidor:
#!/bin/bash
#SBATCH --job-name=mitrabajo
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4
#SBATCH --mem=2048
#SBATCH --time=8:00:00
#SBATCH --tmp=9G
#SBATCH --partition=normal
#SBATCH --qos=normal
#SBATCH --mail-type=ALL
#SBATCH --mail-user=mi@correo
source /etc/profile.d/modules.sh
cd ~/miaplicacion
./mibinario arg1 arg2
Trabajo MPI
Ejemplo 1: Script para solicitar la asignación de 8 CPUs que podrían estar en diferentes servidores y 1 GB de RAM para cada CPU.
#!/bin/bash
#SBATCH --job-name=mitrabajo
#SBATCH --ntasks=8
#SBATCH --mem-per-cpu=1024
#SBATCH --time=4:00:00
#SBATCH --tmp=9G
#SBATCH --partition=normal
#SBATCH --qos=normal
#SBATCH --mail-type=ALL
#SBATCH --mail-user=mi@correo
source /etc/profile.d/modules.sh
module load mpi/mpich-3.2-x86_64
cd ~/miaplicacion
mpirun ./mibinario arg1 arg2
Ejemplo 2: Script para ejecutar un trabajo MPI de 8 procesos con todos sus procesos en un único nodo de cómputo.
#!/bin/bash
#SBATCH --job-name=mitrabajo
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=8
#SBATCH --mem-per-cpu=1024
#SBATCH --time=4:00:00
#SBATCH --tmp=9G
#SBATCH --partition=normal
#SBATCH --qos=normal
#SBATCH --mail-type=ALL
#SBATCH --mail-user=mi@correo
source /etc/profile.d/modules.sh
module load mpi/mpich-3.2-x86_64
cd ~/miaplicacion
mpirun ./mibinario arg1 arg2
Trabajo normal con GPU
Importante: Si se va a leer o escribir a una gran cantidad de archivos pequeños en HOME, leer Ejecución de trabajos con CUDA que usen muchos archivos en HOME.
En ClusterUY hay dos tipos de GPUs NVIDIA instaladas:
28 - Tesla P100 12Gb (P100-PCIE-12GB) (p100)
2 - Ampere A100 40Gb (NVIDIA A100-PCIE-40GB) (a100)
Este script solicita la asignación de un único CPU, 512 MB de RAM y una GPU (Nota: Debe utilizarse partition normal y seleccionar qos = gpu):
#!/bin/bash
#SBATCH --job-name=mitrabajo
#SBATCH --ntasks=1
#SBATCH --mem=512
#SBATCH --time=12:00:00
#SBATCH --mail-type=ALL
#SBATCH --mail-user=mi@correo
# de acuerdo a lo que quiera ejecutar puede elegir entre las siguientes líneas.
#SBATCH --gres=gpu:1 # se solicita una gpu cualquiera( va a tomar la primera que quede disponible indistintamente si es una p100 o una a100)
#SBATCH --gres=gpu:p100:1 # se solicita una nvidia p100
#SBATCH --gres=gpu:a100:1 # se solicita una nvidia a100, tenga en cuenta que solamente hay 2 a100 disponibles en toda la infraestructura y están ubicadas en servidores diferentes (node15 y node16)
#SBATCH --gres=gpu:a40:1 # se solicita una nvidia a40. hay disponibles dos servidores (node40 y node46) con dos a40 cada uno
#SBATCH --partition=normal
#SBATCH --qos=gpu
source /etc/profile.d/modules.sh
cd ~/miaplicacion
./mibinario arg1 arg2
Hay que tener en cuenta que es obligatorio indicar la QoS (Quality Of Service) para que sea posible ejecutar en la partición gpu. Además, en caso de no solicitar la asignación de al menos una GPU, el trabajo quedaria en la cola de espera indefinidamente.
Trabajo besteffort con GPU
Importante: Si se va a leer o escribir a una gran cantidad de archivos pequeños en HOME, leer Ejecución de trabajos con CUDA que usen muchos archivos en HOME.
En este script de ejemplo se solicita la asignación de un único CPU, 512 MB de RAM y una GPU (#SBATCH --gres=gpu:1, debe utilizarse partition besteffort y seleccionar qos = besteffort_gpu):
#!/bin/bash
#SBATCH --job-name=mitrabajo
#SBATCH --ntasks=1
#SBATCH --mem=512
#SBATCH --time=12:00:00
#SBATCH --mail-type=ALL
#SBATCH --mail-user=mi@correo
# de acuerdo a lo que quiera ejecutar puede elegir entre las siguientes líneas.
#SBATCH --gres=gpu:1 # se solicita una gpu cualquiera( va a tomar la primera que quede disponible indistintamente si es una p100 o una a100)
#SBATCH --gres=gpu:p100:1 # se solicita una nvidia p100
#SBATCH --gres=gpu:a100:1 # se solicita una nvidia a100, tenga en cuenta que solamente hay 2 a100 disponibles en toda la ifraestructura y están ubicadas en servidores diferentes (node15 y node16)
#SBATCH --gres=gpu:a40:1 # se solicita una nvidia a40. hay disponibles dos servidores (node40 y node46) con dos a40 cada uno
#SBATCH --partition=besteffort
#SBATCH --qos=besteffort
cd ~/miaplicacion
./mibinario arg1 arg2
Recomendamos la utilización de besteffort sobre la utilización regular de GPU si se van a ejecutar trabajos que lleven poco tiempo ya que si son trabajos extensos pueden ser reencolados.
Recordamos que se pueden asignar hasta tres gpus (p100) por job con--gres=gpu:3(sujeto a disponibilidad de nodos, ver recursos disponibles).
Trabajo interactivo
Un trabajo interactivo permite conectarse directamente a un nodo de cómputo y trabajar con una consola. Para inciar un trabajo de este tipo hay dos opciones:
Uso del comando interactivo
- Para solicitar un trabajo interactivo en la partición besteffort :
interactivo -g - Para solicitar un trabajo interactivo en la partición normal :
interactivo -gn
Para más información ejecutar interactivo -h.
Los trabajos de este comando se lanzan con un tiempo máximo de 30 minutos.
Especificación manual
Para solicitar trabajos interactivos de mayor duración, o que utilicen una cantidad específica de recursos, se utiliza el comando srun con la directiva --pty bash -l. Por ejemplo:
srun --job-name=mitrabajo --time=01:20:00 --partition=besteffort --qos=besteffort --ntasks=1 --mem=512 --pty bash -l
Con este comando, se va a asignar una sesión en la partición besteffort, con 512 MB de RAM, por 1 hora y 20 minutos.
También es posible, mediante la solicitud de un trabajo interactivo, conectarse a otro trabajo en ejecución sustituyendo $SLURM_JOBID por el JOBID del trabajo que está siendo ejecutado:
srun --jobid=$SLURM_JOBID --pty bash -l
Trabajo interactivo con GPU
Importante: Si se va a leer o escribir a una gran cantidad de archivos pequeños en HOME, leer Ejecución de trabajos con CUDA que usen muchos archivos en HOME.
Con el comando interactivo
- Para solicitar un trabajo interactivo con una GPU en la partición besteffort :
interactivo -gpu - Para solicitar un trabajo interactivo con una GPU en la partición normal :
interactivo -gpun - Para solicitar un trabajo interactivo con una GPU A100 en la partición besteffort :
interactivo -gpua100
Recuerde que la asignación de recursos en la partición normal puede demorar más que en la partición besteffort.
Especificación manual
Un trabajo interactivo permite conectarse directamente a un nodo de cómputo y trabajar con una consola. Para inciar un trabajo como este es necesario usar el comando srun con la directiva --pty bash -l. Por ejemplo:
srun --job-name=mitrabajo --time=00:20:00 --partition=besteffort --qos=besteffort --ntasks=1 --mem=512 --gres=gpu:1 --pty bash -l
Con este comando, se va a asignar una sesión en la partición besteffort (baja prioridad) y con una gpu cualquiera.
Al igual que en un trabajo sbatch, puede ser seleccionada la gpu, siempre sujetas a disponibilidad:
--gres=gpu:1 – se solicita una gpu cualquiera. Va a tomar la primera que quede disponible, indistintamente si es una P100 o una A100.
--gres=gpu:p100:1 – se solicita una NVIDIA p100.
--gres=gpu:a100:1 – se solicita una NVIDIA A100. Tenga en cuenta que solamente hay dos A100 disponibles en toda la infraestructura, y están ubicadas en servidores diferentes, node15 y node16.
También puede ser seleccionada otra partición/qos por ejemplo:
--partition=normal --qos=gpu
Trabajo besteffort
Un trabajo de tipo besteffort tiene la particularidad de que sus recursos pueden ser expropiados por otro trabajo y su ejecución puede ser pospuesta. Por esta razón es altamente recomendable realizar algún tipo de guardado intermedio del cómputo de forma periódica, ya sea manualmente o utilizando alguna herramienta,.
Un trabajo besteffort puede ser de cualquier tipo (secuencial, multihilado, MPI o GPU). Se debe asegurar de especificar dos directivas: --partition=besteffort y --qos=besteffort. Por ejemplo:
#!/bin/bash
#SBATCH --job-name=mitrabajo
#SBATCH --ntasks=1
#SBATCH --mem=2048
#SBATCH --time=4:00:00
#SBATCH --tmp=9G
#SBATCH --partition=besteffort
#SBATCH --qos=besteffort
#SBATCH --mail-type=ALL
#SBATCH --mail-user=mi@correo
source /etc/profile.d/modules.sh
cd ~/miaplicacion
./mibinario arg1 arg2
Ejecución de trabajos con CUDA que usen muchos archivos en HOME
Cuando un trabajo que ejecuta con CUDA utiliza una gran cantidad de archivos (por ejemplo, de tamaño pequeño) ubicados en el directorio home del usuario, puede ocurrir que ese proceso no responda y no haya forma de finalizarlo. Para evitar este problema, es necesario utilizar el almacenamiento de alta velocidad ubicado en /scratch/<nombre_de_usuario para estos archivos (ver Uso del espacio temporal de alta velocidad).
Actualmente estamos trabajando para solucionar este inconveniente, pero mientras tanto de esta manera se puede evitar.
Uso de software licenciado
Para la utilizacion de software licenciado es necesario solicitar al gestor de licencias las mismas, con la directiva --licenses. De esta manera el trabajo iniciará su ejecución solo cuando existan licencias disponibles.
Por ejemplo, para ejecutar un trabajo que utiliza una (1) licencia de Matlab:
#!/bin/bash
#SBATCH --job-name=mitrabajo
#SBATCH --partition=normal
#SBATCH --ntasks=1
#SBATCH --time=12:00:00
#SBATCH --licenses=matlab:1
source /etc/profile.d/modules.sh
/clusteruy/apps/matlab/R2018b/bin/matlab
Tenga en cuenta que, dependiendo del software utilizado, quizás se deba solicitar una licencia por cada proceso que lo ejecute.
Ver listado completo de las licencias disponibles aqui.