es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema en este script es que el comando wait solo espera a que el último trabajo srun termine, no a que todos los trabajos srun terminen. Por lo tanto, cuando el último trabajo termina, también termina el comando wait 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:

    #!/bin/bash
    #SBATCH -N 1
    #SBATCH -n 1
    #SBATCH -c 8
    #SBATCH --time=200:00:00
    #SBATCH -p amd_256
    #SBATCH --array=0-6
    
    cd ${SLURM_ARRAY_TASK_ID}
    srun -c 8 ./MD 150 20 300 20 20 0 0 > log.out 2>&1
    cd ..
    
    if [ ${SLURM_ARRAY_TASK_ID} -eq 7 ]; then
      cd 7/
      srun -c 8 ./MD 100 20 300 20 20 0 0 > log.out 2>&1
      cd ..
    fi
    

    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 entorno SLURM_ARRAY_TASK_ID para seleccionar la tarea actual y cambiar el directorio de trabajo. Luego ejecutamos el comando srun 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 comando srun si lo es. Ten en cuenta que ya no utilizamos cd y wait 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.

Comments are closed.