Mudanças entre as edições de "Slurm - Veredas"

De Wiki LCC
Ir para navegação Ir para pesquisar
(Comandos do Slurm)
Linha 1: Linha 1:
 
O [https://slurm.schedmd.com/ '''''Slurm Workload Manager'''''] (anteriormente conhecido como ''Simple Linux Utility for Resource Management'' ou SLURM), ou Slurm, é num escalonador de tarefas gratuito e de código aberto para Linux e kernels similares ao Unix, usado por muitos dos supercomputadores e clusters de computadores do mundo. O Slurm Workload Manager possui três funções principais:
 
O [https://slurm.schedmd.com/ '''''Slurm Workload Manager'''''] (anteriormente conhecido como ''Simple Linux Utility for Resource Management'' ou SLURM), ou Slurm, é num escalonador de tarefas gratuito e de código aberto para Linux e kernels similares ao Unix, usado por muitos dos supercomputadores e clusters de computadores do mundo. O Slurm Workload Manager possui três funções principais:
* alocar nós computacionais para acesso exclusivo e/ou não-exclusivo (compartilhado) aos usuários por um determinado período de tempo necessário para executar as tarefas computacionais submetidas (jobs).
+
* alocar nós computacionais para acesso exclusivo e/ou não-exclusivo (compartilhado) aos usuários por um determinado período de tempo necessário para executar as tarefas computacionais submetidas (''jobs'').
 
* oferece um ambiente integrado que permite executar e monitorar em tempo real as tarefas lançadas nos nós computacionais alocados.
 
* oferece um ambiente integrado que permite executar e monitorar em tempo real as tarefas lançadas nos nós computacionais alocados.
 
* gerencia a fila de submissão, arbitrando conflitos entre os pedidos de recursos computacionais.
 
* gerencia a fila de submissão, arbitrando conflitos entre os pedidos de recursos computacionais.
Linha 35: Linha 35:
 
|providencia a integração de toda a informação e disponibiliza-a através de uma interface gráfica.
 
|providencia a integração de toda a informação e disponibiliza-a através de uma interface gráfica.
 
|}
 
|}
 +
<br/>
 +
Uma mnemônica muito útil é lembrar que todos os comandos do SLURM começam pela letra s. Todos os comandos possuem manuais que podem ser acessados online via linha de comando, '''man <comando>'''
 +
 +
Exemplo com o comando '''sbatch''' :
 +
<pre class="bash">
 +
[test3@veredas0 ~]$ man sbatch
 +
</pre>
 +
Em geral a grande maioria dos usuários precisa familiarizar-se com três comandos básicos do SLURM: '''sbatch, squeue e scancel'''. Assim como no PBS Pro, a submissão de uma tarefa envolve a elaboração de um script shell (em geral em bash) que possui no seu preâmbulo diretrizes específicas do SLURM. Essas diretrizes começam com a palavra-chave '''#SBATCH''' (o análogo da palavra-chave '''#PBS''' para o PBS Pro). No corpo do script é então chamado o executável do programa com os seus respectivos parâmetros.
 +
 +
== Submissão de tarefas computacionais ==
 +
 +
=== Filas de submissão ===
 +
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.
 +
 +
O usuário poderá listar a qualquer momento os recursos oferecidos por cada partição com o seguinte comando:
 +
 +
<pre class="bash">
 +
[test3@veredas0 ~]$ scontrol show partitions
 +
PartitionName=full TotalNodes=96 TotalCPUs=768 RootOnly=NO
 +
    Default=YES Shared=NO Priority=1 State=UP MaxTime=UNLIMITED Hidden=NO
 +
    MinNodes=1 MaxNodes=UNLIMITED DisableRootJobs=NO AllowGroups=ALL
 +
    AllocNodes=ALL
 +
    Nodes=veredas[12-107] NodeIndices=10-105 DefaultTime=NONE
 +
 +
PartitionName=short TotalNodes=10 TotalCPUs=80 RootOnly=NO
 +
    Default=NO Shared=NO Priority=1 State=UP MaxTime=01:00:00 Hidden=NO
 +
    MinNodes=1 MaxNodes=UNLIMITED DisableRootJobs=NO AllowGroups=ALL
 +
    AllocNodes=ALL
 +
    Nodes=veredas[2-11] NodeIndices=0-9 DefaultTime=NONE
 +
</pre>
 +
ou através do seguinte comando,
 +
 +
<pre class="bash">
 +
[test3@veredas0 ~]$ sinfo
 +
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
 +
full* up infinite 96 idle veredas[12-107]
 +
short up 1:00:00 9 idle veredas[2,4-11]
 +
