Pular para conteúdo

Utilizando Clusters com o Slurm

Este guia ajudará você a aproveitar o poder dos clusters de computação de alto desempenho (HPC) usando o sistema de processamento em lote Slurm. Os sistemas de processamento em lote são essenciais para gerenciar os recursos de computação e as execuções em um sistema de HPC. Neste guia, abordaremos o básico sobre scripts de tarefas, envio e gerenciamento de tarefas, e comandos úteis com o Slurm Workload Manager.

Sendo um Bom Usuário do Cluster

Para garantir o desempenho ideal para todos que utilizam o cluster, siga estas diretrizes:

  • Evite executar cálculos pesados nos nós de login, pois isso pode prejudicar a capacidade de interação de todos com o cluster.
  • Faça solicitações de recursos para suas tarefas que reflitam com precisão o uso que elas farão. Alocações ineficientes de tarefas retardam o trabalho de todos nos clusters.
  • Se você planeja executar muitas tarefas semelhantes, utilize jobs arrays.

Se você precisar de ajuda para agendar uma tarefa, entre em contato com o suporte para obter assistência.

Visão Geral dos Sistemas de Processamento em Lote

Os sistemas de HPC dependem de sistemas de processamento em lote para gerenciar os recursos de computação e a execução de tarefas. Os usuários devem escrever scripts de tarefas contendo todas as informações necessárias para executar uma tarefa e enviá-los para o sistema de processamento em lote. O sistema de processamento em lote, então, aloca os recursos solicitados para a tarefa, dependendo da carga do sistema e da disponibilidade de nós de computação. Os sistemas de HPC são intrinsecamente não interativos, o que significa que as execuções não ocorrerão imediatamente após serem solicitadas, e os usuários não verão resultados intermediários em tempo real.

Visão Geral do Sistema de Processamento em Lote
Visão Geral do Sistema de Processamento em Lote.

Comandos Básicos do Slurm

Aqui estão alguns comandos essenciais para trabalhar com o sistema de processamento em lote Slurm:

  • sinfo: Visualizar informações sobre nós e partições do Slurm.
  • squeue: Listar tarefas em execução no sistema.
  • salloc: Obter uma alocação de tarefa do Slurm, executar um comando e liberar a alocação quando o comando for concluído.
  • srun -p <partição> --pty bash: Executar uma tarefa interativa.
  • sbatch <caminho do script>: Enviar um script de tarefa para execução.
  • srun -p <nome da partição> -n <número de tarefas> -c <CPUs por tarefa> <meu executável>: Enviar uma tarefa para execução.
  • sstat -j <ID da tarefa>: Verificar o status de uma tarefa.
  • scancel <ID da tarefa>: Cancelar uma tarefa.
  • scancel -u <nome de usuário>: Cancelar todas as tarefas do usuário.
  • sacct -j <ID da tarefa>: Exibir informações detalhadas sobre uma tarefa específica.
  • sacct -S <data e/ou hora>: Listar todas as tarefas que iniciaram após uma determinada data/hora.

Para opções adicionais e informações sobre esses comandos, você pode usar o parâmetro --help, a página de manual man <comando>, ou consultar a documentação em https://slurm.schedmd.com.

Envio e Gerenciamento de Tarefas com o Slurm

As tarefas são organizadas e agendadas usando o Slurm, um agendador de tarefas e gerenciador de carga de trabalho. Ao enviar uma tarefa, você deve especificar uma solicitação de recursos e executar um ou mais comandos ou aplicativos. As tarefas aguardam em uma fila e estão sujeitas a vários fatores que afetam a prioridade de agendamento. Uma vez que sua tarefa agendada começa, os comandos ou aplicativos especificados são executados nos nós de computação alocados. Se enviado como uma tarefa em lote (comando sbatch), a saída normalmente exibida na tela será salva em um arquivo (por padrão, slurm-<id da tarefa>.out).

Comandos Comuns do Slurm

Aqui estão alguns comandos comuns do Slurm:

  • Enviar um script chamado my_job.sh como uma tarefa:

    sbatch my_job.sh
    
  • Listar as tarefas enfileiradas e em execução:

    squeue --me
    

    Equivalente a --user=<meu nome de usuário>.

  • Cancelar uma tarefa enfileirada ou interromper uma tarefa em execução (por exemplo, uma tarefa com ID 12345):

    scancel 12345
    
  • Verificar o status de uma tarefa (por exemplo, uma tarefa com ID 12345):

    sacct -j 12345
    

Para obter mais informações sobre o monitoramento do uso de recursos, consulte a documentação sobre Monitoramento do Uso de CPU e Memória.

Solicitando Recursos de Computação

Ao enviar uma tarefa, você pode modificar o tamanho, duração e comportamento da tarefa usando várias opções. Essas opções podem ser especificadas ao chamar salloc ou sbatch, ou salvas em um script em lote. Valores padrão são usados para opções não especificadas. Algumas opções comuns de solicitação de tarefas incluem:

Opção Abreviação Valor padrão Descrição
--job-name -J Nome do script Nome personalizado da tarefa.
--output -o slurm-%j.out Local para salvar a saída padrão e saída de erro da tarefa.
--partition -p Varia por cluster Partição em que executar.
--account -A Deve ser especificado com base no projeto em que você está trabalhando.
--time -t Varia por partição Limite de tempo para a tarefa no formato D-HH:MM:SS.
--nodes -N 1 Número total de nós.
--ntasks -n 1 Número de tarefas (processos MPI).
--ntasks-per-node Decide o agendador Número de tarefas por nó.
--cpus-per-task -c 1 Número de CPUs por tarefa.
--mem Valor máximo Memória solicitada por nó em MiB.

Tarefas Interativas

Tarefas interativas são úteis para testar e depurar código. Para solicitar uma tarefa interativa, use o comando salloc. Isso irá alocar recursos e iniciar um shell em um nó de computação. Por exemplo, para solicitar uma tarefa interativa por 2 horas, use o seguinte comando:

salloc -A <minha conta> -p <nome da partição> -t 2:00:00

Esse comando atribuirá um nó para você por duas horas. Você pode executar comandos neste shell conforme necessário. Para sair, digite exit ou pressione Ctrl+D.

Tarefas em Lote

Você pode enviar um script como uma tarefa em lote, o que permite que ele seja executado em lotes sem interação. Os scripts de envio normalmente consistem em três partes:

  1. Uma linha hashbang especificando o programa que executará o script (geralmente #!/bin/bash).
  2. Diretivas que listam as opções de solicitação da tarefa, que devem aparecer antes de quaisquer outros comandos ou definições.
  3. Os comandos ou aplicativos que você deseja executar durante sua tarefa.

Para exemplos de scripts de envio, consulte a página de Exemplos de Scripts de Envio. Aqui está um exemplo de script de envio que imprime informações da tarefa e sai:

example_job.sh
#!/bin/bash
#SBATCH --job-name=example_job
#SBATCH --account=my_group_project
#SBATCH --partition=processing
#SBATCH --output=slurm-%j.out
#SBATCH --time=1:00:00
#SBATCH --nodes=1
#SBATCH --ntasks=1

echo "ID da tarefa: ${SLURM_JOB_ID}"
echo "Nó: $(hostname)"
echo "Data: $(date)"

Salve este arquivo como example_job.sh e envie-o com:

sbatch example_job.sh

Quando a tarefa terminar, a saída será armazenada em um arquivo chamado slurm-<jobid>.out, onde jobid é o ID da tarefa enviada.

Se você estiver escrevendo loops para submeter tarefas, considere usar job arrays em vez disso.