Envío de trabajos al Clúster

Envío de trabajos al Clúster

Cada usuario ingresará a mazinger.ing.puc.cl vía SSH, el cual procesará todas las peticiones que le sean enviadas. Este servidor es para que los usuarios prueben su código y luego envíen sus trabajos a los nodos de computo,  no es para ejecutar trabajos.

Al enviar un trabajo, este es recibido por un servidor de cabecera, el cual se encarga de distribuir el trabajo en los nodos para que sea resuelto. Posteriormente se podrá ver los resultados dependiendo del tipo de salida que haya definido el usuario.

El clúster usa el gestor de tareas SLURM, por lo que recomendamos leer la documentación básica para el uso de este sistema.

SSH es un protocolo para una conexión remota segura. En Linux, que es el sistema operativo que usa el clúster, se usa este protocolo para conectarse al servidor de “Login”. La interfaz que se usa es “línea de comando” y hay diferentes clientes SSH según el sistema operativo, en Linux y MAC el cliente es nativo, en el caso de Windows también puede encontrar el comando “ssh” en la terminal del sistema, pero sí requiere algo gráfico puede usar Putty.

Los trabajos deben ser enviados a una cierta cola de trabajo, esto hace que se pueda ordenar mejor la ejecución de los trabajos de los usuarios. Las colas de trabajo habilitadas para el uso son:

Cola de trabajo “full”

Esta cola cuenta con 7 nodos de cómputo y esta disponible para todos los usuarios.

  • 148 núcleos de dos hilos cada uno.
  • 506 GB RAM
Cola de trabajo “512×1024”

Esta cola cuenta con 2 nodos de cómputo y esta disponible para todos los usuarios.

  • 512 núcleos de dos hilos cada uno.
  • 512 GB RAM.
Cola de trabajo “gpus”

Esta cola cuenta con 1 nodo de cómputo y esta disponible para todos los usuarios pero con prioridad para el equipo de trabajo de los profesores que aportaron este nodo.

  • 48 núcleos de dos hilos cada uno.
  • 768 GB RAM.
  • 5 GPUS (Nvidia Quadro RTX 8000)

Antes de enviar un trabajo al clúster se deben verificar los recursos disponibles para configurar correctamente el script, para eso se debe ejecutar:

 

squeue

El comando para enviar un trabajo es sbatch, el cual permite colocar un trabajo en una cola. Si bien a sbatch se le pueden pasar todos los parámetros directamente, se recomienda crear un script que permita definir los parámetros para el trabajo, hay ejemplos mas abajo. Posteriormente se podrá enviar el trabajo como:

sbatch submit.sh

Este es un ejemplo del archivo que se le puede pasar a sbatch. Dentro de él se indican las CPUs que requiere su trabajo. Debe comprender que no por solicitar mas CPUs su trabajo se ejecutara mas rápido, para que un programa use varias CPUs al mismo tiempo debe codificar su programa para que use todos los recursos solicitados, por ejemplo en Python puede usar Multiprocessing, o para C, C++ o Fortran puede usar OpenMP.

Este es un ejemplo para un programa que no esta creado para usar multiproceso.

#!/bin/bash

# Nombre del trabajo
#SBATCH --job-name=Prueba1
# Archivo de salida
#SBATCH --output=salida.txt
# Cola de trabajo
#SBATCH --partition=full
# Reporte por correo
#SBATCH --mail-type=ALL
#SBATCH --mail-user=usuario@ing.puc.cl
# Solicitud de cpus
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=1

python calculo.py

 

Si su programa puede usar mas de una CPU en el parámetro “–cpus-per-task” debe indicar la cantidad de CPUs que requiere.

Si su programa puede ejecutarse en mas de un nodo de computo en el parámetro  “–ntasks” debe indicar la cantidad de instancias que requiere.

Este es un ejemplo del archivo que se le puede pasar a sbatch para usar una GPU. Al igual que para usar múltiples CPUs, para usar GPUs su programa debe estar codificado para usar este recurso. La cola de trabajo “gpus” cuenta con un nodo el cual tiene 5 GPUs. 

#!/bin/bash

# Nombre del trabajo
#SBATCH --job-name=Prueba1
# Archivo de salida
#SBATCH --output=salida.txt
# Cola de trabajo
#SBATCH --partition=gpus
# Solicitud de gpus
#SBATCH --gres=gpu:quadro_rtx_8000:1 # Reporte por correo #SBATCH --mail-type=ALL #SBATCH --mail-user=usuario@ing.puc.cl python calculo.py

