SLURM `srun` vs` sbatch` y sus parámetros

95

Estoy tratando de entender cuál es la diferencia entre SLURM sruny sbatchcomandos. Estaré feliz con una explicación general, en lugar de respuestas específicas a las siguientes preguntas, pero aquí hay algunos puntos específicos de confusión que pueden ser un punto de partida y dar una idea de lo que estoy buscando.

Según la documentación , srunes para enviar trabajos y sbatches para enviar trabajos para ejecución posterior, pero la diferencia práctica no me queda clara y su comportamiento parece ser el mismo. Por ejemplo, tengo un clúster con 2 nodos, cada uno con 2 CPU. Si ejecuto srun testjob.sh &5 veces seguidas, pondrá en cola el quinto trabajo hasta que haya una CPU disponible, al igual que la ejecución sbatch testjob.sh.

Para hacer la pregunta más concreta, creo que un buen punto de partida podría ser: ¿Cuáles son algunas de las cosas que puedo hacer con una que no puedo hacer con la otra y por qué?

Muchos de los argumentos de ambos comandos son los mismos. Los que parecen los más relevantes son --ntasks, --nodes, --cpus-per-task, --ntasks-per-node. ¿Cómo se relacionan entre sí y en qué se diferencian de srunvs sbatch?

Una diferencia particular es que sruncausará un error si testjob.shno tiene permiso de ejecución, es decir, chmod +x testjob.shcuando sbatchlo ejecutará felizmente. ¿Qué está sucediendo "bajo el capó" que hace que este sea el caso?

La documentación también menciona que srunse usa comúnmente dentro de los sbatchscripts. Esto lleva a la pregunta: ¿Cómo interactúan entre sí y cuál es el caso de uso "canónico" para cada uno de ellos? Específicamente, ¿alguna vez lo usaría srunsolo?

dkv
fuente

Respuestas:

110

La documentación dice

srun is used to submit a job for execution in real time

mientras

sbatch is used to submit a job script for later execution.

Ambos aceptan prácticamente el mismo conjunto de parámetros. La principal diferencia es que srunes interactivo y de bloqueo (obtiene el resultado en su terminal y no puede escribir otros comandos hasta que esté terminado), mientras que sbatches de procesamiento por lotes y sin bloqueo (los resultados se escriben en un archivo y puede enviar otros comandos inmediatamente).

Si lo usa srunen segundo plano con el &letrero, elimina la función de 'bloqueo' de srun, que se vuelve interactiva pero no bloqueante. Sin embargo, sigue siendo interactivo, lo que significa que la salida saturará su terminal y los srunprocesos están vinculados a su terminal. Si se desconecta, perderá el control sobre ellos, o podrían morir (dependiendo de si los usan stdouto no básicamente). Y se eliminarán si se reinicia la máquina a la que se conecta para enviar trabajos.

Si lo utiliza sbatch, envía su trabajo y Slurm lo gestiona; puedes desconectar, matar tu terminal, etc. sin consecuencias. Su trabajo ya no está vinculado a un proceso en ejecución.

¿Cuáles son algunas de las cosas que puedo hacer con una que no puedo hacer con la otra y por qué?

Una característica que está disponible sbatchy no srunson las matrices de trabajos . Como srunse puede usar dentro de un sbatchscript, no hay nada que no pueda hacer sbatch.

¿Cómo se relacionan entre sí y en qué se diferencian entre srun y sbatch?

Todos los parámetros --ntasks, --nodes, --cpus-per-task, --ntasks-per-nodetienen el mismo significado en ambos comandos. Eso es cierto para casi todos los parámetros, con la notable excepción de --exclusive.

¿Qué está sucediendo "bajo el capó" que hace que este sea el caso?

srunejecuta inmediatamente la secuencia de comandos en el host remoto, mientras sbatchcopia la secuencia de comandos en un almacenamiento interno y luego la carga en el nodo de cálculo cuando comienza el trabajo. Puede verificar esto modificando su guión de envío después de que se haya enviado; los cambios no se tendrán en cuenta (ver esto ).

¿Cómo interactúan entre sí y cuál es el caso de uso "canónico" para cada uno de ellos?

Normalmente se utiliza sbatchpara enviar un trabajo y srunen el script de envío para crear los pasos del trabajo como los llama Slurm. srunse utiliza para iniciar los procesos. Si su programa es un programa MPI paralelo, srunse encarga de crear todos los procesos MPI. De lo contrario, srunejecutará su programa tantas veces como especifique la --ntasksopción. Hay muchos casos de uso dependiendo de si su programa es paralelo o no, tiene un tiempo de ejecución largo o no, está compuesto por un solo ejecutable o no, etc. A menos que se especifique lo contrario, srunhereda por defecto las opciones pertinentes del sbatcho del sallocque se ejecuta. debajo (desde aquí ).

