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. Además, se cuenta con un generador de scripts que facilita la creación de los scripts necesarios para lanzar trabajos en el ClusterUY.

Recursos disponibles

El ClusterUY cuenta con un total de 28 servidores con las siguientes características:

Nombre Procesadores # Núcleos # Hilos de núcleo Mem. GPU Disco
node[01-28] Xeon Gold 6138 40 80 128 GB NVIDIA P100 300 GB SSD
  • Todos los servidores cuentan con Linux CentOS 7.
  • Los procesadores soportan hypertheading, por lo que para trabajos multihilados fuertemente orientados a cómputo es recomendable utilizar un único hilo de núcleo por hilo de ejecución (ver trabajos multihilados).
  • La cantidad máxima memoria utilizable por un trabajo es 128436 KB (~125 GB).
  • El espacio de almacenamiento SSD de alta velocidad se encuentra disponible en /scratch. Ver la sección de consejos y buenas prácticas.

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. 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. Claramente 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 si 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 determinar 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 10 días.
  • rapida: Permite la ejecución de trabajos de rápidos con un límite de 4 núcleos, 1 GB de memoria y hasta 1 hora de tiempo ejecución. Estos trabajos tienen mayor prioridad que los trabajos de la partición normal.
  • besteffort: Permite la ejecución de trabajos por un tiempo máximo de 12 horas. Estos trabajos tienen la característica de que pueden ser detenidos y pospuestos por otros trabajo. Por esta razón es altamente recomendable 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 Otros límites
normal 160 10 días 60 80 trabajos independientes del estado
rapida 560 1 hora 10 4 núcleos, 1 GB RAM
besteffort 1120 5 días 400  

Particiones reservadas:

  • antel: Tiempo máximo de ejecución de 10 días (reservada para usuarios de Antel).
  • ute: Tiempo máximo de ejecución de 10 días (reservada para usuarios de UTE).

Script para la ejecución de un trabajo

Comunmente 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 nomrbe 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 --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 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. 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 --ntasks-per-core=1
#SBATCH --mem=2048
#SBATCH --time=8:00:00
#SBATCH --tmp=9G
#SBATCH --partition=normal
#SBATCH --mail-type=ALL
#SBATCH --mail-user=mi@correo

source /etc/profile.d/modules.sh

cd ~/miaplicacion
./mibinario arg1 arg2

La directiva --ntasks-per-core=1 evita el uso de hyperthreading y segura que a cada hilo de software se asigne un core completo para su ejecución (i.e. dos hilos de núcleo). Esta directiva es solamente necesaria para trabajos fuertemente orientados a cómputo.

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 --ntasks-per-core=1
#SBATCH --mem-per-cpu=1024
#SBATCH --time=4:00:00
#SBATCH --tmp=9G
#SBATCH --partition=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 --ntasks-per-core=1
#SBATCH --mem-per-cpu=1024
#SBATCH --time=4:00:00
#SBATCH --tmp=9G
#SBATCH --partition=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 GPU

Este script solicita la asignación de un único CPU, 512 MB de RAM y una GPU:

#!/bin/bash
#SBATCH --job-name=mitrabajo
#SBATCH --ntasks=1
#SBATCH --mem=512
#SBATCH --time=12:00:00
#SBATCH --partition=normal
#SBATCH --gres=gpu:1
#SBATCH --mail-type=ALL
#SBATCH --mail-user=mi@correo

source /etc/profile.d/modules.sh

cd ~/miaplicacion
./mibinario arg1 arg2

Trabajo interactivo

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:30:00 --partition=normal --ntasks=1 --mem=1024 --pty bash -l

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) simplemente se debe tener cuidado 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

Uso de software licenciado

Para la utilizacion de software licenciado es necesario solicitarle al gestor las licencias 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

Atención: tener en cuenta que dependiendo del software quizás se deba solicitar una licencia por cada proceso que ejecute el software.

Ver listado completo de las licencias disponibles aqui.