Cluster LABIC · Slurm + Apptainer
Guia do usuário do cluster
Como acessar o cluster e rodar suas simulações nas GPUs L40S usando o escalonador Slurm. Feito para alunos e pesquisadores — não precisa de VPN, tudo pela porta pública do bastion, de qualquer rede.
1. Acessando o cluster
ssh -p 8888 <seu-usuario>@labic.utfpr.edu.br
No primeiro login, o sistema pede para trocar a senha temporária que o administrador te passou. Troque com calma — o Kerberos só deixa trocar a senha uma vez por hora; se errar, peça para o administrador resetar de novo em vez de ficar tentando.
Você cai direto no seu home NFS (/home/<seu-usuario>, cota padrão 100 GB),
que é o mesmo em qualquer nó — o que você grava aqui aparece igual em qualquer lugar que seu job rodar.
⚠️ Você não tem shell nos nós de computação — só no
bastion. Todo uso de GPU/CPU passa pelo Slurm. Isso é proposital: uma sessão SSH solta num nó não entra no cgroup do job e furaria o isolamento de GPU/CPU/memória que o escalonador garante.
Transferir arquivos
scp -P 8888 arquivo.txt <seu-usuario>@labic.utfpr.edu.br:~/
rsync -avz -e 'ssh -p 8888' pasta/ <seu-usuario>@labic.utfpr.edu.br:~/pasta/
# sshfs também funciona para montar o home localmente:
sshfs -p 8888 <seu-usuario>@labic.utfpr.edu.br:/home/<seu-usuario> ~/labic-mnt
2. O cluster em duas filas (partitions)
| Partition | Nós | Recursos | Quando usar |
|---|---|---|---|
debug (padrão) | slurmvm1 | 2 CPU, 3.5 GB RAM, sem GPU | testar um script antes de gastar GPU |
l40s | gpu11-r770 + gpu06 | 6× GPU L40S (48 GB cada) no total — gpu11-r770: 2 GPUs / 48 threads; gpu06: 4 GPUs | qualquer job que precise de GPU |
Se você não especificar --partition, cai em debug (sem GPU).
3. Comandos essenciais
| Comando | Para que serve |
|---|---|
sinfo | ver o estado das filas/nós |
squeue | ver os jobs na fila (só os seus, por padrão) |
sbatch script.sh | submeter um job em lote (fila, roda sozinho) |
srun ... | rodar algo na hora, em primeiro plano |
salloc ... | reservar CPU/GPU por um tempo e rodar vários comandos |
scancel <jobid> | cancelar um job seu |
sacct | histórico dos seus jobs (status, tempo, uso de CPU/GPU) |
Você só vê e cancela os seus próprios jobs — configuração deliberada do cluster (
PrivateData=jobs), não um bug.
4. Em lote (sbatch) ou alocando na hora (srun/salloc)
sbatchsó coloca um script na fila. Você não espera — o Slurm roda quando sobrar recurso e escreve o resultado num arquivo. É o jeito certo para treinos longos.srun/sallocreservam o recurso pra você, na hora, como se você tivesse "logado" num pedaço do nó. A alocação fica presa ao seu terminal — ao desconectar ou terminar, o Slurm libera sozinho. Ideal para testar, debugar ou abrir um shell/Jupyter com GPU.
4.1 Em lote (sbatch) — rodar e ir embora
#!/bin/bash
#SBATCH --job-name=meu-teste
#SBATCH --cpus-per-task=2
#SBATCH --mem=2G
#SBATCH --time=00:10:00
#SBATCH --output=%x-%j.out
echo "Rodando no nó: $(hostname)"
python3 meu_script.py
sbatch script.sbatch
squeue # acompanha
cat meu-teste-<jobid>.out # saída, no diretório de onde você rodou o sbatch
Regras rápidas: submeta sempre do seu home NFS, nunca de /tmp (é local ao
bastion e não existe nos nós); --output=%x-%j.out grava como
<job>-<jobid>.out; --time é um limite e o job é morto se passar dele.
4.2 Na hora, em primeiro plano (srun)
srun sem sbatch aloca o recurso e já roda o comando ali, com a saída no seu
terminal. Ao terminar, a alocação é devolvida sozinha:
srun --partition=debug --time=00:05:00 bash -c "hostname; sleep 3; echo terminei"
Para um shell interativo de verdade num nó, use --pty:
srun --partition=l40s --gres=gpu:l40s:1 --time=00:30:00 --pty bash
nvidia-smi -L
exit # sai do shell E libera a alocação
⚠️
--ptysó funciona de um terminal de verdade (sessão SSH interativa). De dentro de script/cron/automação falha comdisregarding --pty option— o comando roda, mas sem shell interativo. É assim que o SSH/pty funciona, não é bug.
4.3 Reservar por um tempo (salloc)
Para segurar um pedaço do cluster e rodar vários comandos sem voltar pra fila a cada um:
salloc --partition=l40s --gres=gpu:l40s:1 --time=00:30:00
srun nvidia-smi -L # usa a GPU já reservada, sem re-filar
srun python3 treino.py
exit # ou Ctrl+D — libera a alocação inteira
| Você quer… | Use |
|---|---|
| Rodar um treino longo e desconectar | sbatch |
| Rodar um comando rápido e ver o resultado na hora | srun comando |
| Um shell/console interativo num nó (com ou sem GPU) | srun --pty bash |
| Testar vários comandos sem re-filar (debug, notebook) | salloc, depois srun dentro |
⚠️ Sem
--time, a alocação não tem limite. Nada te protege de esquecer umsrun --pty/sallocaberto segurando uma GPU por horas. Sempre passe--time, principalmente em sessões interativas — é fácil tirar a única GPU livre do ar para os colegas.
5. Usando GPU
Sem --gres, seu job não enxerga GPU nenhuma — mesmo na fila l40s. E é
silencioso: nvidia-smi responde "No devices found", sem erro. Sempre peça a GPU:
$ srun --partition=l40s --time=00:01:00 nvidia-smi -L
No devices found.
$ srun --partition=l40s --gres=gpu:l40s:1 --time=00:01:00 nvidia-smi -L
GPU 0: NVIDIA L40S (UUID: GPU-9de4e7fa-...)
#!/bin/bash
#SBATCH --job-name=job-gpu
#SBATCH --partition=l40s
#SBATCH --gres=gpu:l40s:1 # 1 GPU L40S (por nó: gpu11-r770 tem 2, gpu06 tem 4)
#SBATCH --cpus-per-task=8
#SBATCH --mem=16G
#SBATCH --time=01:00:00
#SBATCH --output=%x-%j.out
nvidia-smi -L
python3 treino.py
Cuidado com memória: o Slurm trava
--mem(seu job não passa do limite), mas não considera RAM ao decidir o que cabe no nó junto com outros jobs — só conta CPUs. Peça só o que precisa e não assuma que o resto está livre.
6. Reprodutibilidade com Apptainer
Não há Docker nos nós — use Apptainer (compatível com imagens Docker). Convenção: guarde suas
imagens em ~/images/.
# rodar uma imagem Docker diretamente (--nv expõe os drivers NVIDIA; precisa de --gres)
apptainer exec --nv docker://pytorch/pytorch:latest python3 --version
Para dependências pesadas, construa sua própria imagem .def e rode num job:
apptainer build ~/images/meuapp.sif meuapp.def
# dentro do job Slurm:
apptainer exec --nv \
--pwd /opt/app \
--bind "$HOME/dados:/dados" \
"$HOME/images/meuapp.sif" python3 treino.py
--pwdé importante: o Apptainer herda o diretório de onde você chamou o comando, não oWORKDIRda imagem — sem ele, imports relativos quebram silenciosamente sobsbatch. Construir um.sifé pesado: faça numa sessão interativa (srun --pty) ou na sua máquina, não dentro de umsbatchde produção.
7. Sintomas → causa
| Sintoma | Causa provável | O que fazer |
|---|---|---|
nvidia-smi diz "No devices found" | Esqueceu --gres=gpu:... | Adicione --gres=gpu:l40s:1 (por nó: até 2 no gpu11-r770, até 4 no gpu06) |
Invalid generic resource (gres) specification | Nome/contagem de GRES errado | Confirme com sinfo -o "%P %G" o nome exato do GRES |
| Job fica pendente muito tempo | Fila cheia | A l40s tem 6 GPUs (2 gpu11-r770 + 4 gpu06); squeue mostra quem está na frente |
Import falha só sob sbatch | Diretório de trabalho errado no Apptainer | Use --pwd explícito |
| Job cancelado antes de terminar | Estourou --time | Aumente o --time no #SBATCH |
Saída do sbatch nunca aparece, mas sacct mostra COMPLETED | Submeteu de fora do home NFS (ex.: /tmp) | Rode sempre a partir do seu home NFS |
| Não consigo trocar a senha depois de errar | Limite de 1 troca/hora (Kerberos) | Espere a hora, ou peça reset a um administrador |
ssh -p 8888 não conecta | Porta errada | Confirme que é :8888, não :2222 (antiga) |
8. Suporte
Dúvidas, problemas ou pedidos de mais cota/recursos: labic@utfpr.edu.br · ou abra um chamado em suporte.labic.ct.utfpr.edu.br.