Varios trabajos srun dentro de un solo sbatch fueron finalizados de manera inesperada.
Estaba intentando ejecutar múltiples trabajos srun dentro de un solo script sbatch en un clúster. El script sbatch es el siguiente:
#!/bin/bash
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -c 64
#SBATCH --time=200:00:00
#SBATCH -p amd_256
for i in {0..6} ;
do
cd ${i}
( srun -c 8 ./MD 150 20 300 20 20 0 0 > log.out 2>&1 & )
sleep 20
cd ..
done
cd 7/
srun -c 8 ./MD 100 20 300 20 20 0 0 > log.out 2>&1
cd ..
wait
En este script, envié múltiples trabajos srun. Un problema con este script es que el trabajo del 0 al 6 será detenido después de que el trabajo del 7 se haya terminado. Aquí está el mensaje de error que obtuve para el trabajo del 0 al 6:
srun: Job step aborted: Waiting up to 62 seconds for job step to finish.
slurmstepd: error: *** STEP 3801214.0 ON j2308 CANCELLED AT 2021-12-22T11:02:22 ***
srun: error: j2308: task 0: Terminated
¿Alguna idea de cómo solucionar esto?
davy.ai
El problema en este script es que el comando
wait
solo espera a que el último trabajosrun
termine, no a que todos los trabajossrun
terminen. Por lo tanto, cuando el último trabajo termina, también termina el comandowait
y el script se cierra, matando cualquier trabajo restante.Para solucionar esto, podemos utilizar una matriz de trabajos para enviar todos los trabajos
srun
como un solo trabajo con múltiples tareas. Aquí hay un ejemplo de script que utiliza una matriz de trabajos:En este script, especificamos una matriz de trabajos con
--array=0-6
, lo que crea 7 tareas para el trabajo, numeradas del 0 al 6. Dentro del bucle, utilizamos la variable de entornoSLURM_ARRAY_TASK_ID
para seleccionar la tarea actual y cambiar el directorio de trabajo. Luego ejecutamos el comandosrun
para cada tarea.Después del bucle, verificamos si la tarea actual es la última (
SLURM_ARRAY_TASK_ID
es 7) y ejecutamos el último comandosrun
si lo es. Ten en cuenta que ya no utilizamoscd
ywait
ya que ya no son necesarios.Con este script, todos los trabajos
srun
se enviarán como un solo trabajo con múltiples tareas, y todos se ejecutarán hasta su finalización sin ser interrumpidos.