3. SLURM
3.1. Introdução
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, sendo centenas de supercomputadores da lista TOP500.
O Slurm Workload Manager possui três funções principais:
Alocar nós computacionais para acesso exclusivo ou não-exclusivo (compartilhado) aos usuários por um determinado período de tempo necessário para executar as tarefas computacionais submetidas através de jobs.
Oferecer um ambiente integrado que permite executar e monitorar em tempo real as tarefas lançadas nos nós computacionais alocados.
Gerenciar a fila de submissão, arbitrando conflitos entre os pedidos de recursos computacionais.
3.2. Principais comandos
Comando |
Exemplo |
Descrição |
|---|---|---|
sbatch |
|
submete um job |
squeue |
|
mostra o status dos jobs |
scancel |
|
cancela o job na fila |
sinfo |
|
informações sobre os recursos |
salloc |
|
submete um job iterativo |
3.3. Variáveis de ambiente
Variáveis de ambiente definidas diretamente no comando sbatch são automaticamente
herdadas pelo seu trabalho. No entanto, para garantir a execução consistente e
reprodutível do seu programa, é altamente recomendável definir todas as variáveis de
ambiente necessárias diretamente no script de trabalho. Essa prática elimina dependências
de configurações externas e facilita a reprodução precisa dos resultados do trabalho,
caso seja necessário em um momento futuro.
As principais variáveis de ambiente oriundas do SLURM estão listadas na tabela abaixo.
Para informações adicionais, consulte a página de manual do sbatch com o comando
man sbatch.
Variável |
Definição |
|---|---|
|
ID de identificação do Job |
|
Diretório onde o job foi executado |
|
Arquivo contendo nomes dos host alocados |
|
Número total de núcleos para o Job |
3.4. Diretivas Comuns
Os jobs scripts do SLURM possuem diversas diretivas que são definidas com o #SBATCH
no início da linha. Abaixo segue uma lista com as principais diretivas.
Diretiva |
Descrição |
|---|---|
|
número de nodes |
|
número de tarefas |
|
número de tarefas por nó |
|
nome do job |
|
arquivo de saída (%x: jobName, %j: jobId) |
|
partição ou fila |
|
especifica o tipo e número de GPUs |
|
limite total de execução |
Atenção
As diretivas do sbatch são iniciadas com #SBATCH e devem aparecer
na parte superior do arquivo de envio, antes de qualquer outra linha,
exceto a primeira linha que é a definição do SHELL (por exemplo,
#!/bin/bash).
3.5. Exemplos de jobs
A seguir serão descritos alguns exemplos de jobs.
3.5.1. Genérico: 1 node
1#!/bin/bash
2#SBATCH --nodes=1
3#SBATCH --ntasks=96
4#SBATCH -J teste
5#SBATCH -o %x-%j.out
6#SBATCH -p cpuq
7#SBATCH --time=3:00:00
8
9# load modules
10module load biblioteca-xyz
11# list nodes
12echo ${SLURM_JOB_NODELIST}
13# change dir
14cd ${SLURM_SUBMIT_DIR}
15# program
16prog
Linha |
Opção/Comando |
Descrição |
|---|---|---|
1 |
|
Shell utilizado para os comandos do job |
2 |
|
Aloca 1 node para execução |
3 |
|
Aloca todas as 96 threads disponíveis no node |
4 |
|
Define o nome do job como |
5 |
|
Direciona os arquivos de saída e erro para um único arquivo |
6 |
|
Seleciona a partição (fila) de CPU |
7 |
|
Define o tempo máximo de processamento do job (walltime) |
10 |
|
Módulos necessários para a execução do programa (bibliotecas, etc) |
12 |
|
Lista dos nós que foram alocados |
14 |
|
Diretório onde o comando |
16 |
|
Execução do programa |
3.5.2. GPU: 1 node + 1 GPU
1 #!/bin/bash
2 #SBATCH --nodes=1
3 #SBATCH --ntasks=28
4 #SBATCH -J teste
5 #SBATCH -o %x-%j.out
6 #SBATCH -p gpuq
7 #SBATCH --gpus=1
8 #SBATCH --time=3:00:00
9
10 # list nodes
11 echo $SLURM_JOB_NODELIST
12 # change dir
13 cd $SLURM_SUBMIT_DIR
14 # program
15 nvidia-smi
Atenção
No ambiente SLURM, a alocação de GPUs é um processo totalmente explícito. A simples existência de GPUs nos nós computacionais não garante sua utilização.
É mandatório que o job solicite o recurso adicionando a diretiva #SBATCH --gpus=X
ao script de submissão. A variável X deve ser definida com a quantidade de GPUs
necessárias para a execução do trabalho (de 1 a 8), como em destaque na linha 7 do job.
3.5.3. MPI
Este exemplo, está detalhado no item Exemplo de Aplicações neste Guia do Usuário.
O script mpi.job de submissão define a quantidade de nós de processamento e a
quantidade de processos (total e por nó), além disso, ele carrega o módulo
correspondente ao MPI, que foi usado para compilar o programa, e a execução do
mesmo. Esses itens estão em destaque no script abaixo.
#!/bin/bash
#SBATCH -J mpi-test
#SBATCH -p cpuq
#SBATCH --nodes 2
#SBATCH --ntasks-per-node=96
#SBATCH --ntasks 192
#SBATCH -o %x-%j.out
# modules
module load mvapich2
cd $SLURM_SUBMIT_DIR
mpirun ./mpi_hello_world_mvapich2
3.6. Exemplos de comandos
3.6.1. sbatch
Submetendo o job
exemplo.job
[user1@sismom-1 ~]$ sbatch exemplo.job
Submitted batch job 26
3.6.2. squeue
Verificando o status da fila
[user1@sismom-1 ~]$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
11 cpuq exemplo user1 R 01:34 1 sismom-1
12 gpuq fcnn0 user2 R 2:57:35 1 gpu01
Nota
Para ver apenas os seus próprios jobs, digite o comando squeue --me.
3.6.3. scancel
Cancelando o job
12
[user1@sismom-1 ~]$ scancel 12
3.6.4. sinfo
Coletando informações da fila
[user1@sismom-1 ~]$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
cpuq* up infinite 2 idle sismom-[1-2]
gpuq up infinite 1 idle gpu01
Nota
Repare que, em geral, o nome das filas PARTITION se refere ao
tipo de fila, CPU cpuq e GPU gpuq.
[user1@sismom-1 ~]$ sinfo -Nl
NODELIST NODES PARTITION STATE CPUS S:C:T MEMORY TMP_DISK WEIGHT AVAIL_FE REASON
gpu01 1 gpu idle 224 2:56:2 206300 0 1 (null) none
sismom-1 1 cpu* idle 96 2:24:2 128000 0 1 (null) none
sismom-2 1 cpu* idle 96 2:24:2 128000 0 1 (null) none
[user1@sismom-1 ~]$ sinfo -o "%.9n %.5a %.5t %.4c %m %.10G %.15f"
HOSTNAMES AVAIL STATE CPUS MEMORY GRES AVAIL_FEATURES
sismom-1 up idle 96 128000 (null) (null)
sismom-2 up idle 96 128000 (null) (null)
gpu01 up idle 224 2063000 gpu:h200:8 (null)
3.6.5. salloc
3.6.5.1. Sessão iterativa
3.6.5.1.1. CPU
Para alocar um job iterativo para uso de CPU, utilize a partição cpuq.
[user1@sismom-1 ~]$ salloc -N1 -p cpuq
salloc: Granted job allocation 18
[user1@sismom-1 ~]$ exit
exit
salloc: Relinquishing job allocation 18
3.6.5.1.2. GPU
No caso de GPU é um pouco diferente, pois é necessário especificar a GPU também.
Exemplificando, alocando 1 nó na fila GPU gpuq.
[user1@sismom-1 ~]$ salloc -N1 -p gpuq
salloc: Granted job allocation 14
[user1@gpu01 ~]$ nvidia-smi
No devices were found
[user1@gpu01 ~]$ exit
Atenção
É necessário acrescentar o parâmetro --gpus no comando salloc para que o
SLURM aloque a GPU na sessão iterativa.
Como pode-se observar o job não teve acesso a nenhuma GPU.
Executando o mesmo comando, mas solicitando apenas 1 GPU. Repare que o nó é o mesmo.
[user1@sismom-1 ~]$ salloc -N1 -p gpuq --gpus=1
salloc: Granted job allocation 15
[user1@gpu01 ~]$ nvidia-smi
Wed Dec 10 15:26:45 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.95.05 Driver Version: 580.95.05 CUDA Version: 13.0 |
+-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA H200 Off | 00000000:0A:00.0 Off | 0 |
| N/A 31C P0 77W / 700W | 0MiB / 143771MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+
[user1@gpu01 ~]$ exit
exit
salloc: Relinquishing job allocation 15
Desta forma, dependendo da submissão, pode-se executar até oito jobs no mesmo nó, desde que cada um use uma GPU e 1/8 do recurso do nó.
Outro exemplo, alocando 2 GPUs disponíveis no nó.
[user1@sismom-1 ~]$ salloc -N1 -p gpuq --gpus=2
salloc: Granted job allocation 16
[user1@gpu01 ~]$ nvidia-smi
Wed Dec 10 15:29:49 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.95.05 Driver Version: 580.95.05 CUDA Version: 13.0 |
+-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA H200 Off | 00000000:0A:00.0 Off | 0 |
| N/A 31C P0 77W / 700W | 0MiB / 143771MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+------------------------+----------------------+
| 1 NVIDIA H200 Off | 00000000:18:00.0 Off | 0 |
| N/A 25C P0 76W / 700W | 0MiB / 143771MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+
[user1@gpu01 ~]$ exit
exit
salloc: Relinquishing job allocation 16
Nota
Particularmente neste último comando, se omitir o parâmetro -N1 e se tiver mais de 1 (um)
nó com GPU, pode acontecer do SLURM alocar as GPUs em nós diferentes.
Importante
Quando terminar suas tarefas no modo iterativo, certifique-se de liberar/cancelar sua alocação,
caso necessário usando o comando scancel ${SLURM_JOB_ID} se estiver dentro do nó ou
scancel <jobId> caso esteja em outro terminal, a fim que os recursos de computação
não fiquem presos e ociosos.