1 pontos por GN⁺ 2 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • Para complementar um ambiente local de LLM em que apenas uma RTX 4080 16GB não bastava, foi adicionada uma Tesla V100 SXM2 16GB usada com adaptador por cerca de £200, formando um total de 32GB de VRAM
  • A V100 SXM2 é uma GPU de servidor sem slot PCIe, saída de vídeo ou conector de energia comum, mas pôde ser instalada em um PC gamer com um adaptador SXM2-to-PCIe
  • O fan de servidor vinha com 82dB por padrão, inviável para uso em ambiente interno, mas ao conectá-lo ao header de fan da placa-mãe com um cabo jumper PH2.0-2.54mm foi possível obter controle por PWM e operação silenciosa
  • Com tensor splitting no llama.cpp, o modelo Qwen3.6-27B-MTP Q5_K_M foi dividido entre a RTX 4080 e a V100, alcançando contexto de 128k e velocidade de inferência de cerca de 32 tok/s
  • Não é tão elegante quanto uma única GPU de 32GB, e ainda há problemas de driver, CUDA e warm reboot, mas GPUs de servidor usadas podem ser uma alternativa barata para expandir VRAM em LLMs locais

Um ambiente local de LLM com 32GB por £200

  • Como os 16GB de VRAM da RTX 4080 não eram suficientes para rodar os modelos locais desejados, foi adicionada ao PC gamer uma GPU usada de datacenter com adaptador
  • Uma Tesla V100 SXM2 16GB e um adaptador SXM2-to-PCIe foram comprados por cerca de £200 no total, formando um ambiente com 32GB de VRAM somando as duas GPUs
  • Um modelo de 27B parâmetros foi distribuído entre as duas GPUs e executado a cerca de 32 tokens/s, com o modelo inteiro e o contexto cabendo na VRAM
  • Não entrega a mesma experiência de uma única GPU de consumo com 32GB, mas garante capacidade de VRAM a um custo muito menor do que uma RTX 5090 32GB

Tesla V100 SXM2 e o adaptador

  • A Tesla V100 SXM2 16GB é uma GPU voltada para servidores NVIDIA DGX e racks de hyperscalers
    • Não tem slot PCIe comum, saída de vídeo nem conector de energia padrão
    • Ela é montada em uma placa proprietária dentro do servidor e se comunica via NVLink
    • Para conectá-la diretamente à placa-mãe é necessário um adaptador separado
  • A V100 é uma GPU Volta com 16GB de memória HBM2 e 5120 CUDA cores
    • O preço pago no eBay foi de cerca de £150
    • Embora seja uma GPU de 2017, seu desempenho computacional e VRAM ainda seguem válidos para uso com LLM local
  • A largura de banda da memória HBM2 é a principal vantagem
    • A V100 oferece 900GB/s de largura de banda com barramento de memória de 4096 bits
    • Isso é 22% acima dos 736GB/s de GDDR6X da RTX 4080
    • Também supera os 400GB/s do Apple M3 Max, 546GB/s do M4 Max e 614GB/s do M5 Max
  • A AMD RX 7900 XTX tem 24GB de GDDR6 e 960GB/s de largura de banda, um pouco acima da V100, mas custa mais de £700
    • O suporte do ROCm para inferência de LLM ainda é considerado mais áspero do que o CUDA
    • A V100 entrega 94% da largura de banda da RX 7900 XTX por menos de um quarto do preço e funciona com llama.cpp
  • A RTX 5090, com 1.792GB/s de largura de banda, supera a V100 com folga, mas custa mais de £2.000
    • Em inferência de LLM, a largura de banda da memória é um gargalo que determina os tokens/s, então é um fator importante
  • O adaptador SXM2-to-PCIe não é um produto oficial da NVIDIA nem tem suporte oficial
    • Ele é uma placa PCB nua com soquete SXM2 de um lado e conector PCIe edge do outro
    • Custou cerca de £50, levando o custo total do conjunto para algo em torno de £200
    • Graças ao adaptador, foi possível conectar a V100 16GB à placa-mãe junto com a RTX 4080