Específicamente, ¿alguna vez usaría srun solo?

Aparte de las pequeñas pruebas, no. Un uso común es srun --pty bashobtener un shell en un trabajo informático.

Damienfrancois
fuente
5
Gracias por la respuesta, esto es mejor que cualquier cosa que pudiera haber esperado. Un seguimiento, ya que este fue uno de mis puntos originales de confusión: ¿por qué molestarse en llamar srundentro del guión de envío? Quizás estoy confundido sobre el significado de un "paso laboral". Por ejemplo, si tengo un script llamado runjob.shque contiene #!/bin/bash srun myjob.sh, ¿hay una diferencia práctica entre llamar (a) sbatch runjob.shvs (b) sbatch myjob.shvs (c) srun myjob.shvs (d) srun runjob.sh? (Claramente el último es una tontería, pero tengo curiosidad).
dkv
3
tal vez podría examinar las diapositivas de una sesión de capacitación que impartí recientemente para obtener ideas sobre cómo se usa srun dentro de un script de envío: cism.ucl.ac.be/Services/Formations/slurm/2016/slurm.pdf
damienfrancois
4
Parece que todos los ejemplos de las diapositivas (así como el tutorial de la página de CECI) se utilizan srundentro del sbatchscript de envío. Sin embargo, descubrí que los comandos sin srunel script de envío se ejecutarán de la misma manera. ¿Existe realmente una diferencia entre las cuatro invocaciones que mencioné anteriormente?
dkv
8
Todos sus ejemplos se ejecutarán de la misma manera solo si (1) la asignación es para una CPU y (2) el programa es puramente secuencial. Para ver las diferencias, solicite más de una tarea. Otra diferencia es que si no usa srun en sbatch, el comando sstat no devolverá ninguna información útil
damienfrancois
1
@Atcold, esta versión podría estar más actualizada: github.com/damienfrancois/slurm-helper/blob/master/slurm.vim
damienfrancois
5

En realidad, esto no responde completamente a la pregunta, pero aquí hay más información que encontré que puede ser útil para alguien en el futuro:


De un hilo relacionado que encontré con una pregunta similar:

En pocas palabras, sbatch y salloc asignan recursos al trabajo, mientras que srun lanza tareas paralelas a través de esos recursos. Cuando se invoca dentro de una asignación de trabajo, srun lanzará tareas paralelas en algunos o todos los recursos asignados. En ese caso, srun hereda por defecto las opciones pertinentes del sbatch o salloc bajo el cual se ejecuta. A continuación, puede (normalmente) proporcionar srun diferentes opciones que anularán lo que recibe de forma predeterminada. Cada invocación de srun dentro de un trabajo se conoce como paso de trabajo.

srun también se puede invocar fuera de una asignación de trabajo. En ese caso, srun solicita recursos, y cuando se otorgan esos recursos, lanza tareas en esos recursos como un solo trabajo y paso de trabajo.

Hay una página web relativamente nueva que ofrece más detalles sobre las opciones -B y --exclusive.

doc / html / cpu_management.shtml


Información adicional de la página de preguntas frecuentes de SLURM .

El comando srun tiene dos modos de funcionamiento diferentes. Primero, si no se ejecuta dentro de un trabajo existente (es decir, no dentro de una asignación de trabajo Slurm creada por salloc o sbatch), entonces creará una asignación de trabajo y generará una aplicación. Si se ejecuta dentro de una asignación existente, el comando srun solo genera la aplicación. Para esta pregunta, solo abordaremos el primer modo de operación y compararemos la creación de una asignación de trabajo usando los comandos sbatch y srun.

El comando srun está diseñado para uso interactivo, con alguien monitoreando la salida. La salida de la aplicación se ve como salida del comando srun, normalmente en el terminal del usuario. El comando sbatch está diseñado para enviar un script para su posterior ejecución y su salida se escribe en un archivo. Las opciones de comando utilizadas en la asignación de trabajos son casi idénticas. La diferencia más notable en las opciones es que el comando sbatch admite el concepto de matrices de trabajos, mientras que srun no. Otra diferencia significativa está en la tolerancia a fallas. Las fallas que involucran trabajos sbatch generalmente dan como resultado que el trabajo se ponga en cola y se ejecute nuevamente, mientras que las fallas que involucran srun generalmente dan como resultado que se genere un mensaje de error con la expectativa de que el usuario responderá de manera apropiada.


Otra conversación relevante aquí

dkv
fuente