LABICUTFPR
← Guia do cluster

Cluster LABIC · VS Code Remote-SSH

VS Code no cluster

O VS Code conecta no cluster dentro de um job Slurm, num nó de computação (labic-job). Conectar o VS Code direto no bastion não funciona: ele não executa programas dos usuários. Esta página explica por quê e como configurar.

1. Primeiro: teste no seu computador

O cluster é para rodar o que já funciona, não para escrever e depurar o código do zero. O caminho é:

  1. Desenvolva e teste no seu computador, com uma amostra pequena dos dados e poucas iterações, até o script rodar do começo ao fim sem erro.
  2. Copie para o cluster (rsync / scp, ver guia) e rode de verdade com sbatch.
  3. Use o VS Code no cluster (labic-job) só para o que só dá para ver lá: um erro que aparece só na GPU L40S, um caminho de dados do cluster, um ajuste rápido antes de submeter.

Uma sessão de VS Code no cluster ocupa recursos de um nó o tempo todo em que está aberta, inclusive enquanto você só lê ou digita. Quanto mais você resolve localmente, mais máquina sobra para os jobs de todo mundo, incluindo os seus.

2. Por que não no bastion

O bastion é a porta de entrada: uma máquina pequena, compartilhada por todos, feita para copiar arquivos e submeter jobs. Por isso:

⚠️ Isso foi decidido depois de um caso real. Um VS Code rodando no bastion ficou preso no limite de memória e passou o dia relendo o próprio programa do servidor de arquivos: ~9 TB, que deixaram a rede lenta para o laboratório inteiro.

3. Login por chave

O labic-job não consegue pedir senha. No seu computador, crie uma chave e cadastre-a:

ssh-keygen -t ed25519                 # aceite o caminho padrão
ssh-copy-id -p 8888 <seu-usuario>@labic.utfpr.edu.br

No Windows, sem ssh-copy-id: copie o conteúdo de C:\Users\<você>\.ssh\id_ed25519.pub para o final de ~/.ssh/authorized_keys no bastion.

Depois, no seu computador, em ~/.ssh/config (Windows: C:\Users\<você>\.ssh\config):

Host labic
    HostName labic.utfpr.edu.br
    Port 8888
    User <seu-usuario>

Teste: ssh labic deve entrar sem pedir senha.

4. Configurar o labic-job

O VS Code conecta no bastion, que executa srun. O srun abre um job e, dentro dele, um servidor SSH seu, que roda como você e sem privilégios, e conversa pela própria conexão do srun. O VS Code roda no nó, dentro dos limites do job.

4.1 Uma vez, no bastion

Conectado ao bastion (ssh labic):

mkdir -p -m 700 ~/.ssh/labic-job && cd ~/.ssh/labic-job
ssh-keygen -q -t ed25519 -N '' -C labic-job-host -f host_key
cat > sshd_config <<EOF
HostKey $HOME/.ssh/labic-job/host_key
AuthorizedKeysFile $HOME/.ssh/labic-job/authorized_keys
PasswordAuthentication no
KbdInteractiveAuthentication no
UsePAM no
PidFile none
AllowTcpForwarding local
X11Forwarding no
Subsystem sftp internal-sftp
LogLevel ERROR
EOF

E autorize a chave do seu computador. No seu computador:

cat ~/.ssh/id_ed25519.pub | ssh labic 'cat >> ~/.ssh/labic-job/authorized_keys; chmod 600 ~/.ssh/labic-job/authorized_keys'

4.2 No seu computador: ~/.ssh/config

Acrescente abaixo do Host labic, trocando <seu-usuario> nos dois lugares:

Host labic-job
    User <seu-usuario>
    ProxyCommand ssh labic srun -u -p l40s -c 4 --mem=8G -t 8:00:00 -J vscode /usr/sbin/sshd -i -f /home/<seu-usuario>/.ssh/labic-job/sshd_config
    ServerAliveInterval 30
Host labic-job-gpu
    User <seu-usuario>
    ProxyCommand ssh labic srun -u -p l40s --gres=gpu:l40s:1 -c 4 --mem=16G -t 2:00:00 -J vscode /usr/sbin/sshd -i -f /home/<seu-usuario>/.ssh/labic-job/sshd_config
    ServerAliveInterval 30

Teste no terminal antes de usar o VS Code:

ssh labic-job hostname     # depois de alguns segundos, mostra o nome do nó (ex.: gpu11-r770), não "bastion"

