quarta-feira, 25 de março de 2026

Criando uma workstation multi-GPU para IA, distribuindo a carga de VRAM

O uso de GPUs para executar LLMs localmente coloca a quantidade de VRAM disponível na máquina, na placa de vídeo, normalmente, como o fator limitante do tamanho do modelo a ser carregado. Algumas arquiteturas de computadores resolvem em parte este problema em parte com uma memória unificada (como máquinas da Apple ou alguns notebooks Windows ARM) e, de fato, isso dá uma certa flexibilidade. Nestes casos existe ainda a restrição da memória total, que em geral é cara e não pode ser aumentada (depois da compra, pois nestes modelos normalmente é soldada, e antes da compra até pode-se configurar mais, só que a peso de ouro).

Mas e se usarmos duas (ou mais) GPUs, poderíamos usar as duas para carregar um modelo maior do que seria suportando individualmente por cada uma, redistribuindo o uso de memória entre as duas? A boa notícia é que isso é possível e relativamente fácil de configurar no Ollama, e possivelmente em outras plataformas similares. Deescreverei um breve experimento para verificar a viabilidade técnica, sem entrar na comparação de custos com outras opções, como a compra de uma GPU maior que a soma das duas, lembrando que a eficiência não é só dependente da quantidade de VRAM, teria que ser feita umas análise custo/benefício completa, comparar diversas placas e conjuntos de placas, rodando benchmarks. A idéia aqui é apenas ver se funciona. No entanto usar as duas GPUs pode ser a diferença em algumas situações entre conseguir rodar o modelo ou não. 

Voltando ao cenário concreto, tenho duas GPUs GTX-1080 (EVGA e Asus ROG), já obsoletas, sem as últimas tecnologias, mas ainda com capacidade razoável para execução de LLMs, com 8 GB de VRAM cada. Alias, um outro motivador para o teste, tenho outras duas GPUs mais atuais, RTX 3060Ti e RX 6600, mas todas tem 8 GB, e não tenho como com uma única placa rodar modelo maior. Tenho à disposição também uma máquina Linux (Ubuntu 24.04 LTS) com 16 GB de RAM, Core i7 6700K e aproximadamente 1.5 TB em SSD SATA (480 Gb + 1 TB). A CPU bem antiga obviamente não é a melhor escolha para uma máquina de produção deste tipo, mas se mostrou válida para o teste. Provavelmente esta solução funcionará com outras GPUs, incluindo AMD, mas isso não foi testado, embora as GPUs nVidia dominem largamente o mercado e seriam o caso mais comum. Também não vejo porque não funcionaria em outras distros linux ou mesmo no Windows. De todo modo, para registro, o teste foi feito com sucesso com Ubuntu Linux e nVidia. Apenas a facilidade de balanceamento de carga de memória do Ollama é que não sei se é similar em outras soluções deste tipo, lembrando que o Ollama está disponível também em Windows.  

O primeiro passo é a instalação física da segunda placa de video. O PC usado já tinha uma GTX 1080 no slot principal (16x). Olhando no manual da motherboard e planejando uma separação saudável entre as duas placas, para evitar aquecimento, coloquei a segunda placa dois slots abaixo depois. É uma placa ATX normal, e elas ficaram a uns 10 cm de distância entre si. Importante, não utilizei pontes SLI entre as placas. Uma pesquisa rápida me mostrou que agora em 2026 o SLI está totalmente morto, não é utilizado nem em jogos e muito menos o Ollama não utilizaria esta via para comunicação de dados. Tudo é feito pelo barramento normal do PC. Notar também que no segundo slot PCI-e utilizado, por limitações da placa mãe, a velocidade ficou em 4x. Isso não causou problema algum. Outros dois pontos de atenção aqui, o gabinete, que pode ser um ATX barato, mas o ideal é que não seja muito compacto, por motivos obvios, e ofereça boa ventilação. E a fonte de alimentação tem que segurar tudo, ser de qualidade razoável (aliás isso sempre, independente do uso), e ter boa margem na potência total. Usei uma Corsair CX750M, também nada muito extraordinário. 