short up 1:00:00 1 down veredas3.
 +
</pre>
 +
 +
Para racionalizar a utilização de recursos é conveniente que o usuário respeite a real demanda de sua tarefa e submeta seu script à partição mais apropriada, ou seja, ''jobs'' de curta duração (< 1 hora) na partição '''short'''. Caso contrário, pode correr o risco de a sua solicitação permanecer por muito tempo na fila de espera.
 +
 +
O estado dos ''jobs'' submetidos ou em execução poderá também ser examinado no SLURM através do comando '''squeue''', tal como era feito no PBS Pro com o comando ''qstat'':
 +
 +
<pre class="bash">
 +
[test3@veredas0 ~]$ squeue
 +
  JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
 +
    179 short HelloWor test3 R 0:02 2 veredas[4-5]
 +
</pre>
 +
<br/>
 +
<div class="aviso">
 +
'''Aviso:''' Os exemplos de scripts de submissão que se seguem são para propósitos ilustrativos e representam ''templates'' que os usuários poderão adaptar conforme as suas necessidades específicas.
 +
</div>
 +
 +
=== Tarefas sequenciais ===
 +
Executar um ''job'' sequencial é bastante simples. Basta requisitar a duração necessária para executar a tarefa. Qualquer tarefa puramente seqüencial, que não utiliza MPI ou ''threads'', irá usar necessariamente '''um core apenas''' do nó computacional.
 +
 +
<syntaxhighlight lang="Bash">
 +
#!/bin/bash
 +
#SBATCH --job-name="TESTJOB"
 +
#SBATCH --ntasks=1
 +
#SBATCH --time=01:00:00
  
 +
./a.out > OUTFILE
 +
</syntaxhighlight>
 +
Por padrão o ''output'' do ''script'' acima será redirecionado para um arquivo do tipo ''slurm-'''XXXX'''.out'', onde '''XXXX''' é o número do job que foi atribuído pelo SLURM. Este arquivo de ''output'' estará localizado no diretório de onde foi feita a submissão. O interessante a notar, e a que nos referiremos mais adiante (ver), é de que este arquivo é criado no instante da execução do ''script'' e o seu conteúdo aumenta à medida que o programa vai sendo executado. Remover este arquivo antes da finalização do job acarreta portanto perda total do output da tarefa. Diferentemente no PBS Pro os arquivos de output só eram criados na área do usuário depois de o job finalizar. É possível especificar um nome para o arquivo de output fazendo uso da diretriz '''''#SBATCH --output=meu_job.out'''''. O mesmo vale para o arquivo de erro, '''''#SBATCH --error=meu_job.err'''''.
  
'''SRUN''' - submete na linha de comando um job para execução.
+
=== Tarefas paralelas (MPI) ===
----
+
O exemplo seguinte representa a submissão de um ''job'' paralelo MPI que foi compilado com o compilador proprietário da BULL (MPI BULL): '''mpicc -DALIGNED -c hello.c -o hello.o'''; '''mpicc hello.o -o hello.x'''. Nesta situação permitimos que o SLURM se gerencie não só da alocação dos recursos, mas também da execução do programa e da inicialização das comunicações na '''''Infiniband''''' através do comando '''srun'''.
'''SBATCH''' - submete scripts shell (eg. bash) para a fila de espera do SLURM.
 
----
 
'''SALLOC''' - reserva recursos do cluster (tempo de cpu, memória, quantidade de nós, etc) para a execução de uma tarefa computacional.
 
----
 
'''SBCAST''' - para transmissão de um arquivo para todos os nós que foram alocados para um determinado job.
 
----
 
'''SCANCEL''' - para cancelar um job que esteja sendo executado ou que ainda esteja na fila de espera.
 
----
 
'''SQUEUE''' - para monitorar o estado dos jobs nas diversas filas de espera do SLURM.
 
----
 
'''SINFO''' - para monitorar o estado global das partições configuradas (filas).
 
----
 
'''SVIEW''' - providencia a integração de toda a informação e disponibiliza-a através de uma interface gráfica.
 
----
 
  
== Variáveis de ambiente do Slurm ==
+
<syntaxhighlight lang="Bash">
 +
#!/bin/bash
 +
#SBATCH -J HelloWorld
 +
#SBATCH --ntasks 16
 +
#SBATCH --time 00:30:00
 +
#SBATCH --partition short
 +
source /opt/mpi/mpibull2-1.3.9-18.s/share/mpibull2.sh
 +
mpibull2_devices -d=ibmr_gen2
 +
echo ’------------------------------------------’
 +
ldd ./hello.x
 +
echo ’------------------------------------------’
 +
