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:

  1. 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.

  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.

3.2. Principais comandos

Comando

Exemplo

Descrição

sbatch

sbatch test.job

submete um job

squeue

squeue -l

mostra o status dos jobs

scancel

scancel 40012

cancela o job na fila

sinfo

sinfo -Nl

informações sobre os recursos

salloc

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

${SLURM_JOB_ID}

ID de identificação do Job

${SLURM_SUBMIT_DIR}

Diretório onde o job foi executado

${SLURM_JOB_NODELIST}

Arquivo contendo nomes dos host alocados

${SLURM_NTASKS}

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 ou --nodes

número de nodes

-n ou --ntasks

número de tarefas

--ntasks-per-node

número de tarefas por nó

-J ou --job-name

nome do job

-o ou --output

arquivo de saída (%x: jobName, %j: jobId)

-p ou --partition

partição ou fila

-G ou --gpus

especifica o tipo e número de GPUs

-t ou --time

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
Descrição detalhada do job

Linha

Opção/Comando

Descrição

1

#!/bin/bash

Shell utilizado para os comandos do job

2

--nodes=1

Aloca 1 node para execução

3

--ntasks=96

Aloca todas as 96 threads disponíveis no node

4

-J teste

Define o nome do job como teste

5

-o %x-%j.out

Direciona os arquivos de saída e erro para um único arquivo

6

-p cpuq

Seleciona a partição (fila) de CPU

7

--time=3:00:00

Define o tempo máximo de processamento do job (walltime)

10

module load

Módulos necessários para a execução do programa (bibliotecas, etc)

12

$SLURM_JOB_NODELIST

Lista dos nós que foram alocados

14

cd $SLURM_SUBMIT_DIR

Diretório onde o comando sbatch foi executado

16

prog

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.