Próximo passo, ligar o PC e confirmar que tudo continua funcionando como antes (a não ser talvez por alguns jogos, como comento no último parágrafo, e que podem precisar de ajustes nas configurações e parametros de inicialização para forçar a placa certa). Neste momento estamos com duas GPUs, a "GPU 0", na qual está ligado o monitor (ou mais), e a "GPU 1", a qual vai ficar em princípio apenas para processamento. Um fato interessante é que como usei placas semelhantes, de chipsets iguais, na maioria das vezes dentro de jogos, não tenho como diferenciar pois aparecem exatamente com a mesma descrição. tenho que ir por tentativa e erro, levando em conta a ordem em que aparecem, ou que a primieira é a zero e a segunda é a 1, o que eventualmente não é verdade. Um pequeno contratempo, mas de qualquer modo são apenas duas tentativas (e não 3 como no USB-A... rs). As vezes, como no comando a seguir, é possivel diferencia-las por alguma característica. Por exemplo, a Asus tem uma potência máxima maior (198 W contra 180W da EVGA e isso já aparece logo no comando a seguir).  

Entre agora em um terminal e rode:

            nvidia-smi

Isso obviamente só vale para nVidia, placas AMD e Intel devem ter algo semelhante. Deve aparecer uma saída semelhante à tela abaixo (clique pra aumentar se necessário):


Aqui podemos ver que a segunda placa, a "GPU 1", está conectada corretamente e acessível, do contrário não apareceria, e vemos como disse antes, a capacidade máxima listada de 198W. Note também que o Xorg já alocou um processo nela, há como impedir isso completamente mas não achei necessário. Além disso é possivel acompanhar dados sobre a saúde da placa, percentual de uso dos fans, temperatura e bem importante, a memória usada por cada processo. É por aqui que comprovaremos que o modelo está sendo distribuído entre as duas placas (além do fato que muitos deles nem caberiam em apenas uma). Isso conclui a etapa da instalação da segunda GPU, confirmando que o PC continua normal e a segunda placa foi instalada corretamente e reconhecida pelo sistema. 

A próxima etapa já será observar um modelo rodando nas duas. Em seguida, caso já não tenha no seu PC, instale o Ollama:

            curl -fsSL https://ollama.com/install.sh | sh

Agora teste com um modelo pequeno, para um download rápido:

            ollama run mistral-nemo

Recomendo explorar um pouco o Ollama no terminal, mesmo que depois a intenção seja usar pela interface Web, apesar de ser linha de comando é bem simples e intuitivo. Rode o comando "nvidia-smi" em outra janela de terminal, de preferência enquanto a IA estiver pensando, se bem que ela não desaloca a memória imediatamente depois, por eficiência, já que o usuário pode continuar mandando prompts no mesmo chat. Observe que a GPU 1 já está sendo usada pelo Ollama.

Agora vamos testar um modelo maior, que fará mais sentido neste teste. Rode por exemplo, no terminal:

            ollama run llama3.1:8b-instruct-q8_0

ou o "gemma3:12b", ou o "gpt-oss:20b", ou qualquer um se sua escolha, o importante aqui é escolher um que caiba na capacidade total somada das suas duas placas e que seja maior do que uma das duas placas. No caso aqui estou escolhendo modelos entre 8 e 16 GB (porque as duas placas aqui tem 8 GB, no caso do seu teste o valor total pode ser diferente). O ponto é provar que estou rodando um modelo que não poderia por estar com apenas uma das duas placas. Pelos meus testes, quando o modelo é maior ou nem abre ou fica extremamente lento. Aqui a coisa começa a ficar interessante, rode de novo "nvidia-smi" em outra janela de terminal, com a IA grande resolvendo algum prompt, o que pode até ser difícil, já que a maioria dos comandos fois resolvida de imediato e é dificil encontrar algum que demora, mas como também mencionei, não é crítico. Observe abaixo:



O total consumido pelo modelo é 5.974 MB + 6.736 MB, ou seja, mais de 8 e, além disso, note com a GPU 1 está sendo mais usada.