sleep 15
 +
 
 +
srun hostname | sort
 +
 
 +
srun ./hello.x
 +
 
 +
 
 +
</syntaxhighlight>
 +
Segue o resultado da execução deste script:
 +
 
 +
<pre class="bash">
 +
[test3@veredas0 SLURM]$ cat slurm-188.out
 +
------------------------------------------
 +
    libmpi.so => /opt/mpi/mpibull2-1.3.9-18.s/lib/libmpi.so (0x00002b1b48343000)
 +
    librt.so.1 => /lib64/librt.so.1 (0x00000038d1a00000)
 +
    libdl.so.2 => /lib64/libdl.so.2 (0x00000038d0e00000)
 +
    libpmi.so => /usr/lib64/libpmi.so (0x00002b1b486a0000)
 +
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000038d1200000)
 +
    libuuid.so.1 => /lib64/libuuid.so.1 (0x00000038e1800000)
 +
    libm.so.6 => /lib64/libm.so.6 (0x00000038d0a00000)
 +
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000038dba00000)
 +
    libc.so.6 => /lib64/libc.so.6 (0x00000038d0600000)
 +
    libmpidev.so => /opt/mpi/mpibull2-1.3.9-18.s/lib/drivers/ibmr_gen2/libmpidev.so (0x00002b1b488a7000)
 +
    /lib64/ld-linux-x86-64.so.2 (0x00000038d0200000)
 +
    libslurm.so.20 => /usr/lib64/libslurm.so.20 (0x00002b1b48ba6000)
 +
    libibverbs.so.1 => /usr/lib64/libibverbs.so.1 (0x00002b1b48e66000)
 +
    libsvml.so => /opt/intel/Compiler/11.1/069/lib/intel64/libsvml.so (0x00002b1b49074000)
 +
------------------------------------------
 +
veredas4
 +
veredas4
 +
veredas4
 +
veredas4
 +
veredas4
 +
veredas4
 +
veredas4
 +
veredas4
 +
veredas5
 +
veredas5
 +
veredas5
 +
veredas5
 +
veredas5
 +
veredas5
 +
veredas5
 +
veredas5
 +
Hello MPI: processor 5 of 16 on veredas4
 +
Hello MPI: processor 15 of 16 on veredas5
 +
MPIBull2 1.3.9-s (Astlik) 20091113-1606 MPI_THREAD_FUNNELED (job 188) (device gen2)
 +
Hello MPI: processor 0 of 16 on veredas4
 +
Hello MPI: processor 1 of 16 on veredas4
 +
Hello MPI: processor 2 of 16 on veredas4
 +
Hello MPI: processor 3 of 16 on veredas4
 +
Hello MPI: processor 4 of 16 on veredas4
 +
Hello MPI: processor 7 of 16 on veredas4
 +
Hello MPI: processor 8 of 16 on veredas5
 +
Hello MPI: processor 6 of 16 on veredas4
 +
Hello MPI: processor 9 of 16 on veredas5
 +
Hello MPI: processor 10 of 16 on veredas5
 +
Hello MPI: processor 11 of 16 on veredas5
 +
Hello MPI: processor 12 of 16 on veredas5
 +
Hello MPI: processor 13 of 16 on veredas5
 +
Hello MPI: processor 14 of 16 on veredas5
 +
</pre>
 +
=== Tarefas paralelas com ''threads'' (MPI+OpenMP) ===
  
== Submissão de jobs ==
 
  
== Verificar Status ==
 
=== Jobs Paralelos (MPI) ===
 
 
<br/>
 
<br/>
 
=== Jobs Paralelos (MPI-multithreded) ===  
 
=== Jobs Paralelos (MPI-multithreded) ===  
Linha 72: Linha 197:
 
=== Jobs Interativos ===  
 
=== Jobs Interativos ===  
 
<br/>
 
<br/>
 +
 +
 +
 +
== Variáveis de ambiente do Slurm ==
 +
 +
== Submissão de jobs ==
 +
 +
== Verificar Status ==
  
  
 
== Remover jobs da fila ou em execução ==
 
== Remover jobs da fila ou em execução ==

Edição das 16h57min de 11 de junho de 2019

O Slurm Workload Manager (anteriormente conhecido como Simple Linux Utility for Resource Management ou SLURM), ou Slurm, é num escalonador de tarefas gratuito e de código aberto para Linux e kernels similares ao Unix, usado por muitos dos supercomputadores e clusters de computadores do mundo. O Slurm Workload Manager possui três funções principais:

  • alocar nós computacionais para acesso exclusivo e/ou não-exclusivo (compartilhado) aos usuários por um determinado período de tempo necessário para executar as tarefas computacionais submetidas (jobs).
  • oferece um ambiente integrado que permite executar e monitorar em tempo real as tarefas lançadas nos nós computacionais alocados.
  • gerencia a fila de submissão, arbitrando conflitos entre os pedidos de recursos computacionais.