O problema do fan de servidor e a solução

  • A V100 SXM2 foi projetada para operar no ambiente de refrigeração industrial de um servidor 2U
    • O fan do adaptador fazia barulho demais para uso em um cômodo comum
    • O ruído medido com um Apple Watch foi de 82dB, descrito como algo entre um triturador de lixo e um cortador de grama
  • No estado padrão, não havia controle do fan
    • Tentativas com nvidia-smi, enumeração de dispositivos no Linux e Windows Afterburner falharam
    • O fan do adaptador aparentemente foi feito partindo do princípio de que rodaria a 100% o tempo todo dentro de um rack de servidor
  • O teste com bateria de 9V foi usado para confirmar a pinagem do fan
    • Ao ligar jumpers em VCC e ground e encostar uma bateria de 9V, o fan girou
    • Como ficou muito mais silencioso do que no funcionamento padrão em 12V, confirmou-se a possibilidade de controle
  • O fan se comportou de forma semelhante a um fan padrão de gabinete de PC
    • Foram conectados jumpers ao conector do fan, e a outra ponta foi ligada a um header livre de fan da placa-mãe
    • A placa-mãe conseguiu ler o RPM e também controlar por PWM
    • Mesmo mantido em 10% de velocidade, a temperatura não passou de 50°C em carga total e o ruído ficou quase inaudível
  • O cabo final foi montado com um jumper cable macho 2.54mm para fêmea PH2.0
    • O conector do fan no adaptador é um plugue JST PH2.0 de 4 pinos
    • O header de fan da placa-mãe usa o padrão de 0,1 polegada, ou seja, passo de 2,54mm
    • O lado fêmea PH2.0 foi ligado aos pinos de tachometer e PWM do fan, e o lado macho 2.54mm ao header de fan da placa-mãe
    • Um cabo jumper de cerca de £2 e a confirmação do conector resolveram o problema dos 82dB

Expandindo a VRAM com duas GPUs

  • A configuração final de GPUs ficou assim
    • RTX 4080: 16GB de VRAM, arquitetura Ada
    • Tesla V100: 16GB de VRAM, arquitetura Volta
    • Total: 32GB de VRAM distribuídos entre as duas GPUs
  • O llama.cpp consegue dividir o modelo entre duas GPUs com tensor splitting
    • As camadas são processadas em pipeline pelo barramento PCIe
    • A RTX 4080 processa parte das camadas e a V100 processa o restante
    • Não é mais rápido do que uma única GPU de 32GB, mas funciona e custa cerca de 10% do valor de uma GPU de 32GB
  • O consumo de energia da V100 foi observado em até cerca de 150W
    • Não é pequena como GPU para inferência de LLM local, mas também não é algo anormalmente grande
  • O modelo V100 32GB também continua sendo uma opção
    • Custa mais do que o dobro do valor pago aqui, mas ainda permite obter 32GB de HBM2 em uma única placa por algumas centenas de libras
    • Duas V100 de 32GB permitiriam chegar a 64GB de VRAM, descritas como algo em torno de 20% do preço atual de uma RTX 5090
  • O formato SXM2 oferece suporte nativo a NVLink
    • Em uma configuração multi-GPU adequada, as GPUs poderiam se comunicar com alta largura de banda
    • Mesmo via adaptador PCIe, o desempenho de tensor split foi suficientemente sólido

Ajustando driver e CUDA no NixOS

  • Graças ao NixOS, a configuração de software foi relativamente tranquila
  • A V100 usa chip Volta, e a NVIDIA encerrou o suporte a Volta a partir do branch 560 dos drivers
    • O último driver que suporta ao mesmo tempo a RTX 4080 Ada e a V100 Volta é o branch 550.x
    • No NixOS, isso corresponde a nvidiaPackages.legacy_535
  • Esse driver suporta apenas até o CUDA 12.2
    • Atualmente, o nixpkgs fornece CUDA 12.6 ou superior
    • Foi necessário trazer o CUDA 12.2 do nixpkgs 24.05
  • O driver exige o Linux kernel 6.6
    • O driver legacy não suporta kernels mais novos
  • Mesmo sendo um servidor headless de inferência, foi necessário ativar services.xserver.enable = true
    • Sem essa configuração, o módulo de kernel da NVIDIA não era carregado
  • A configuração central do NixOS consiste em definir o kernel, o driver NVIDIA legacy e o driver de vídeo NVIDIA para o X server
boot.kernelPackages = pkgs.linuxPackages_6_6;
hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.legacy_535;
services.xserver.enable = true;
services.xserver.videoDrivers = [ "nvidia" ];
  • O CUDA 12.2 foi trazido do nixpkgs antigo via overlay
nixpkgs.overlays = [
  (final: prev: {
    cudaPackages_12_2 = nixpkgs-cuda.legacyPackages.${prev.system}.cudaPackages_12_2;
  })
];
  • As duas GPUs aparecem corretamente e o CUDA funciona normalmente
  • A definição completa da máquina está incluída neste commit do repositório de dotfiles
    • Também inclui a definição do serviço llama.cpp e um build customizado fixado na versão correta

