Cómo ejecutar un trabajo

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.