Comandos do Slurm

Segue abaixo, uma lista de comandos úteis disponíveis para o Slurm que permite a interação dos usuários.

Comando Função do comando
SRUN submete na linha de comando um job para execução.
SBATCH submete scripts shell (eg. bash) para a fila de espera do SLURM.
SALLOC reserva recursos do cluster (tempo de cpu, memória, quantidade de nós, etc) para a execução de uma tarefa computacional.
SBCAST para transmissão de um arquivo para todos os nós que foram alocados para um determinado job.
SCANCEL para cancelar um job que esteja sendo executado ou que ainda esteja na fila de espera.
SQUEUE para monitorar o estado dos jobs nas diversas filas de espera do SLURM.
SINFO para monitorar o estado global das partições configuradas (filas).
SVIEW providencia a integração de toda a informação e disponibiliza-a através de uma interface gráfica.


Uma mnemônica muito útil é lembrar que todos os comandos do SLURM começam pela letra s. Todos os comandos possuem manuais que podem ser acessados online via linha de comando, man <comando>

Exemplo com o comando sbatch :

[test3@veredas0 ~]$ man sbatch

Em geral a grande maioria dos usuários precisa familiarizar-se com três comandos básicos do SLURM: sbatch, squeue e scancel. Assim como no PBS Pro, a submissão de uma tarefa envolve a elaboração de um script shell (em geral em bash) que possui no seu preâmbulo diretrizes específicas do SLURM. Essas diretrizes começam com a palavra-chave #SBATCH (o análogo da palavra-chave #PBS para o PBS Pro). No corpo do script é então chamado o executável do programa com os seus respectivos parâmetros.

Submissão de tarefas computacionais

Filas de submissão

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.

O usuário poderá listar a qualquer momento os recursos oferecidos por cada partição com o seguinte comando:

[test3@veredas0 ~]$ scontrol show partitions
PartitionName=full TotalNodes=96 TotalCPUs=768 RootOnly=NO
     Default=YES Shared=NO Priority=1 State=UP MaxTime=UNLIMITED Hidden=NO
     MinNodes=1 MaxNodes=UNLIMITED DisableRootJobs=NO AllowGroups=ALL
     AllocNodes=ALL
     Nodes=veredas[12-107] NodeIndices=10-105 DefaultTime=NONE

PartitionName=short TotalNodes=10 TotalCPUs=80 RootOnly=NO
     Default=NO Shared=NO Priority=1 State=UP MaxTime=01:00:00 Hidden=NO
     MinNodes=1 MaxNodes=UNLIMITED DisableRootJobs=NO AllowGroups=ALL
     AllocNodes=ALL
     Nodes=veredas[2-11] NodeIndices=0-9 DefaultTime=NONE

ou através do seguinte comando,

[test3@veredas0 ~]$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
full* up infinite 96 idle veredas[12-107]
short up 1:00:00 9 idle veredas[2,4-11]
short up 1:00:00 1 down veredas3.

Para racionalizar a utilização de recursos é conveniente que o usuário respeite a real demanda de sua tarefa e submeta seu script à partição mais apropriada, ou seja, jobs de curta duração (< 1 hora) na partição short. Caso contrário, pode correr o risco de a sua solicitação permanecer por muito tempo na fila de espera.

O estado dos jobs submetidos ou em execução poderá também ser examinado no SLURM através do comando squeue, tal como era feito no PBS Pro com o comando qstat:

[test3@veredas0 ~]$ squeue
  JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
    179 short HelloWor test3 R 0:02 2 veredas[4-5]


Aviso: Os exemplos de scripts de submissão que se seguem são para propósitos ilustrativos e representam templates que os usuários poderão adaptar conforme as suas necessidades específicas.

Tarefas sequenciais

Executar um job sequencial é bastante simples. Basta requisitar a duração necessária para executar a tarefa. Qualquer tarefa puramente seqüencial, que não utiliza MPI ou threads, irá usar necessariamente um core apenas do nó computacional.

#!/bin/bash
#SBATCH --job-name="TESTJOB"
#SBATCH --ntasks=1
#SBATCH --time=01:00:00

./a.out > OUTFILE