A seguir um item de preparação, que é de certa forma opcional em um teste rápiudo, mas e rápido e demonstra um cenário mais realista. A intenção é que o Ollama interfira o minimo nas aplicaçãoes graficas rodando, seja jogo ou outra aplicação profissional. Para isso o procedimento abaixo inverte a prioridade de uso das GPUs pelo Ollama:  

                              sudo systemctl edit ollama.service

E no editor que irá abrir, inserir:

            [Service] 

            Environment="CUDA_VISIBLE_DEVICES=1,0" 

            Environment="OLLAMA_HOST=0.0.0.0"

Salve e saia. A primeira linha muda a prioridade de uso do Ollama, e a segunda será necessária depois para compatibilizar com o Web-UI, e já que estamos com a mão na massa podemos inserir logo. Essa mudança de prioridade das GPUs também vai ajudar na compatibilização com jogos, podendo eventualmente se dar ao luxo de jogar e deixar a IA rodando, dependendo da VRAM consumida por cada um deles, o jogo e o modelo. Os jogos (se for o caso) deverão rodar sempre na GPU 0, ao passa que o Ollama começara a preencher pela GPU 1, embora acabe balanceando entre as duas, como poderá ser observado rodando de vez em quando o "nvidia-smi". 

Logo a seguir execute no terminal:

            sudo systemctl daemon-reload

            sudo systemctl restart ollama

Após tudo funcionando e testado, ainda existem algumas considerações a fazer. Primero que, para uso prático é interessante instalar uma interface web, como o conhecido Web-UI. Na realidade quando escrevo já fiz isso e ela está operacional, mas não vou incluir aqui para não ficar tão extenso. Penso em publicar depois o procedimento de instalaçâo, apenas para registro, mas em todo caso o processo não tem muito mistério e pode ser encontrado na Web. O foco aqui foi mais a novidade, pelo menos para mim, do uso de mais de uma placa. Cabe apenas ressaltar aqui que existe um segundo método de instalação em que tudo é instalado por container, ao contrário da que usei, na qual o Ollama é instalado direto no sistema operacional host e depois a WebUi apenas acessa a API do Ollama pelo protocolo padrão. 

O outro ponto é a compatibilidade com outras aplicações gráficas na máquina. No meu caso tenho a pretensão de também usar este PC para jogar alguns jogos no Steam e no Lutris. Antes quando estava usando apenas uma GTX 1080 tudo funcionava perfeitamente. Ao inserir a segunda placa tive que fazer algumas configurações para evitar conflitos em alguns jogos, que se confundem com a existência da segunda placa e podem direcionar o processamento para ela, com resultados adversos (lembrando que a segunda placa não controla vídeo). Na realidade a instalação do Web-UI e a resolução deste conflitos demorou muito mais tempo que a primeira parte que foi fazer os modelos funcionarem nas duas placas, mas também nada extraordiário. A compatibilização dos jogos acho que vale um terceiro post.

A questão final: vale a pena para uso prático montar PC multi GPU para IA? Acho que depende muito, mas já adiantando que provavelmente eu manterei o resultado desta implementação o meu para uso pessoal. Na minha realidade não precisei comprar nenhuma peça, e complementando depois com configurações para tornar o uso mais prático, como instalaçâo Web-UI e outras configurações dos jogos, está se mostrando uma solução muito funcional e barata. Se eu tivesse um uso profissional remnunerado e orçamento tenderia a ir com uma unica placa poderosa e atual, mas estou apenas fazendo testes.

Caso não se tenha nenhuma GPU disponível teria que fazer as contas, comparar comprar duas ou uma única mais cara, bem como as diferenças de performance entre essas opções, pois existe o tráfego pelo barramento da máquina envolvido também. E também valeria a pena considerar o mercado de pĺacas usadas. Além disso, soluções assim  talvez façam mais sentido em ambiente de testes doméstico, profissional individual, já que com orçamento maior é fácil buscar opções prontas otimizadas. O custo pode até ficar menor, mas o usuário terá que garantir toda a compatibilidade das peças, tamanho do gabinete, capacidade da fonte, posição dos slots, etc.

Nenhum comentário:

Postar um comentário