Mudanças

Ir para navegação Ir para pesquisar

Slurm - Veredas

9 847 bytes adicionados, 23h20min de 26 de outubro de 2021
sem sumário de edição
== Comandos do Slurm ==
Segue abaixo, uma lista de comandos úteis disponíveis para o Slurm que permite a interação dos usuários.A lista completa de comandos por ser encontrada na documentação oficial do Slurm através do link [https://slurm.schedmd.com/quickstart.html https://slurm.schedmd.com/quickstart.html]
{|class="wikitable" width=100% border=1 cellpadding=35px
!|Comando
!|Função Descrição do comando
|-
|'''SRUN'''
|submete Submete na linha de comando um job para execução.
|-
|'''SBATCH'''
|submete Submete scripts shell (eg. bash) para a fila de espera do SLURM.
|-
|'''SALLOC'''
|reserva Reserva recursos do cluster (tempo de cpu, memória, quantidade de nós, etc) para a execução de uma tarefa computacional.
|-
|'''SBCAST'''
|para Para transmissão de um arquivo para todos os nós que foram alocados para um determinado job.
|-
|'''SCANCEL'''
|para Para cancelar um job que esteja sendo executado ou que ainda esteja na fila de espera.
|-
|'''SQUEUE'''
|para Para monitorar o estado dos jobs nas diversas filas de espera do SLURM.
|-
|'''SINFO'''
|para Para monitorar o estado global das partições configuradas (filas).
|-
|'''SVIEW'''
|providencia Providencia a integração de toda a informação e disponibiliza-a através de uma interface gráfica.
|}
<br/>
No UNIVERSO do SLURM o conceito de '''filas''' envolve a noção de partição de nós computacionais em grupos. Esses grupos não são necessariamente disjuntos (nós podem participar de mais de uma partição) e podem ser solicitados de acordo com a especificação de recursos do sistema (tempo de cpu, memória, etc). Para respeitar a herança do PBS Pro iremos nos referir indistintamente aos termos '''filas''' e '''partições'''.
O cluster BULL-Veredas possui no momento três filas de submissão definidas apenas pelo recurso '''walltime''':
* partição '''full''': nós '''veredas[12-107]''' sem restrição de tempo.
* partição '''short''': nós '''veredas[2-11]''' máximo 1 hora.
srun ./hello.x
 
 
</syntaxhighlight>
Segue o resultado da execução deste script:
</pre>
=== Tarefas paralelas com ''threads'' (MPI+OpenMP) ===
Cada nó computacional do cluster Veredas da UFMG possui '''2 quad-cores''' totalizando '''8 ''cores'''''. Mostramos a seguir um exemplo de submissão de uma tarefa paralela (MPI+OpenMP) que utiliza a Infiniband, cujo executável foi compilado com o '''Intel MPI''' e que requisita '''8 processos''', sendo que cada processo é um conjunto de '''4 ''threads'''''.
 
Repare que propositalmente, e contráriamente ao caso anterior, a ferramenta '''[https://docs.par-tec.com/html/psmpi-userguide/rn01re01.html mpiexec]''' foi utilizada em vez do '''srun''' para lançar os processos MPI. O SLURM foi então utilizado apenas para reservar os recursos necessários.
<syntaxhighlight lang="Bash">
#!/bin/bash
#SBATCH -J HelloWorld
#SBATCH --partition short
#SBATCH --nodes 4
#SBATCH --ntasks 8
#SBATCH --cpus-per-task 4
#SBATCH --time 00:30:00
 
source /opt/intel/impi/4.0.0/bin64/mpivars.sh
 
export OMP_NUM_THREADS=4
export I_MPI_PMI_LIBRARY=/usr/lib64/libpmi.so
export I_MPI_FABRICS=dapl
 
sleep 20
 
echo ’------------------------------------’
ldd ./hello
echo ’------------------------------------’
srun hostname -s | sort -u >slurm.hosts
 
 
mpdboot -n $SLURM_NNODES -f slurm.hosts -r ssh
mpiexec -perhost 2 -np 8 ./hello
mpdallexit
</syntaxhighlight>
 
O diagrama abaixo,Figura 1, procura ilustrar a forma como os processos MPI e seus respetivos ''threads'' foram distribuídos nos '''32 cores''' dos quatro nós requisitados. A descrição detalhada de cada diretriz '''#SBATCH''' poderá ser consultada online através do comando man sbatch. A descrição de cada flag do mpiexec também pode ser obtida através de '''/opt/intel/impi/4.0.0/bin64/mpiexec -help'''.
[[image:DiagramaTheadsMPI ClusterVeredas.png|frame|center|'''Figura 1''' - Diagrama com processos MPI e distribuição das '''''threads''''' em dois nós computacionais e 32 cores]]
<br/>
=== Jobs Paralelos (MPI-multithreded) ===
<br/>
=== Jobs Paralelos Variáveis de ambiente do Slurm ===Quaisquer variáveis de ambiente que você define com o comando '''sbatch''' serão passadas para o seu ''job''. Por esse motivo, se o seu programa precisar que determinadas variáveis de ambiente , é melhor colocá-las no ''script'' do seu ''job''. Isso também facilita a reprodução dos resultados do ''job'' posteriormente, caso você necessite.A tabela abaixo, contém informações sobre algumas das variáveis de ambiente de entrada e saída mais comuns quando se usa o comando '''sbatch''' no ''script shell''. Para informações adicionais, veja a página man do '''sbatch''' ou acesse a documentação online no site oficial do Slurm [https://slurm.schedmd.com/sbatch.html https://slurm.schedmd.com/sbatch.html]. {|class="wikitable" width=100% border=1 cellpadding=35px !|Variáveis de ambiente!|Definição|-|'''SLURM_JOB_ID (and SLURM_JOBID for backwards compatibility)'''|''The ID of the job allocation.''|-|'''SLURM_JOB_NAME'''|''Name of the job.''|-|'''SLURM_JOB_NODELIST (and SLURM_NODELIST for backwards compatibility)'''|''List of nodes allocated to the job.''|-|'''SLURM_JOB_NUM_NODES (and SLURM_NNODES for backwards compatibility)'''|''Total number of different nodes in the job's resource allocation.''|-|'''SLURM_ARRAY_TASK_COUNT'''|''Total number of tasks in a job array.''|-|'''SLURM_ARRAY_TASK_ID'''|''Job array ID (index) number.''|-|'''SLURM_ARRAY_TASK_MAX'''|''Job array's maximum ID (index) number.''|-|'''SLURM_ARRAY_TASK_MIN'''|''Job array's minimum ID (index) number.''|-|'''SLURM_ARRAY_TASK_STEP'''|''Job array's index step size.''|-|'''SLURM_ARRAY_JOB_ID'''|''Job array's master job ID number.''|-|'''SLURM_CLUSTER_NAME'''|''Name of the cluster on which the job is executing.''|-|'''SLURM_CPUS_ON_NODE'''|''Number of CPUS on the allocated node.''|-|'''SLURM_CPUS_PER_TASK'''|''Number of cpus requested per task. Only set if the '''--cpus-per-task''' option is specified.''|-|'''SLURM_JOB_ACCOUNT'''|''Account name associated of the job allocation.''|-|'''SLURM_JOB_CPUS_PER_NODE'''|''Count of processors available to the job on this node.''|-|'''SLURM_JOB_DEPENDENCY'''|''Set to value of the '''--dependency''' option.''|-|'''SLURM_MEM_PER_NODE'''|''Same as '''--mem'''.''|-|'''SLURM_MEM_PER_CPU'''|''Same as '''--mem-per-cpu'''.''|-|'''SLURM_NTASKS (threadsand SLURM_NPROCS for backwards compatibility)'''|''Same as '''-n, --ntasks'''''.|-|'''SLURM_NTASKS_PER_NODE'''|''Number of tasks requested per node. Only set if the '''--ntasks-per-node''' option is specified.''|-|'''SLURM_NTASKS_PER_SOCKET'''|''Number of tasks requested per socket. Only set if the '''--ntasks-per-socket''' option is specified.''|-|'''SLURM_SUBMIT_DIR'''|''The directory from which '''sbatch''' was invoked.''|-|'''SLURM_SUBMIT_HOST'''|''The hostname of the computer from which '''sbatch''' was invoked.''|-|'''SLURM_TASK_PID'''|''The process ID of the task being started.''|-|'''SLURMD_NODENAME'''|''Name of the node running the job script.''|} == Comparação entre o SLURM e o PBS Pro ==Segue alguns comandos essenciais do SLURM e seus equivalentes no PBS Pro. {|class="wikitable" width=80% border=1 cellpadding=35px !|Comando Slrum!|Descrição do comando!|Comando PBS Pro|-|'''srun'''|submete um comando via SLURM no modo interativo.|'''qsub -I'''|-|'''sbatch'''|submete um ''script shell''.|'''qsub'''|-|'''squeue'''|lista todos os ''jobs'' (em execução ou no modo de espera) nas filas.|'''qstat'''|-|'''scontrol'''|modifica o estado de um ''job'' (maioria só é permitida ao ''root'').|'''qalter'''|-|'''scancel'''|cancela um ''job'', quer em execução ou na fila de espera.|'''qdel'''|} === Variáveis de ambiente ===Existem também algumas diferenças no tocante às variáveis de ambiente como ilustra a tabela abaixo:{|class="wikitable" width=40% border=1 cellpadding=35px !|Comando Slrum!|Descrição do comando|-|$SLURM_JOB_ID|$PBS_JOBID|-|$SLURM_JOB_NAME|$PBS_JOBNAME|} O SLURM não possui o equivalente à variável '''$PBS_NODEFILE''' que aponta para o arquivo que contém os nomes dos nós computacionais reservados para a execução do ''job''. Contudo, quando necessário, é possível criar manualmente esse tipo de arquivo com o comando '''srun''': <syntaxhighlight lang="Bash">#!/bin/bash -x HOSTFILE=/tmp/OpenMPhosts.$SLURM_JOB_ID srun hostname -s > $HOSTFILE if [ -z "$SLURM_NPROCS" ] ; then if [ -z "$SLURM_NTASKS_PER_NODE" ] ; then SLURM_NTASKS_PER_NODE=1 fi SLURM_NPROCS=$(( $SLURM_JOB_NUM_NODES * $SLURM_NTASKS_PER_NODE ) )fi /path/to/mpirun -machinefile $HOSTFILE -np $SLURM_NPROCS programa.x rm /tmp/hosts.$SLURM_JOB_ID</syntaxhighlight> === Diretório de execução === Uma outra diferença importante que distingue o '''SLURM''' do '''PBS Pro''' é que enquanto no primeiro escalonador a tarefa batch é executada automáticamente no diretório de onde foi submetido o seu script, o segundo precisa explicitamente que seja introduzida a seguinte linha: <syntaxhighlight lang="Bash">#!/bin/bash -x...cd $PBS_O_WORKDIR...<br/syntaxhighlight>
=== Múltiplas tarefas simultâneas As variáveis de ambiente que são definidas durante uma sessão shell do '''SLURM''' são automáticamente exportadas para o ''job batch'' em todos os nós computacionais no instante em que o script entra em um único job === <br/>execução. Já no '''PBS Pro''' é necessário garantir isso com a introdução da diretriz:
<syntaxhighlight lang=== Jobs Interativos === "Bash">#!/bin/bash -x...#PBS -V...<br/syntaxhighlight>
=== Output ===
O '''SLURM''' apresenta ainda uma vantagem considerável e muito útil para aqueles usuários que precisam inspecionar numéricamente e em tempo real a evolução do seu programa, como por exemplo, a convergência de uma determinada iteração: os arquivos de saída '''stdout''' e de erro, '''stderr''' (ver as flags do SLURM) , são criados automáticamnte no diretório de onde foi submetido o script e vão crescendo gradualmente de tamanho à medida que a simulação evolui no tempo. O '''PBS Pro''' mostra-se insuficiente neste quesito: somente no final da execução da tarefa é que os arquivos de saída são escritos no diretório destinado.
=== Diretrizes de submissão ===
Finalmente com o intuito de auxiliar os usuários na migração dos seus scripts de submissão do '''PBS Pro''' para o '''SLURM''' apresentamos a seguinte tabela comparativa das diretrizes de submissão:
{|class="wikitable" width= Variáveis de ambiente do 60% border=1 cellpadding=35px !|PBS Pro!|Slurm |-|#PBS -N job_name|#SBATCH –job-name=”job_name” ou #SBATCH -J job_name|-|#PBS -l nodes=n|#SBATCH –nodes=n|-|#PBS -l walltime=HH:MM:SS|#SBATCH –time=HH:MM:SS|-|#PBS -l min_walltime=HH:MM:SS|#SBATCH –time-min=HH:MM:SS|-|#PBS -q <queue>|#SBATCH –partition=<queue>|-|#PBS -l mppwidth=n|#SBATCH –ntasks=n|-|#PBS -l mppnppn=N|#SBATCH –ntasks-per-node=N|-|#PBS -l mppdepth=d|#SBATCH –cpus-per-task=d|-|#PBS -l mppmem=mM|#SBATCH –mem=m|-|#PBS -l mppnodes=<nid-list>|#SBATCH –nodelist=<nid-list>|-|#PBS -W group_list=a_group|#SBATCH –account=a_group|-|#PBS -o /path/to/stdout|#SBATCH –output=/path/to/stdout (pode ser usado %j para jobid)|-|#PBS -e /path/to/stderr|#SBATCH –error=/path/to/stderr|-|#PBS -V|não é necessário|}
Devemos também ressaltar que as diretrizes do SLURM podem ser especificadas na linha de comando em vez de colocadas no ''script'':<pre class="bash">[test3@veredas0 ~]$ sbatch --job-name= Submissão de jobs ="meu job" --ntasks=N ...</pre>
<div class== Verificar Status =="aviso">'''Aviso:''' Para uma informação mais detalhada sobre o escalonador '''SLURM''' o usuário poderá baixar e consultar o arquivo [https://www.lcc.ufmg.br/sites/default/files/manuais/BullXClusterSuite-UserGuide.pdf Bullx cluster suite: User’s Guide]. Para quem estiver interessado o [https://www.cscs.ch Swiss National Supercomputing Centre] disponibiza um video no qual são feitas várias demonstrações de como o usuário pode interagir com o '''SLURM'''.</div>
== Remover jobs da fila ou em execução ==[[Category:Manuais]][[Category:Cluster Veredas]][[Category:Slurm]][[Category:Gerenciador de filas]]

Menu de navegação