Por padrão o output do script acima será redirecionado para um arquivo do tipo slurm-XXXX.out, onde XXXX é o número do job que foi atribuído pelo SLURM. Este arquivo de output estará localizado no diretório de onde foi feita a submissão. O interessante a notar, e a que nos referiremos mais adiante (ver), é de que este arquivo é criado no instante da execução do script e o seu conteúdo aumenta à medida que o programa vai sendo executado. Remover este arquivo antes da finalização do job acarreta portanto perda total do output da tarefa. Diferentemente no PBS Pro os arquivos de output só eram criados na área do usuário depois de o job finalizar. É possível especificar um nome para o arquivo de output fazendo uso da diretriz #SBATCH --output=meu_job.out. O mesmo vale para o arquivo de erro, #SBATCH --error=meu_job.err.

Tarefas paralelas (MPI)

O exemplo seguinte representa a submissão de um job paralelo MPI que foi compilado com o compilador proprietário da BULL (MPI BULL): mpicc -DALIGNED -c hello.c -o hello.o; mpicc hello.o -o hello.x. Nesta situação permitimos que o SLURM se gerencie não só da alocação dos recursos, mas também da execução do programa e da inicialização das comunicações na Infiniband através do comando srun.

#!/bin/bash
#SBATCH -J HelloWorld
#SBATCH --ntasks 16
#SBATCH --time 00:30:00
#SBATCH --partition short
source /opt/mpi/mpibull2-1.3.9-18.s/share/mpibull2.sh
mpibull2_devices -d=ibmr_gen2
echo ’------------------------------------------’
ldd ./hello.x
echo ’------------------------------------------’
sleep 15

srun hostname | sort

srun ./hello.x

Segue o resultado da execução deste script:

[test3@veredas0 SLURM]$ cat slurm-188.out
------------------------------------------
     libmpi.so => /opt/mpi/mpibull2-1.3.9-18.s/lib/libmpi.so (0x00002b1b48343000)
     librt.so.1 => /lib64/librt.so.1 (0x00000038d1a00000)
     libdl.so.2 => /lib64/libdl.so.2 (0x00000038d0e00000)
     libpmi.so => /usr/lib64/libpmi.so (0x00002b1b486a0000)
     libpthread.so.0 => /lib64/libpthread.so.0 (0x00000038d1200000)
     libuuid.so.1 => /lib64/libuuid.so.1 (0x00000038e1800000)
     libm.so.6 => /lib64/libm.so.6 (0x00000038d0a00000)
     libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000038dba00000)
     libc.so.6 => /lib64/libc.so.6 (0x00000038d0600000)
     libmpidev.so => /opt/mpi/mpibull2-1.3.9-18.s/lib/drivers/ibmr_gen2/libmpidev.so (0x00002b1b488a7000)
     /lib64/ld-linux-x86-64.so.2 (0x00000038d0200000)
     libslurm.so.20 => /usr/lib64/libslurm.so.20 (0x00002b1b48ba6000)
     libibverbs.so.1 => /usr/lib64/libibverbs.so.1 (0x00002b1b48e66000)
     libsvml.so => /opt/intel/Compiler/11.1/069/lib/intel64/libsvml.so (0x00002b1b49074000)
------------------------------------------
veredas4
veredas4
veredas4
veredas4
veredas4
veredas4
veredas4
veredas4
veredas5
veredas5
veredas5
veredas5
veredas5
veredas5
veredas5
veredas5
Hello MPI: processor 5 of 16 on veredas4
Hello MPI: processor 15 of 16 on veredas5
MPIBull2 1.3.9-s (Astlik) 20091113-1606 MPI_THREAD_FUNNELED (job 188) (device gen2)
Hello MPI: processor 0 of 16 on veredas4
Hello MPI: processor 1 of 16 on veredas4
Hello MPI: processor 2 of 16 on veredas4
Hello MPI: processor 3 of 16 on veredas4
Hello MPI: processor 4 of 16 on veredas4
Hello MPI: processor 7 of 16 on veredas4
Hello MPI: processor 8 of 16 on veredas5
Hello MPI: processor 6 of 16 on veredas4
Hello MPI: processor 9 of 16 on veredas5
Hello MPI: processor 10 of 16 on veredas5
Hello MPI: processor 11 of 16 on veredas5
Hello MPI: processor 12 of 16 on veredas5
Hello MPI: processor 13 of 16 on veredas5
Hello MPI: processor 14 of 16 on veredas5

Tarefas paralelas com threads (MPI+OpenMP)


Jobs Paralelos (MPI-multithreded)


Jobs Paralelos (threads/OpenMP)


Múltiplas tarefas simultâneas em um único job


Jobs Interativos



Variáveis de ambiente do Slurm

Submissão de jobs

Verificar Status

Remover jobs da fila ou em execução