Manual de uso

⌘K
  1. Inicio
  2. Manual de uso
  3. 3. Envío de trabajos
  4. Envío de trabajos
  5. Envío masivo de trabajos similares – Job Arrays

Envío masivo de trabajos similares – Job Arrays

La funcionalidad Array Jobs es un mecanismo que Slurm proporciona para permitir a los usuarios enviar muchos scripts de Slurm similares con un único comando sbatch.

Job array diagram

Los job arrays envían multiples copias del mismo script con el mismo job ID pero con task IDs únicas, que pueden ser usadas para controlar el comportamiento de cada tarea.

Algo similar se podría conseguir mediante un bucle for:

for ID in {1..6}
do
    sbatch my-script.sh $ID
done

lo que envía my-script.sh 6 veces, y le pasa como argumento los números del 1 al 6, respectivamente. Sin embargo, job arrays presenta importantes ventajas sobre esta have some advantages over this approach:

  • job arrays son autocontenidos, esto es, no necesitan wrappers adicionales
  • cada tarea del job array está asociada al mismo job ID y puede ser más fácilmente consultable con sacctsqueue
  • el procesamiento de job arrays masivos añade menos carga de trabajo a Slurm que los correspondientes trabajos individuales

Razones por las que se podría preferir “for loop” en lugar de job arrays:

  • cada tarea en el job array tiene los mismos recursos
  • cuando el trabajo a realizar difiere significativamente entre tareas puede ser difícil controlar el comportamiento usando únicamente la “task ID”.
Job Array Syntax

Los job arrays se crean mediante la opción --array=<range> de sbatch.  <range> puede ser un array de valores específicos o un intervalo de valores entero, con un incremento opcional.

Se puede especificar un número máximo de tareas que se ejecutan simultáneamente del array de trabajos utilizando un separador «%». Por ejemplo, «–array=0-15%4» limitará el número de tareas que se ejecutan simultáneamente desde este array de trabajos a 4.

 

Por ejemplo, tu script Slurm podría ser

#!/bin/bash

#SBATCH --job-name=myjob
#SBATCH --array=1-3

echo "hello world"
sleep 3600

Este script ejecutará 10 trabajos que solicitan la cantidad predeterminada de CPU y memoria. El trabajo imprimirá «hello world» al archivo de salida del trabajo, y luego esperará una hora. Cuando envíes este trabajo y tu trabajo esté esperando en la cola, este trabajo de array se verá así:

#> sbatch myjob.sh
Submitted batch job 11784178
#> squeue -u $USER
JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
11784178_[1-3]   regular    myjob   yang.e PD       0:00      1 (None)

donde [1-3] corresponde a los índices pasados a --array. Una vez que empieza a ejecutarse, la salida de squeue sería parecida a ésta:

#> squeue -u $USER
JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
 11784178_1   regular    myjob   yang.e  R       0:00      1 sml-n02
 11784178_2   regular    myjob   yang.e  R       0:00      1 sml-n02
 11784178_3   regular    myjob   yang.e  R       0:00      1 sml-n02

Cada paso del array aparece como una «tarea” del mismo trabajo, con su propio índice. En el ejemplo anterior, cada tarea del array tendrá un ID de tarea del 1 al 3.

La opción --array también puede aceptar listas de enteros y rangos, separados por comas, por ejemplo, --array=1-3,7. Esto es útil para pruebas o para volver a ejecutar solo índices específicos.

Cada tarea del array tiene su propio archivo de salida. El nombre predeterminado es slurm-<jobID>-<taskID>.out.

Cancelando array jobs

Al cancelar trabajos, puedes referenciar tareas individuales del array, un rango o una lista similar a la de especificar los trabajos a ejecutar. Por ejemplo:

scancel 1174178_[1,2]

cancelará solo las tareas del array 1 y 2. Si quieres cancelar todas las tareas del trabajo a la vez, puedes pasar el ID del trabajo, sin el ID de tarea.

scancel 1174178
La variable de entorno SLURM_ARRAY_TASK_ID

La variable SLURM_ARRAY_TASK_ID contiene la ID de cada tarea en un job array, la cual puede ser usada para controlar lo que la tarea hace.

Por ejemplo:

 

#!/bin/bash

#SBATCH --job-name=myjob
#SBATCH --array=1-3

echo "hello world from task ${SLURM_ARRAY_TASK_ID}"

El script mostrará hello world from task <N> donde N puede vale del 1 al 3. Una vez ejecutado, la salida sería (cada línea en su correspondiente fichero de salida)

hello world from task 1
hello world from task 2
hello world from task 3

¿Cómo podemos ayudarte?