Servidor com Suporte a GPUs Compartilhadas


O Instituto de Computação (IC) disponibiliza um servidor de alto desempenho equipado com suporte para até dez GPUs, destinadas ao uso compartilhado.

O recurso pode ser utilizado em atividades de ensino, pesquisa, extensão, testes e validação de soluções de Inteligência Artificial relacionadas à graduação e à pós-graduação.

1. Como solicitar acesso

O acesso às GPUs deverá ser solicitado pelo docente responsável pela atividade ou pelo projeto.

A solicitação deverá ser encaminhada para:

suporte@ic.unicamp.br

Na mensagem, deverão ser informados os dados do aluno ou usuário que receberá a permissão de acesso.

Após a aprovação, a equipe do IC habilitará o acesso no usuário institucional informado. A conexão será realizada por SSH utilizando:

Servidor: gpus.lab.ic.unicamp.br
Porta: 22

O usuário e a senha poderão corresponder à conta institucional do IC ou à conta SiSe. As informações específicas serão encaminhadas por e-mail durante a liberação do acesso.

2. Redes autorizadas para acesso

A partir de agora, o acesso ao servidor gpus.lab.ic.unicamp.br deverá ser realizado a partir da rede da UNICAMP, utilizando uma das seguintes opções:

  • rede Wi-Fi eduroam;

  • rede cabeada da Universidade;

  • VPN UNICAMP;

  • servidores públicos de SSH do Instituto de Computação:

    • ssh.ic.unicamp.br, para usuários staff e de doutorado;

    • ssh.students.ic.unicamp.br ou ssh2.students.ic.unicamp.br, para usuários de graduação e mestrado.

Essa medida tem como objetivo reduzir a exposição direta do servidor à Internet, diminuindo tentativas de ataques de força bruta e de negação de serviço.

A mudança também permite concentrar o acesso externo em menos pontos de controle, facilitando o monitoramento e aumentando a segurança do ambiente.

3. Conexão direta por SSH

Quando o computador estiver conectado a uma das redes autorizadas, utilize:

ssh seuusuario@gpus.lab.ic.unicamp.br

Substitua seuusuario pelo seu nome de usuário institucional.

4. Acesso a partir do Windows

Em alguns ambientes Windows, poderá ocorrer o seguinte erro durante a conexão:

Corrupted MAC on input.
ssh_dispatch_run_fatal: Connection to X port 22: message authentication code incorrect

Nesse caso, especifique explicitamente o algoritmo de criptografia:

ssh -c aes256-gcm@openssh.com seuusuario@gpus.lab.ic.unicamp.br

5. Formas de Acesso por SSH for de Redes Unicamp

O acesso por SSH for de redes da Unicamp pode ser feito atraves de 3 formas:

1) Proxy Jump usando ssh -J seu_usuario@ssh.ic.unicamp.br seu_usuario@gpus.lab.ic.unicamp.br

Esse método você utiliza o ssh do ic como caminho e conexão.

2) Túnel com port forwarding usando ssh -N -L 9000:gpus.lab.ic.unicamp.br:22 seu_usuario@ssh.ic.unicamp.br

e depois pode conectar em outro terminal (mantendo o anterior aberto) utilizando ssh -p 9000 seu_usuario@localhost

Nesse caso dá para transferir arquivos como descrito mais abaixo.

3) SSH manual

ssh seu_usuario@ssh.ic.unicamp.br e dentro ssh seu_usuario@gpus.lab.ic.unicamp.br

6. Transferência de arquivos a partir de uma rede externa

Caso seja necessário copiar dados para o servidor a partir de uma rede externa à UNICAMP, sem utilizar a VPN, é possível criar um túnel SSH por meio de um dos servidores públicos do Instituto de Computação.

6.1 Usuários staff e de doutorado

Crie o túnel utilizando:

ssh -N -L 9000:gpus.lab.ic.unicamp.br:22 seuusuario@ssh.ic.unicamp.br

Esse comando cria, no computador local, um túnel na porta 9000, encaminhando as conexões para a porta SSH do servidor gpus.lab.ic.unicamp.br.

A sessão deverá permanecer aberta durante todo o período em que o túnel estiver sendo utilizado.