Modelo executado e desempenho

  • O modelo executado é a versão quantizada Qwen3.6-27B-MTP Q5_K_M
    • O tamanho do modelo é de cerca de 19GB
    • Com as duas GPUs, o modelo inteiro cabe na VRAM e ainda sobra espaço para o contexto
  • As principais configurações de execução foram estas
    • Model: Qwen3.6-27B-MTP Q5_K_M, 19GB
    • Context size: 128k tokens
    • GPU layers: 99, tudo offloaded
    • Tensor split: -ts 1.0,1.0, divisão equilibrada entre as duas GPUs
  • O desempenho foi o seguinte
    • Inference speed: cerca de 32 tok/s
    • Prompt processing: cerca de 133~160 tok/s
  • Os 32 tokens/s foram considerados velocidade suficiente para uso interativo
    • Isso foi alcançado mesmo em uma configuração de tensor split entre duas arquiteturas de GPU diferentes ligadas por PCIe
    • Considerando até a latência de rede, foi descrito como mais rápido do que a maioria dos endpoints de API em nuvem

MTP e entrada de imagens

  • MTP significa Multi-Token Prediction
    • Na inferência tradicional de LLM, um token é previsto por vez, aceito e só então o próximo é previsto
    • No MTP, vários tokens futuros são previstos de uma só vez e depois validados
    • Os tokens aceitos saem praticamente de graça, e previsões erradas voltam ao caminho normal
  • O resultado do MTP é um ganho de cerca de 1,5 a 2 vezes na velocidade de geração sem perda de precisão
    • Nesta configuração, foi indicado que os cerca de 32 tok/s podem chegar a 50~60 tok/s quando o MTP acerta bem
    • O efeito é especialmente forte em saídas previsíveis, como código
  • O suporte a MTP no llama.cpp ainda é recente
    • A versão de llama.cpp no nixpkgs não suporta a arquitetura MTP do Qwen3.6
    • Foi necessário compilar o llama.cpp a partir do código-fonte em um commit específico que já incluía esse suporte
    • No NixOS, foi criada uma derivation customizada fixada nesse commit para manter reprodutibilidade
    • Trocar de modelo ou de versão do llama.cpp passou a exigir apenas mudar uma linha da configuração e executar nixos-rebuild switch
  • O Qwen3.6-27B suporta entrada de imagem por meio de um arquivo multimodal projector separado, o mmproj
    • O arquivo adicional tem cerca de 928MB
    • O vision encoder converte os pixels da imagem para o espaço de embeddings de tokens do LLM
    • O modelo não “vê” a imagem como uma pessoa
    • O LLM processa os vetores convertidos como se fossem outra sequência de tokens
  • As flags de execução no llama.cpp são as seguintes
--mmproj /mnt/nas/llamacpp/mmproj-F16.gguf --mmproj-offload
  • --mmproj-offload coloca o vision encoder na GPU junto com o modelo
    • Isso permite manter inferência rápida também com entrada de imagem

Forma de uso local

  • Essa configuração é usada com o OpenCode
    • O OpenCode é um assistente de programação com IA que pode ser executado usando modelos locais
  • O servidor de LLM roda no desktop, mas o uso acontece a partir de outros dispositivos
    • O acesso é feito pela rede a partir de outras máquinas da casa
    • De fora, o acesso é feito via Tailscale
  • No OpenCode, o uso do servidor llama.cpp é configurado definindo a URL da API
    • O modelo roda localmente
    • As respostas são rápidas e os dados não saem da rede

Problemas restantes e limitações

  • Às vezes a V100 desaparece após warm reboot
    • Depois de um reboot em que só o sistema operacional reinicia e a placa-mãe continua energizada, pode acontecer de a V100 não aparecer em lspci nem em nvidia-smi
    • Parece ser um problema de enumeração ACPI do slot PCIe
    • Um cold reboot, desligando fisicamente a máquina, esperando alguns segundos e ligando novamente, sempre resolve
  • Sem a V100, o llama.cpp não inicia
    • Isso acontece porque o modelo não cabe em apenas uma GPU de 16GB
    • O serviço entra em crash loop até a GPU voltar
    • Como normalmente o reboot é feito com a máquina por perto, isso não foi considerado um grande problema na prática
  • Uma configuração com tensor split entre duas GPUs de arquiteturas diferentes não é tão limpa quanto uma única GPU
    • A V100 também não é a GPU mais rápida possível para inferência
    • Mesmo assim, foi avaliada como tendo excelente custo-benefício

