Guia do Slurm

O Slurm é um escalonador de tarefas e um gerenciador de recursos combinados que permitem que os usuários executem seus trabalhos nos clusters de computação de alto desempenho (HPC). O Slurm foi implantado em vários centros de computação nacionais e internacionais e em aproximadamente 60% dos supercomputadores TOP500 do mundo.

O Slurm Workload Manager possui três funções principais:

  1. 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).
  2. Oferecer um ambiente integrado que permite executar e monitorar em tempo real as tarefas lançadas nos nós computacionais alocados.
  3. Gerenciar a fila de submissão, arbitrando conflitos entre os pedidos de recursos computacionais.

Recursos de Computação

Um cluster HPC é composto por vários nós de processamento, cada um com uma determinada quantidade de processadores, memória e GPUs. O usuário envia tarefas que especificam os aplicativos que eles querem executar, juntamente com uma descrição dos recursos de computação necessários para executar os aplicativos.

As unidades de processamento nos nós são os núcleos. Com o advento das arquiteturas Simultaneous Multithreading (SMT), os núcleos únicos podem ter vários threads de hardware (algumas vezes conhecidos como hyper-threads). Os elementos de processamento são chamados genericamente de CPU. Para sistemas sem SMT, uma CPU é um núcleo. Para sistemas com SMT disponível e ativado, uma CPU é um encadeamento de hardware.

Jobs em Lote

O comando sbatch é usado para submeter um script em lote ao Slurm. Ele foi projetado para rejeitar o trabalho no momento do envio, se houver solicitações ou restrições que o Slurm não possa atender conforme especificado. Isso dá ao usuário a oportunidade de examinar a solicitação de tarefa e reenviá-la com as correções necessárias.

Jobs Seriais e Paralelos

Jobs paralelos iniciam aplicativos que são compostos por muitos processos (também conhecidos como tasks) que se comunicam, normalmente por meio de um switch de alta velocidade. Jobs em série iniciam uma ou mais tarefas que funcionam independentemente em problemas separados.

Softwares que utilizam paralelismo devem ser ativados pelo comando srun. Softwares seriais podem usar srun para iniciá-los, mas não é necessário nas alocações de um nó.

Script de Execução

A maneira típica de criar um trabalho é escrever um script de envio . Um script de envio é um script de shell , por exemplo, um script Bash , cujos comentários, se forem prefixados com SBATCH , são entendidos pelo Slurm como parâmetros que descrevem solicitações de recursos e outras opções de envio. Você pode obter a lista completa de parâmetros na página executando o comando man sbatch .