Em outro terminal, copie um arquivo utilizando:

scp -P 9000 arquivo seuusuario@localhost:/caminho/de/destino/

Para copiar um diretório completo, utilize:

scp -r -P 9000 diretorio seuusuario@localhost:/caminho/de/destino/

6.2 Usuários de graduação e mestrado

Os usuários de graduação e mestrado deverão substituir ssh.ic.unicamp.br por um dos seguintes servidores:

ssh.students.ic.unicamp.br
ssh2.students.ic.unicamp.br

Exemplo:

ssh -N -L 9000:gpus.lab.ic.unicamp.br:22 seuusuario@ssh.students.ic.unicamp.br

Depois de estabelecer o túnel, os comandos scp permanecem os mesmos:

scp -P 9000 arquivo seuusuario@localhost:/caminho/de/destino/

ou:

scp -r -P 9000 diretorio seuusuario@localhost:/caminho/de/destino/

7. Monitoramento das GPUs

Para visualizar as GPUs disponíveis, o consumo de memória, a utilização e os processos ativos, execute:

nvidia-smi

Antes de iniciar uma tarefa, verifique se a GPU pretendida está disponível e se há outros processos em execução.

8. Seleção de uma GPU

Para executar um processo em uma GPU específica, defina a variável de ambiente CUDA_VISIBLE_DEVICES.

GPU NVIDIA TITAN X Pascal — 12 GB

export CUDA_VISIBLE_DEVICES=0

GPU NVIDIA GTX 1080 Ti — 11 GB

export CUDA_VISIBLE_DEVICES=1

GPU NVIDIA A5500 — 24 GB

export CUDA_VISIBLE_DEVICES=2

GPU NVIDIA A5500 — 24 GB

export CUDA_VISIBLE_DEVICES=3

GPU NVIDIA GTX 1080 Ti — 11 GB

export CUDA_VISIBLE_DEVICES=4

Depois de definir a variável, execute normalmente o programa:

export CUDA_VISIBLE_DEVICES=2
python3 programa.py

Dentro do processo, a GPU selecionada normalmente aparecerá como dispositivo 0, pois as demais GPUs ficarão ocultas para aquela execução.

9. Instalação de bibliotecas Python

Recomenda-se utilizar um ambiente virtual Python para evitar conflitos entre bibliotecas de diferentes usuários e projetos.

Exemplo:

python3 -m venv ~/venvs/meu-projeto
source ~/venvs/meu-projeto/bin/activate
pip install --upgrade pip
pip install nome-da-biblioteca

Quando não for utilizado um ambiente virtual, as bibliotecas poderão ser instaladas apenas para o usuário com:

pip install nome-da-biblioteca --user

A maioria das bibliotecas utilizadas com GPUs não exige permissões administrativas. Somente componentes que alterem o sistema operacional, drivers ou bibliotecas globais poderão exigir privilégios adicionais.

10. Uso de Docker com GPUs

O ambiente permite a execução de contêineres Docker com acesso às GPUs.

Utilizar todas as GPUs disponíveis

docker run -it --rm --gpus all \
  nvidia/cuda:11.0.3-base-ubuntu20.04 \
  nvidia-smi

Utilizar somente a GPU 0

docker run -it --rm --gpus device=0 \
  nvidia/cuda:11.0.3-base-ubuntu20.04 \
  nvidia-smi

Utilizar somente a GPU 1

docker run -it --rm --gpus device=1 \
  nvidia/cuda:11.0.3-base-ubuntu20.04 \
  nvidia-smi

Utilizar somente a GPU 2

docker run -it --rm --gpus device=2 \
  nvidia/cuda:11.0.3-base-ubuntu20.04 \
  nvidia-smi

Para utilizar outra GPU, substitua o número informado em device=.

Antes de iniciar um contêiner, consulte a utilização das GPUs com:

nvidia-smi

11. Acesso ao Ollama

O ambiente também conta com o Ollama, que permite executar modelos de linguagem localmente.

Para listar os modelos instalados:

ollama list

Exemplos de modelos que poderão estar disponíveis:

codellama:13b
gemma:7b
llama2:13b
qwen:4b

A lista poderá ser alterada conforme atualizações e necessidades do ambiente. O comando ollama list deve ser utilizado para consultar os modelos efetivamente instalados.

