Referência Completa de Diretivas SLURM
Índice / Contents
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 |
|---|---|---|
|
Nome do job (aparece no squeue) |
|
|
Arquivo de saída (stdout) |
|
|
Arquivo de erros (stderr) |
|
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 |
|---|---|---|
|
Número de nós |
|
|
Número total de tarefas/processos |
|
|
Tarefas por nó |
|
|
CPUs por tarefa (para threads) |
|
Partição e Tempo
Diretiva |
Descrição |
Exemplo |
|---|---|---|
|
Partição a usar |
|
|
Tempo máximo de execução |
|
|
Tempo com dias |
|
Memória
Diretiva |
Descrição |
Exemplo |
|---|---|---|
|
Memória total por nó |
|
|
Memória por CPU |
|
Aviso
Não use --mem e --mem-per-cpu juntos! Você pode escolher um.
Recursos Especiais
Diretiva |
Descrição |
Exemplo |
|---|---|---|
|
Recursos genéricos (GPUs) |
|
|
GPU específica |
|
Diretivas Avançadas
E-mail e Notificações
Diretiva |
Descrição |
Exemplo |
|---|---|---|
|
Quando enviar e-mail |
|
|
Seu e-mail |
|
Eventos disponíveis para --mail-type:
BEGIN- Quando o job iniciaEND- Quando o job terminaFAIL- Se o job falharALL- Todos os eventosNONE- Sem notificações
Job Arrays
Diretiva |
Descrição |
Exemplo |
|---|---|---|
|
Criar array de jobs |
|
|
Índices específicos |
|
|
Com incremento |
|
|
Máximo simultâneo |
|
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 |
|---|---|---|
|
Depende de outro job |
|
Tipos de dependência:
after:JOBID- Após job iniciarafterok:JOBID- Após job terminar com sucessoafternotok:JOBID- Após job falharafterany:JOBID- Após job terminar (sucesso ou falha)singleton- Apenas um job com este nome por vez
Controle de Recursos
Diretiva |
Descrição |
Exemplo |
|---|---|---|
|
Nó exclusivo (não compartilhado) |
|
|
Requer característica específica |
|
Distribuição de Tarefas
Diretiva |
Descrição |
Exemplo |
|---|---|---|
|
Como distribuir jobs |
|
Tipos de distribuição:
block- Bloco contíguocyclic- Round-robinplane- Por plano
Controle de Saída
Diretiva |
Descrição |
Exemplo |
|---|---|---|
|
Modo de abertura do arquivo |
|
Modos:
append- Adicionar ao arquivo existentetruncate- Sobrescrever arquivo
Reinício e Checkpoints
Diretiva |
Descrição |
Exemplo |
|---|---|---|
|
Permite requeue automático |
|
|
Não permite 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
Comece pequeno: Teste com jobs curtos primeiro
Monitore uso real: Você pode usar
sacctpara ver quanto realmente usouAjuste gradualmente: Aumente recursos conforme necessário
Otimizando Tempo de Espera
Peça tempo realista: Jobs curtos começam mais rápido
Você pode usar apenas recursos necessários: Não peça 28 núcleos se precisa de 4
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
Processando Simulações - Guia prático de jobs
Partições e Limites de Recursos - Limites e políticas
Ver também
Outros recursos:
Job Array - Mais sobre job arrays
Memória Compartilhada - OpenMP
Memória Distribuída - MPI
Uso de GPUs - Uso de GPUs
—
Última atualização sobre Diretivas SLURM: Fevereiro 2025
Tip: Bookmark esta página para consulta rápida!