As diretivas do SBATCH devem aparecer na parte superior do arquivo de envio, antes de qualquer outra linha, exceto a primeira linha que deve ser o shebang (por exemplo, #!/bin/bash).

Para configurar corretamente um script de tarefa, você precisará conhecer o formato geral do script, os comandos que deseja usar, como solicitar os recursos necessários para a execução da tarefa e, possivelmente, algumas das variáveis ​​de ambiente Slurm.

O script da tarefa em lote é composto por quatro componentes principais:

  • O intérprete usado para executar o script
  • Diretivas “#” que transmitem opções de envio padrão.
  • A configuração de variáveis ​​de ambiente e/ou script (se necessário)
  • Os aplicativos a serem executados, juntamente com seus argumentos e opções de entrada.

Aqui está um exemplo de um script em lote que solicita 2 nós e inicia 24 tarefas na partição “medim” utilizando o software myApp :

#!/bin/bash
#SBATCH -J Exemplo            # Nome do job
#SBATCH -p long               # Fila (medium/long/gpu)
#SBATCH --nodes 2             # Numero mínimo de servidores
#SBATCH --ntasks 24           # Numero total de processos

ulimit -s unlimited
ulimit -a

srun myApp

Quando a tarefa está programada para ser executada, o gerenciador de recursos executará o script da tarefa em lote no primeiro nó da alocação.

Comandos Básico do Slurm

Para aprender sobre todas as opções disponíveis para cada comando, insira man <comando> enquanto estiver conectado ao ambiente do Cluster.

ComandoDefinição
sbatchEnvia scripts de tarefas para a fila de execução
scancelCancela um job
scontrolUsado para exibir o estado Slurm (várias opções disponíveis apenas para root)
sinfoExibir estado de partições e nós
squeueExibir estado dos jobs
sallocEnvia um job para execução ou inicia um trabalho em tempo real

Especificando Recursos

O Slurm tem sua própria sintaxe para solicitar recursos de computação. Abaixo está uma tabela de resumo de alguns recursos solicitados com frequência e a sintaxe de Slurm para obtê-los. Para obter uma lista completa da sintaxe, execute o comando man sbatch.

Sintaxe Significado
#SBATCH -p public Define a partição em que o job será executado (medium/long/gpu).
#SBATCH -J job_name Define o nome do Job
#SBATCH -n quantidade Define o número total de tarefas da CPU.
#SBATCH -N quantidade Define o número de nós de computação solicitados.
#SBATCH –ntasks-per-n quantidadeDefine o número de tarefas por nó.

Variáveis de Ambiente

Quaisquer variáveis ​​de ambiente que você definiu com o comando sbatch serão passadas para o seu trabalho. Por esse motivo, se o seu programa precisar de determinadas variáveis ​​de ambiente definidas para funcionar corretamente, é melhor colocá-las no seu script de trabalho. Isso também facilita a reprodução dos resultados do trabalho posteriormente, se necessário.

NOTA : As variáveis ​​de ambiente substituirão todas as opções definidas em um script em lote e as opções de linha de comando substituirão as variáveis ​​de ambiente definidas anteriormente.

Informações sobre algumas das variáveis ​​comuns de ambiente de entrada e saída disponíveis no script de tarefa sbatch estão listadas na tabela abaixo. Para informações adicionais, consulte a página de manual do sbatch.

VariávelDefinição
$SLURM_JOB_IDID de identificação do Job
$SLURM_SUBMIT_DIRDiretório onde o job foi executado
$SLURM_JOB_NODELISTArquivo contendo nomes dos host alocados
$SLURM_NTASKSNúmero total de núcleos para o Job

Determinando quais Recursos Solicitar

Antes de enviar um trabalho para processamento em lote, é importante saber quais são os requisitos do seu programa para que ele possa ser executado corretamente. Cada programa e fluxo de trabalho possui requisitos exclusivos, portanto, recomendamos que você determine quais recursos você precisa antes de se sentar para escrever seu script.

Lembre-se de que, embora aumentar a quantidade de recursos de computação solicitados possa diminuir o tempo necessário para executar seu trabalho, também aumentará a quantidade de tempo que seu trabalho gasta aguardando na fila. Você pode solicitar os recursos de que precisa, mas esteja ciente de que outros pesquisadores também poderão usar esses recursos.

Executando um Job

Após ter construído o script de execução com todas basta chama-lo utilizando o comando sbatch como mostra o exemplo abaixo:

[usuario@padufc ~]$ sbatch meuScript.srm 

Se o script estiver correto haverá uma saída que indica o ID do job. Por exemplo:

[usuario@padufc ~]$ sbatch meuScript.srm  
Submitted batch job 987654

Andamento do Job

A maioria das especificações de um job pode ser vista através do comando scontrol show job idDoJob . Mais detalhes sobre o trabalho, incluindo o script do trabalho, podem ser vistos adicionando o sinalizador -d . Um usuário não consegue ver o script do trabalho de outro usuário.

[usuario@padufc ~]$ scontrol show job 987654  

O Slurm captura e relata o código de saída do script do job (tarefas sbatch), bem como o sinal que causou o término da execução.

O registro de um trabalho permanece na memória de Slurm por 5 minutos após a conclusão. O comando scontrol show job retornará “Invalid job id specified” para um trabalho que foi concluído há mais de 5 minutos. Nesse ponto, é necessário utilzar o comando sacct -j idDoJob para recuperar o registro da tarefa do banco de dados Slurm. Por Exemplo

[usuario@padufc ~]$ sacct -j 987654 

Cancelando um Job

Se seu Job estiver em execução ou aguardando na fila, você poderá cancelar o trabalho usando o comando scancel idDoJob . Use o comando squeue se você não souber o ID do Job. Por exemplo:

[usuario@padufc ~]$ scancel 987654 

Referências