Para executar um modelo:

ollama run qwen:4b

12. Gerenciamento da memória das GPUs

A memória de vídeo, denominada VRAM, é limitada e compartilhada entre os processos executados em cada GPU.

A seleção da GPU pode ser feita por meio da variável:

CUDA_VISIBLE_DEVICES

ou, no Docker, por meio do parâmetro:

--gpus device=X

A utilização de memória e processamento deverá ser acompanhada com:

nvidia-smi

Não existe, de maneira geral, um mecanismo nativo de swap entre disco e VRAM equivalente ao swap convencional entre RAM e disco.

Quando os dados ou o modelo ultrapassarem a capacidade da VRAM, poderão ser adotadas técnicas como:

  • processamento dos dados em blocos;

  • transferência controlada entre RAM e GPU;

  • carregamento sob demanda;

  • descarregamento de partes do modelo para a RAM;

  • uso de memória unificada, quando suportada;

  • uso de bibliotecas específicas para modelos maiores que a memória disponível.

12.1 Processamento em blocos com PyTorch

import torch

data_cpu = torch.randn(1_000_000, 1_000)

for inicio in range(0, data_cpu.size(0), 100_000):
    bloco_gpu = data_cpu[inicio:inicio + 100_000].cuda()

    resultado_gpu = bloco_gpu * 2

    del bloco_gpu
    del resultado_gpu

    torch.cuda.empty_cache()

Nesse exemplo, somente uma parte dos dados é transferida para a GPU em cada iteração, reduzindo o consumo simultâneo de VRAM.

O comando torch.cuda.empty_cache() libera blocos de memória mantidos no cache do PyTorch, mas não remove tensores que ainda estejam referenciados pelo programa.

12.2 Utilização de dados armazenados em disco

Para conjuntos de dados que não podem ser mantidos integralmente na RAM, ferramentas como Dask e Zarr permitem carregar e processar os dados em blocos.

Exemplo:

import dask.array as da
import cupy as cp

dados = da.from_zarr("large_data.zarr")

for bloco in dados.to_delayed().ravel():
    bloco_gpu = cp.asarray(bloco.compute())

    resultado = bloco_gpu * 2

    del bloco_gpu
    del resultado

    cp.get_default_memory_pool().free_all_blocks()

Essa estratégia permite carregar os dados gradualmente, transferindo para a GPU somente os blocos necessários.

12.3 Memória unificada CUDA

Em GPUs e ambientes compatíveis, a memória unificada do CUDA permite que a CPU e a GPU acessem um espaço de memória gerenciado pelo runtime CUDA.

Exemplo conceitual com PyCUDA:

import numpy as np
import pycuda.autoinit
import pycuda.driver as cuda

dados_cpu = np.random.randn(1_000_000).astype(np.float32)

dados_unificados = cuda.managed_zeros(
    dados_cpu.shape,
    dados_cpu.dtype,
    mem_flags=cuda.mem_attach_flags.GLOBAL
)

dados_unificados[:] = dados_cpu

O suporte e o desempenho dessa técnica dependem da GPU, do driver, da versão do CUDA e do padrão de acesso aos dados. A memória unificada não deve ser interpretada como uma ampliação gratuita da VRAM, pois transferências frequentes entre RAM e GPU podem reduzir significativamente o desempenho.

13. Boas práticas de utilização

Por se tratar de um ambiente compartilhado, os usuários deverão:

  • verificar a utilização das GPUs antes de iniciar uma tarefa;

  • selecionar somente as GPUs necessárias;

  • evitar reservar todas as GPUs sem necessidade;

  • remover contêineres e processos que não estejam mais sendo utilizados;

  • encerrar processos abandonados;

  • manter os dados organizados no diretório do próprio usuário;

  • não compartilhar senhas ou credenciais;

  • não expor serviços diretamente à Internet;

  • utilizar ambientes virtuais ou contêineres para reduzir conflitos entre dependências;

  • comunicar à equipe do IC a ocorrência de falhas, comportamentos inesperados ou problemas de segurança.

Dúvidas ou solicitações relacionadas ao ambiente deverão ser encaminhadas para:

suporte@ic.unicamp.br