Si su programa esta creado para usar todas las CPUs que dispone un nodo de computo, este ejemplo solicita dos nodos.

#!/bin/bash

# Nombre del trabajo
#SBATCH --job-name=Prueba1
# Archivo de salida
#SBATCH --output=salida.txt
# Cola de trabajo)
#SBATCH --partition=full
# Reporte por correo
#SBATCH --mail-type=ALL
#SBATCH --mail-user=usuario@ing.puc.cl
# Solicitud de cpus
#SBATCH --nodes=2

python calculo.py

Para monitorear se puede utilizar el comando squeue o sinfo.

El comando squeue entrega información de los trabajos que hay en ese momento en el clúster. Uno de los campos importantes es “ST”, en ese campo se indica el estado del trabajo, si esta en “R” quiere decir que se esta ejecutando, pero si hay trabajos en estado “PD”, que es pendiente, quiere decir que el clúster tiene utilizados todos sus recursos y que los trabajos que se envíen quedaran esperando. Para estos trabajos en estado pendiente o en espera se comienza a aplicar la priorización multifactor que se explica en las “Políticas de Uso“. La salida estándar del comando squeue es la siguiente:

JOBID PARTITION NAME     USER     ST TIME        NODES NODELIST(REASON)
30070 full      Trabajo1 usuario1 R  1:07:37     1     n10
30062 full      Trabajo2 usuario1 R  3:00:36     1     n10
30061 full      Trabajo3 usuario1 R  3:00:39     1     n8
30037 full      Trabajo4 usuario1 R  7:41:46     1     n6
30029 full      Trabajo5 usuario1 R  7:42:06     1     n12
30016 full      T24      usuario4 R  14:59:06    1     n4
29941 full      Trabajo8 usuario2 R  19:43:42    1     n2
29746 full      T12.1    usuario3 R  1-23:27:50  1     n8
29657 full      T12.1    usuario3 R  3-00:05:19  1     n9
29411 full      J123-1   usuario8 R  6-02:49:29  1     n2
29193 full      J123-2   usuario8 R  8-00:13:19  1     n15

 

También se puede formatear la salida para que entregue la información de la forma que se requiera:

squeue -o "%.10u %.10i %.10P %.20j %.11M %.10T %.4C %N" -S -t
 USER    JOBID PARTITION NAME       TIME       STATE   CPUS NODELIST
usuario1 30063 full      Trabajo1   1:43:09    RUNNING 32   n9
usuario5 30062 full      Trabajo5   3:10:53    RUNNING 16   n10
usuario5 30018 full      Trabajo5.1 7:52:53    RUNNING 24   n15
usuario3 30017 full      Trabajo3   13:53:33   RUNNING 8    n8
usuario8 29403 full      Trabajo8   6-03:00:23 RUNNING 16   n15
usuario8 29193 full      Trabajo8.1 8-00:23:36 RUNNING 16   n15

 

El comando sinfo entrega información de los nodos de computo, su salida estándar es la siguiente:

PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
full*     up    infinite  8     mix   n[2-4,6,8-10,12]
full*     up    infinite  1     alloc n15
512x1024  up    infinite  2     idle  n[1,11]
gpus      up    infinite  1     idle  n7

 

También se puede formatear la salida para que entregue la información de la forma que se requiera:

sinfo -N -o "%.10N %.10O %.10e %.20C"
NODELIST   CPU_LOAD   FREE_MEM        CPUS(A/I/O/T)
      n1       0.01     463832          0/256/0/256
      n2      20.28      77392           14/18/0/32
      n3      24.94      27538            6/26/0/32
      n4       5.26      36229           20/12/0/32
      n6       2.93      17183            4/28/0/32
      n7       0.09     194103            0/96/0/96
      n8     139.47      10430            57/7/0/64
      n9      82.33      16673            38/2/0/40
     n10      23.81       7659           22/10/0/32
     n11       0.01     492040          0/256/0/256
     n12      20.69      11915            24/8/0/32
     n15      49.76      63109            32/0/0/32

Si por algún motivo desea eliminar un trabajo, lo puede realizar con el comando scancel. Por ejemplo para eliminar el trabajo que aparece en el ejemplo anterior se debe ejecutar:

scancel 23

Las salidas de los trabajos se almacenaran en el archivo que se indique con el parámetro “–output”, además en los ejemplos se indican los parámetros para que llegue información por correo.