Referência Completa de Diretivas SLURM

Introdução

Este guia fornece uma referência completa das diretivas SLURM mais importantes para uso no GridUnesp. Você pode usar-o como consulta rápida ao criar seus scripts de submissão.

Nota

Para exemplos práticos completos, veja: Processando Simulações.

Estrutura Básica de um Script

Todo script SLURM segue esta estrutura:

#!/bin/bash
#SBATCH [DIRETIVAS AQUI]

# Carregar módulos
module load software/versao

# Seus comandos
./seu_programa

Diretivas Essenciais

Estas são as diretivas que você usará em quase todos os jobs:

Identificação do Job

Diretiva

Descrição

Exemplo

--job-name=NOME

Nome do job (aparece no squeue)

#SBATCH --job-name=minha_simulacao

--output=ARQUIVO

Arquivo de saída (stdout)

#SBATCH --output=job_%j.out

--error=ARQUIVO

Arquivo de erros (stderr)

#SBATCH --error=job_%j.err

Dica

Variáveis úteis:

  • %j = Job ID

  • %x = Job name

  • %u = Username

Exemplo: --output=logs/%x_%j.out cria logs/meu_job_12345.out

Recursos de Computação

Diretiva

Descrição

Exemplo

--nodes=N

Número de nós

#SBATCH --nodes=2

--ntasks=N

Número total de tarefas/processos

#SBATCH --ntasks=16

--ntasks-per-node=N

Tarefas por nó

#SBATCH --ntasks-per-node=28

--cpus-per-task=N

CPUs por tarefa (para threads)

#SBATCH --cpus-per-task=4

Partição e Tempo

Diretiva

Descrição

Exemplo

--partition=NOME

Partição a usar

#SBATCH --partition=short

--time=HH:MM:SS

Tempo máximo de execução

#SBATCH --time=12:00:00

--time=D-HH:MM:SS

Tempo com dias

#SBATCH --time=2-00:00:00

Memória

Diretiva

Descrição

Exemplo

--mem=SIZE

Memória total por nó

#SBATCH --mem=64G

--mem-per-cpu=SIZE

Memória por CPU

#SBATCH --mem-per-cpu=4G

Aviso

Não use --mem e --mem-per-cpu juntos! Você pode escolher um.

Recursos Especiais

Diretiva

Descrição

Exemplo

--gres=RECURSO:N

Recursos genéricos (GPUs)

#SBATCH --gres=gpu:1

--gres=gpu:MODEL:N

GPU específica

#SBATCH --gres=gpu:l40s:2

Diretivas Avançadas

E-mail e Notificações

Diretiva

Descrição

Exemplo

--mail-type=EVENTO

Quando enviar e-mail

#SBATCH --mail-type=END,FAIL

--mail-user=EMAIL

Seu e-mail

#SBATCH --mail-user=voce@unesp.br

Eventos disponíveis para --mail-type:

  • BEGIN - Quando o job inicia

  • END - Quando o job termina

  • FAIL - Se o job falhar

  • ALL - Todos os eventos

  • NONE - Sem notificações

Job Arrays

Diretiva

Descrição

Exemplo

--array=ÍNDICES

Criar array de jobs

#SBATCH --array=1-100

--array=LISTA

Índices específicos

#SBATCH --array=1,5,10,20

--array=INÍCIO-FIM:PASSO

Com incremento

#SBATCH --array=0-100:5

--array=ÍNDICES%LIMITE

Máximo simultâneo

#SBATCH --array=1-1000%50

Variáveis de ambiente em arrays:

  • $SLURM_ARRAY_TASK_ID - Índice atual do job array

  • $SLURM_ARRAY_JOB_ID - ID do job array

  • $SLURM_ARRAY_TASK_COUNT - Total de jobs

Dependências entre Jobs

Diretiva

Descrição

Exemplo

--dependency=TIPO:JOBID

Depende de outro job

#SBATCH --dependency=afterok:12345

Tipos de dependência:

  • after:JOBID - Após job iniciar

  • afterok:JOBID - Após job terminar com sucesso

  • afternotok:JOBID - Após job falhar

  • afterany:JOBID - Após job terminar (sucesso ou falha)

  • singleton - Apenas um job com este nome por vez

Controle de Recursos

Diretiva

Descrição

Exemplo

--exclusive

Nó exclusivo (não compartilhado)

#SBATCH --exclusive

--constraint=FEATURE

