Slurm - Veredas
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.
Índice
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