Ejecutando el script slurm con múltiples nodos, inicie los pasos del trabajo con 1 tarea

StackOverflow https://stackoverflow.com//questions/24056961

  •  26-12-2019
  •  | 
  •  

Pregunta

Estoy intentando iniciar una gran cantidad de pasos de trabajo utilizando un script por lotes.Los diferentes pasos pueden ser programas completamente diferentes y necesitan exactamente una CPU cada uno.Primero intenté hacer esto usando el --multi-prog argumento para srun.Desafortunadamente, cuando uso todas las CPU asignadas a mi trabajo de esta manera, el rendimiento se degrada enormemente.El tiempo de ejecución aumenta hasta casi su valor serializado.Al suscribirme, podría mejorar esto un poco.No pude encontrar nada en línea sobre este problema, así que supuse que era un problema de configuración del clúster que estoy usando.

Entonces intenté tomar una ruta diferente.Implementé el siguiente script (lanzado a través de sbatch my_script.slurm):

#!/bin/bash
#SBATCH -o $HOME/slurm/slurm_out/%j.%N.out
#SBATCH --error=$HOME/slurm/slurm_out/%j.%N.err_out
#SBATCH --get-user-env
#SBATCH -J test
#SBATCH -D $HOME/slurm
#SBATCH --export=NONE
#SBATCH --ntasks=48

NR_PROCS=$(($SLURM_NTASKS))
for PROC in $(seq 0 $(($NR_PROCS-1)));
do
    #My call looks like this:
    #srun --exclusive -n1 bash $PROJECT/call_shells/call_"$PROC".sh &
    srun --exclusive -n1 hostname &
    pids[${PROC}]=$!    #Save PID of this background process
done
for pid in ${pids[*]};
do
    wait ${pid} #Wait on all PIDs, this returns 0 if ANY process fails
done

Soy consciente de que el --exclusive El argumento no es realmente necesario en mi caso.Los scripts de shell llamados contienen los diferentes binarios y sus argumentos.La parte restante de mi script se basa en el hecho de que todos los procesos han finalizado, por lo tanto, wait.Cambié la línea de llamada para que sea un ejemplo de trabajo mínimo.

Al principio ésta parecía ser la solución.Desafortunadamente, al aumentar la cantidad de nodos utilizados en mi asignación de trabajo (por ejemplo, aumentando --ntasks a un número mayor que el número de CPU por nodo en mi clúster), el script ya no funciona como se esperaba y devuelve

srun: Warning: can't run 1 processes on 2 nodes, setting nnodes to 1

y continuar usando solo un nodo (es decir,48 CPU en mi caso, que realizan los pasos del trabajo tan rápido como antes, todos los procesos en los otros nodos se eliminan posteriormente).

Este parece ser el comportamiento esperado, pero realmente no puedo entenderlo.¿Por qué cada paso del trabajo en una asignación determinada debe incluir una cantidad mínima de tareas igual a la cantidad de nodos incluidos en la asignación?Normalmente no me importa en absoluto la cantidad de nodos utilizados en mi asignación.

¿Cómo puedo implementar mi script por lotes para que pueda usarse en múltiples nodos de manera confiable?

¿Fue útil?

Solución

¡Lo encontré!La nomenclatura y las muchas opciones de línea de comandos para Slurmar me confundieron.La solución está dada por

#!/bin/bash
#SBATCH -o $HOME/slurm/slurm_out/%j.%N.out
#SBATCH --error=$HOME/slurm/slurm_out/%j.%N.err_out
#SBATCH --get-user-env
#SBATCH -J test
#SBATCH -D $HOME/slurm
#SBATCH --export=NONE
#SBATCH --ntasks=48

NR_PROCS=$(($SLURM_NTASKS))
for PROC in $(seq 0 $(($NR_PROCS-1)));
do
    #My call looks like this:
    #srun --exclusive -N1 -n1 bash $PROJECT/call_shells/call_"$PROC".sh &
    srun --exclusive -N1 -n1 hostname &
    pids[${PROC}]=$!    #Save PID of this background process
done
for pid in ${pids[*]};
do
    wait ${pid} #Wait on all PIDs, this returns 0 if ANY process fails
done

Esto especifica para ejecutar el trabajo en exactamente un nodo que incorpora una sola tarea solamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top