Requer característica específica

#SBATCH --constraint=avx2

Distribuição de Tarefas

Diretiva

Descrição

Exemplo

--distribution=TIPO

Como distribuir jobs

#SBATCH --distribution=cyclic

Tipos de distribuição:

  • block - Bloco contíguo

  • cyclic - Round-robin

  • plane - Por plano

Controle de Saída

Diretiva

Descrição

Exemplo

--open-mode=MODO

Modo de abertura do arquivo

#SBATCH --open-mode=append

Modos:

  • append - Adicionar ao arquivo existente

  • truncate - Sobrescrever arquivo

Reinício e Checkpoints

Diretiva

Descrição

Exemplo

--requeue

Permite requeue automático

#SBATCH --requeue

--no-requeue

Não permite requeue

#SBATCH --no-requeue

Exemplos Práticos Completos

Job Serial Simples

#!/bin/bash
#SBATCH --job-name=serial_test
#SBATCH --partition=short
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=1
#SBATCH --mem=4G
#SBATCH --time=02:00:00
#SBATCH --output=serial_%j.out
#SBATCH --error=serial_%j.err

python meu_script.py

Job Paralelo OpenMP

#!/bin/bash
#SBATCH --job-name=openmp_job
#SBATCH --partition=short
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=28
#SBATCH --mem=64G
#SBATCH --time=12:00:00
#SBATCH --output=openmp_%j.out

export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
./meu_programa_openmp

Job Paralelo MPI

#!/bin/bash
#SBATCH --job-name=mpi_job
#SBATCH --partition=short
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=28
#SBATCH --mem-per-cpu=4G
#SBATCH --time=24:00:00
#SBATCH --output=mpi_%j.out

module load openmpi/4.1
mpirun -np 112 ./meu_programa_mpi

Job Híbrido MPI + OpenMP

#!/bin/bash
#SBATCH --job-name=hybrid_job
#SBATCH --partition=medium
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=7
#SBATCH --mem=64G
#SBATCH --time=48:00:00
#SBATCH --output=hybrid_%j.out

export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
module load openmpi/4.1
srun ./programa_hibrido

Job com GPU

#!/bin/bash
#SBATCH --job-name=gpu_job
#SBATCH --partition=gpu
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=8
#SBATCH --gres=gpu:1
#SBATCH --mem=32G
#SBATCH --time=12:00:00
#SBATCH --output=gpu_%j.out

module load cuda/11.8
./programa_cuda

Job com Múltiplas GPUs

#!/bin/bash
#SBATCH --job-name=multi_gpu
#SBATCH --partition=gpu
#SBATCH --nodes=1
#SBATCH --gres=gpu:4
#SBATCH --cpus-per-task=48
#SBATCH --mem=128G
#SBATCH --time=24:00:00
#SBATCH --output=mgpu_%j.out

module load cuda/11.8
./programa_multi_gpu

Job Array

#!/bin/bash
#SBATCH --job-name=array_job
#SBATCH --partition=short
#SBATCH --array=1-100
#SBATCH --ntasks=1
#SBATCH --mem=4G
#SBATCH --time=01:00:00
#SBATCH --output=array_%A_%a.out

# Processar arquivo específico deste índice
INPUT_FILE="input_${SLURM_ARRAY_TASK_ID}.dat"
OUTPUT_FILE="output_${SLURM_ARRAY_TASK_ID}.dat"

./processar $INPUT_FILE > $OUTPUT_FILE

Job Array com Limite de Simultâneos

#!/bin/bash
#SBATCH --job-name=limited_array
#SBATCH --partition=short
#SBATCH --array=1-1000%50
#SBATCH --ntasks=1
#SBATCH --mem=2G
#SBATCH --time=00:30:00
#SBATCH --output=limited_%A_%a.out

# Máximo de 50 jobs rodando simultaneamente
python processar.py --id $SLURM_ARRAY_TASK_ID

Jobs com Dependência

# Job 1: Pré-processamento
JOBID1=$(sbatch --parsable preprocess.sh)

# Job 2: Processamento (depende de Job 1)
JOBID2=$(sbatch --parsable --dependency=afterok:$JOBID1 process.sh)

# Job 3: Pós-processamento (depende de Job 2)
sbatch --dependency=afterok:$JOBID2 postprocess.sh

Job com Notificação por E-mail