Na primeira vez ele pergunta se você confia na chave do host labic-job: responda yes.

5. Conectar pelo VS Code

Em Preferences: Open User Settings (JSON):

"remote.SSH.connectTimeout": 120,
"remote.SSH.useLocalServer": true

O connectTimeout dá tempo para o job sair da fila. O useLocalServer reaproveita uma única conexão, e portanto um único job, para a janela toda. Depois: Remote-SSH: Connect to Host… → labic-job.

⚠️ Cada janela ocupa um job. Feche a janela quando terminar (File → Close Remote Connection). No fim do tempo (-t) o job acaba e o VS Code desconecta; "Reconnect" abre um job novo.

Para ver ou encerrar o job pelo bastion: squeue --me -n vscode / scancel --me -n vscode.

5.1 Treino longo: sbatch, não nohup

O terminal do VS Code roda dentro do job do labic-job, e esse job dura só enquanto a janela estiver conectada. Fechou a janela, caiu a rede ou o notebook dormiu: o job termina e o Slurm encerra tudo o que estava rodando nele. nohup, setsid, &, tmux e screen não adiantam.

Para algo que precisa continuar sozinho, submeta um job de verdade do próprio terminal do VS Code:

sbatch treino.sh                 # o job é independente da janela
squeue --me                      # acompanhar
tail -f slurm-<jobid>.out        # ver a saída
ParaUse
Editar, rodar um teste rápido, depuraro terminal do VS Code (labic-job). Morre quando a janela fecha
Treino, ou qualquer coisa que tem que continuar sozinhasbatch (como escrever o script). Continua rodando com a janela fechada

Assim você pode fechar o VS Code à noite: o treino segue no job dele, e os recursos do editor ficam livres para os outros.

Abra a pasta do projeto, não o home inteiro, e tire as pastas de dados e de saída da indexação. Pastas com milhares de imagens ou checkpoints deixam o VS Code lento e sobrecarregam o servidor de arquivos. Em .vscode/settings.json do projeto:

{
    "files.watcherExclude": {
        "**/data/**": true, "**/datasets/**": true, "**/output*/**": true,
        "**/checkpoints/**": true, "**/.venv/**": true, "**/wandb/**": true
    },
    "python.analysis.exclude": [
        "**/data", "**/datasets", "**/output*", "**/checkpoints", "**/.venv"
    ]
}

ℹ️ Dentro da sessão, as variáveis SLURM_* (e CUDA_VISIBLE_DEVICES) aparecem vazias. É normal: os limites de CPU, memória e GPU do job continuam valendo, porque o processo está dentro do job.

6. Problemas comuns

SintomaCausa provávelO que fazer
VS Code conectado em labic falha ao iniciar o servidor (Permission denied)O bastion não executa o servidor do VS CodeUse o labic-job (seção 4)
conda ou um programa do home dá Permission denied no bastionIdem: no bastion, nada do home executaRode dentro de um job (srun --pty bash ou labic-job)
Sessão no bastion cai sozinha durante algo pesadoA sessão esgotou a memória e foi encerradaFaça o trabalho pesado num job
labic-job trava em "Setting up SSH Host…" / kex_exchange_identificationFaltou -u no srun, ou o job está na filaConfira o -u; no bastion, squeue --me mostra se o job está PD (esperando)
labic-job: Permission denied (publickey)A chave do seu computador não está em ~/.ssh/labic-job/authorized_keys, ou as permissões estão erradasRefaça o fim da seção 4.1; chmod 700 ~/.ssh/labic-job; chmod 600 ~/.ssh/labic-job/*
labic-job pede senha ou falha sem mensagemO login no bastion ainda é por senhaFaça a seção 3 até ssh labic entrar sem senha
srun: error: … Exited with exit code 1Caminho do sshd_config errado no ProxyCommandUse o caminho absoluto /home/<seu-usuario>/.ssh/labic-job/sshd_config
Job PENDING com QOSGrpBillingMinutesSua cota de horas-GPU não cobre o -t pedidoDiminua o -t no ProxyCommand
Processo iniciado com nohup (ou em tmux) morreu quando fechei o VS CodeO job do labic-job acaba quando a janela desconecta, e leva tudo juntoRode com sbatch (seção 5.1)
VS Code desconecta depois de algumas horasO job chegou no limite -t"Reconnect" abre um job novo

Dúvidas? Comece pelo guia do cluster. Problemas: suporte.labic.ct.utfpr.edu.br.