Gerenciando tarefas no Slurm e automatizando
O que é o Slurm?
Imagine a siguinte situação, você tem muitos computadores e seu uso será compartilhado, pois quanto mais tempo um dispositivo passa ocioso, mais dinheiro é desperdiçado. Nesse caso, a centralização de infraestrutura computacional compartilhada é algo ideal, pois possibilita que os recursos fiquem mais tempo ocupados e se existir um meio de gerenciar a utilização em forma de filas, então temos um cenário incrívelmente bom.
Para esses casos, o Slurm é uma ferramenta sensacional, não é por acaso que 60% dos TOP500 utilizam essa ferramenta para gerir seus recursos. Se você é discente do INF/UFRGS, deve(ria) conhecer o PCAD e este texto foi feito baseado no que utilizei na disciplina de mestrado de Introdução a Computação de Alto Desempenho e fizeram parte do meu projeto para a disciplina, com esse conteúdo, você também terá a capacidade de automatizar todos as tarefas para serem executadas quantas vezes quiser, sem precisar se preocupar com a administração da infraestrutura em si e contando com as melhores placas de GPU do mercado, porque o time que administra o PCAD é incrível!
Comandos básicos do Slurm
Os comandos do Slurm podem ser utilizados de forma interativa ou em lote, no caso podemos ter interesse de ter acesso a apenas uma máquina, mas primeiro precisamos saber a mesma está disponível para utilização. Na página do PCAD tem um resumo muito bom sobre os comandos do Slurm no PCAD e recomendo muitíssimo a leitura para a continuação deste texto.
sinfo
Com o comando sinfo, podemos verificar se tem alguma máquina disponível para uso imediato! Se sim, podemos utilizar o modo iterativo, apesar de ser mais recomendado o sbatch.
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
shared* up 1-00:00:00 3 down* bali1,orion[1-2]
shared* up 1-00:00:00 9 idle bali2,draco[1-7],turing
blaise up 1-00:00:00 1 alloc blaise
sirius up infinite 1 idle sirius
tupi up 1-00:00:00 1 down* tupi3
tupi up 1-00:00:00 4 alloc tupi[1-2,4,6]
tupi up 1-00:00:00 1 idle tupi5
cidia up 2-00:00:00 1 idle cidia
orion up 1-00:00:00 2 down* orion[1-2]
draco up 1-00:00:00 7 idle draco[1-7]
beagle up 1-00:00:00 1 idle beagle
marcs up 3-00:00:00 1 idle marcs
poti up 1-00:00:00 5 idle poti[1-5]
lunaris up 1-00:00:00 1 idle lunaris
salloc
Podemos criar um job iterativo, é bem simples de se fazer e é para termos acesso a um shell e fazer as tarefas manualmente:
salloc -p tupi -w tupi1 -J teste -t 00:15:00
Nesse caso alocamos a partição tupi1 por 15 minutos e demos o nome do job de teste, depois disso basta acessar a máquina com ssh e o shell ficará disponível:
ssh tupi1
Para poupar a rede, devemos usar sempre o $SCRATCH para salvar os arquivos de registro ou para arquivos que serão utilizados no programa.
Truque com Sbatch
O sbatch pode receber um arquivo de entrada, assim como é mostrado no portal do PCAD, porém gostaria de mostrar um uso diferente, imagine que seja necessário executar um experimento em 10 máquinas diferentes do PCAD, seria necessário criar um arquivo para para máquina para o sbatch receber e se for necessário alterar os comandos, o tempo de execução ou qualquer outra informação, será que é uma boa ideia usar esse modelo?
O Bash é uma linguagem maravilhosa e assim como a linguagem C/C++, tudo é um fluxo (stream) de dados, podemos por exemplo utilizar os redirecionadores «< para criar um arquivo que vale por 10, 100 e quantos fossem necessários!
MACHINES="blaise tupi draco draco beagle marcs poti sirius lunaris grace"
for i in $MACHINES
do
sbatch <<< "#!/bin/bash
#SBATCH --job-name=experimento-$i-$1
#SBATCH --partition=$i
#SBATCH --nodes=1
#SBATCH --ntasks=16
#SBATCH --time=23:00:00
#SBATCH --output=%x_%j.out
#SBATCH --error=%x_%j.err
./experimento.sh $1"
done
Implementei o código acima durante a disciplina de Introdução a Computação de Alto Desempenho (CMP270) do PPGC da UFRGS, o que permitiu fazer um experimento com mais de 5000 execuções, completamente automatizado e o código está disponível: HPC UFRGS
Cancelando jobs
Obviamente podemos querer cancelar alguma job que foi enviado para a fila de execução, então podemos ver as informações com o comando squeue e cancelar com scancel:
lcsvillela@gppd-hpc:~$ squeue
JOBID PARTITION NAME USER STATE TIME TIME\_LIMIT NODES NODELIST(REASON) CPUS
699852 blaise lcsvillela lcsvillela RUNNING 22:08:55 1-00:00:00 1 blaise 88
lcsvillela@gppd-hpc:~$ scancel 699852
Conclusão
O Slurm é uma ferramenta incrível de se utilizar, pois permite o compartilhamento de hardware de forma eficiente, permitindo que o acesso à infraestrutura seja ampliado e possibilitando que experimentos sejam realizados por todos os discentes que necessitarem de GPUs por exemplo, que é um equipamento de alto custo.