#!/bin/bash
#SBATCH --job-name=long_simulation
#SBATCH --partition=medium
#SBATCH --ntasks=28
#SBATCH --time=72:00:00
#SBATCH --mail-type=BEGIN,END,FAIL
#SBATCH --mail-user=voce@unesp.br
#SBATCH --output=simulation_%j.out

# Receba e-mail quando job começar, terminar ou falhar
./simulacao_longa

Variáveis de Ambiente SLURM

O SLURM define várias variáveis de ambiente úteis:

Identificação

$SLURM_JOB_ID          # ID do job
$SLURM_JOB_NAME        # Nome do job
$SLURM_JOB_USER        # Usuário que submeteu
$SLURM_SUBMIT_DIR      # Diretório de submissão

Recursos

$SLURM_NTASKS          # Número de tarefas
$SLURM_CPUS_PER_TASK   # CPUs por tarefa
$SLURM_MEM_PER_NODE    # Memória por nó (MB)
$SLURM_NNODES          # Número de nós

Nós e Localização

$SLURM_NODELIST        # Lista de nós alocados
$SLURM_NODE_ALIASES    # Aliases dos nós
$SLURM_JOB_NODELIST    # Nós do job

Arrays

$SLURM_ARRAY_JOB_ID    # ID do job array
$SLURM_ARRAY_TASK_ID   # Índice da tarefa atual
$SLURM_ARRAY_TASK_MIN  # Índice mínimo
$SLURM_ARRAY_TASK_MAX  # Índice máximo

Exemplo de Uso

#!/bin/bash
#SBATCH --job-name=test
#SBATCH --ntasks=4

echo "Job ID: $SLURM_JOB_ID"
echo "Job Name: $SLURM_JOB_NAME"
echo "Número de tarefas: $SLURM_NTASKS"
echo "Nós alocados: $SLURM_NODELIST"
echo "Diretório de submissão: $SLURM_SUBMIT_DIR"

Comandos SLURM Úteis

Submissão e Controle

# Submeter job
sbatch script.sh

# Submeter com override de opções
sbatch --time=10:00:00 --mem=32G script.sh

# Cancelar job
scancel JOBID

# Cancelar todos os seus jobs
scancel -u $USER

# Cancelar por nome
scancel --name=job_name

Monitoramento

# Ver fila
squeue

# Ver apenas seus jobs
squeue -u $USER

# Ver detalhes de um job
scontrol show job JOBID
scontrol show job 123456

# Ver informação de partições
sinfo

# Ver uso de recursos
sstat --format=JobID,MaxRSS,AveCPU JOBID.batch
sstat --format=JobID,MaxRSS,AveCPU 14321.batch

Histórico e Contabilidade

# Ver jobs completados
sacct

# Ver detalhes de job específico
sacct -j JOBID --format=JobID,JobName,State,Elapsed,MaxRSS

# Ver jobs das últimas 24 horas
sacct --starttime=now-1day

Dicas e Melhores Práticas

Estimando Recursos

  1. Comece pequeno: Teste com jobs curtos primeiro

  2. Monitore uso real: Você pode usar sacct para ver quanto realmente usou

  3. Ajuste gradualmente: Aumente recursos conforme necessário

Otimizando Tempo de Espera

  1. Peça tempo realista: Jobs curtos começam mais rápido

  2. Você pode usar apenas recursos necessários: Não peça 28 núcleos se precisa de 4

  3. Considere job arrays: Em vez de um job gigante

Evitando Erros Comuns

Não faça:

#SBATCH --nodes=2
#SBATCH --ntasks=1     # ERRO: desperdício de recursos pois um nó ficará ocioso

Faça:

#SBATCH --nodes=2
#SBATCH --ntasks-per-node=8

Organizando Outputs

#!/bin/bash
#SBATCH --output=logs/%x_%j.out
#SBATCH --error=logs/%x_%j.err

# Criar diretório de logs se não existir
mkdir -p logs

Debugging

Para debug, adicione informações ao output:

#!/bin/bash
#SBATCH ...

echo "Job iniciado em: $(date)"
echo "Rodando em: $(hostname)"
echo "Diretório: $(pwd)"
echo "Nós alocados: $SLURM_NODELIST"
echo ""

# Seu código aqui

echo ""
echo "Job finalizado em: $(date)"

Referências

Ver também

Outros recursos:

Última atualização sobre Diretivas SLURM: Fevereiro 2025

Tip: Bookmark esta página para consulta rápida!