Opções e conclusão

  • Por cerca de £200, o resultado obtido foi o seguinte
    • Uma GPU de datacenter de 16GB funcionando junto com uma GPU gamer
    • 32GB totais de VRAM para inferência local de LLM
    • 32 tokens/s em um modelo de 27B parâmetros
    • Janela de contexto de 128k tokens
    • Suporte a visão para entrada de imagem
    • Um modelo rodando totalmente local, sem nuvem e sem custo por token
  • O custo real acabou sendo o ruído do fan, resolvido com cabo jumper e confirmação do conector
  • Para quem quer rodar modelos locais de verdade, o mercado de GPUs de servidor usadas pode ser uma alternativa
    • Mesmo sem já ter uma GPU instalada, colocar uma V100 única em um servidor barato já pode criar um ambiente local utilizável com 16GB de VRAM
    • A V100 SXM2 não é a única opção
    • A P40 oferece 24GB por custo parecido, mas é mais lenta e não tem Tensor Cores
    • O modelo V100 32GB custa mais, mas ainda sai mais barato do que GPUs de consumo com a mesma capacidade de VRAM
  • Ainda assim, é preciso estar preparado para o problema do fan

1 comentários

 
GN⁺ 2 시간 전
Opiniões no Lobste.rs
  • A abordagem é muito legal, e esse fenômeno da GPU desaparecer do PCIe tem tantas causas possíveis que fiquei ainda mais curioso
    O barulho alto da ventoinha da GPU me lembrou da época em que eu estava na equipe do NVIDIA CUDA. Um colega estava adicionando controle de ventoinha ao NVML e ao nvidia-smi, e eu ouvia por cima da divisória o som da ventoinha acelerando e desacelerando, até que ele apareceu com um grande sorriso no rosto
    Ele dizia que era um dos recursos em que mais gostou de trabalhar, porque dava para ouvir o resultado no instante em que o código funcionava

  • Se você tem interesse em LLM auto-hospedado, a Dell OEM RTX 3090 costuma ser mais barata do que produtos de grandes marcas, e dava para encontrar por cerca de 800 dólares canadenses
    Agora preciso ler mais sobre como o vLLM funciona. Às vezes o modelo começa a despejar uma longa lista de nomes e adjetivos relacionados, então provavelmente configurei alguma coisa errada

    • Fiquei curioso para saber quais modelos estão rodando na RTX 3090
      Eu achava que a maioria dos modelos minimamente úteis precisava de pelo menos 48~64GB de VRAM para rodar direito, e por isso imaginava que os chips Apple da linha M com arquitetura de memória unificada fossem populares nessa área
  • Já existem produtos assim em forma pronta para uso, mas normalmente é aquele esquema de receber só 3 meses de garantia do fabricante e acabou
    https://ebay.com/itm/297819576914/…

    • Isso me atrai bastante. Acho que a modificação na ventoinha mencionada aqui no texto não deve estar feita
  • Nos EUA, modelos usados de 32GB são negociados por algo em torno de 600 dólares
    O adaptador eu provavelmente compraria direto da China, que deve ser a origem

  • Fiquei curioso se existe um equivalente do lado da AMD. No momento estou usando duas W7900 de 48GB e queria expandir para conseguir rodar modelos maiores

    • Em certa medida, sim. Existe a Instinct MI60, da mesma época da V100; já é bem antiga, mas tem 32GB de VRAM e já saiu em versão de placa PCIe
      Você ainda precisa cuidar da refrigeração, mas não precisa ficar mexendo com adaptadores
      Tenho lido toda vez que encontro alguma configuração local de modelos, e no momento não parece existir um verdadeiro ponto ótimo de custo-benefício na faixa intermediária de demanda por VRAM, entre 48 e 128GB. As opções são mais ou menos três: várias GPUs de datacenter de antes da 3ª geração (Tesla V100, Instinct MI60), várias opções de entrada da geração atual com muita VRAM (Arc Pro B70), ou caixas integradas da geração atual (DGX Spark, Mac Mini, Strix Halo)
      Para quem está fazendo upgrade saindo de uma GPU de consumidor de 32GB ou de duas de 16GB, cada uma dessas opções traz concessões, mas também vantagens. Se você já está usando duas placas de 48GB, não sei se existe algum upgrade de hardware usado que de fato vá parecer uma melhora perceptível