30 pontos por GN⁺ 2025-08-13 | 6 comentários | Compartilhar no WhatsApp
  • Usando a opção --cpu-moe do llama-cpp, é possível processar as camadas de especialistas MOE na CPU e fazer offload apenas das camadas de attention para a GPU, alcançando desempenho rápido de prefill com 5~8GB de VRAM
  • Na GPU ficam residentes apenas os cache KV, pesos e ativações de Attention, tabela de roteamento, LayerNorm etc., mantendo baixo o uso de memória
  • Mesmo com uma GPU no nível de uma RTX 3060Ti e 64GB~96GB de RAM do sistema, é possível rodar o modelo 120B com facilidade, com melhor desempenho em GPUs com suporte a BF16 (RTX 3000+)
  • Com 5GB de VRAM, registrou 8,15ms por token (122,66 tokens/segundo), e com 8GB de VRAM melhorou para 7,44ms (134,44 tokens/segundo)
  • A arquitetura 120B foi projetada para hardware de consumo, permitindo execução em alta velocidade mesmo em ambientes com poucos recursos de GPU

Estrutura de CPU-MOE e offloading para GPU

  • A opção --cpu-moe processa todas as camadas de especialistas (MOE) na CPU
    • Exemplo: --n-cpu-moe 36 → executa todos os 36 blocos MOE na CPU
    • Se necessário, é possível mover apenas parte do MOE para a GPU para ajustar o desempenho
  • Para economizar VRAM, apenas os itens abaixo ficam residentes na GPU
    • cache KV (sequência)
    • pesos e ativações de Attention
    • tabela de roteamento
    • LayerNorm e outros parâmetros não especialistas
  • Como os pesos MOE não ficam residentes na GPU, não há o peso dos grandes parâmetros de MLP

Memória e requisitos de hardware

  • GPU: 5~8GB de VRAM são suficientes (ex.: RTX 3060Ti)
  • O ideal é que a GPU tenha suporte a BF16 (série RTX 3000 ou superior)
  • RAM do sistema: mínimo de 64GB, idealmente 96GB
    • Usando mmap no Linux, as camadas de especialistas “quentes” podem permanecer na memória mesmo que o modelo inteiro não caiba nela

Números de desempenho

Ambiente com 5GB de VRAM

  • Processamento de prompt: 8,15ms/token (122,66 tokens/segundo)
  • Inferência: 55,44ms/token (18,04 tokens/segundo)

Ambiente com 8GB de VRAM (--n-cpu-moe 36, restante na GPU)

  • Processamento de prompt: 7,44ms/token (134,44 tokens/segundo)
  • Inferência: 39,03ms/token (25,62 tokens/segundo)

Ambiente com 22GB de VRAM (parte do MOE na GPU)

  • Processamento de prompt: 6,13ms/token (163,01 tokens/segundo)
  • Inferência: 32,45ms/token (30,82 tokens/segundo)

Conclusão

  • O design do GPT-OSS-120B foi otimizado para executar modelos grandes em alta velocidade até em hardware de consumo
  • Graças à estrutura CPU-MOE, que reduz o uso de VRAM sem perder velocidade, ele é especialmente adequado para ambientes com recursos de GPU limitados

Principais perguntas e respostas

P1. Qual é o uso real de VRAM nessa configuração?

  • Autor original: cerca de 5GB de VRAM ao executar todo o MOE na CPU, com apenas as camadas de attention na GPU
  • Explicação adicional: na GPU ficam apenas cache KV, pesos e ativações de Attention, tabela de roteamento e LayerNorm

P2. Qual é o mínimo de RAM necessário?

  • Autor original: mínimo de 64GB, com recomendação ideal de 96GB
  • Motivo: o mmap do Linux mantém na memória as camadas de especialistas “quentes”, permitindo acesso rápido mesmo sem carregar o modelo inteiro

P3. Mover parte das camadas MOE para a GPU acelera muito?

  • Autor original: pode ficar um pouco mais rápido, mas sem grande diferença
  • Exemplo:
    • Todo o MOE na CPU: prompt 134 tokens/segundo, inferência 25 tokens/segundo
    • 8 camadas MOE na GPU: prompt 163 tokens/segundo, inferência 30 tokens/segundo
    • O uso de VRAM sobe para 22GB

P4. Qual GPU é adequada?

  • Autor original: uma RTX 3060Ti ou superior já é suficiente; recomenda-se suporte a BF16 (RTX 3000+)
  • Motivo: todas as camadas fora do MOE operam em BF16

P5. Como fica a configuração do comando?

  • Autor original: forneceu um exemplo com base no PR #15157
    ~/build/llama.cpp/build-cuda/bin/llama-server \  
        -m $LLAMA_MODEL_DIR/gpt-oss-120b-mxfp4-00001-of-00003.gguf \  
        --n-cpu-moe 36 \  
        --n-gpu-layers 999 \  
        -c 0 -fa \  
        --jinja --reasoning-format none \  
        --host 0.0.0.0 --port 8502 --api-key "dummy"  
    

6 comentários

 
kaydash 2025-08-14

Na prática eu testei, mas ficou muito lento.
Quase não usa o clock da GPU.
Usa totalmente os 8 GB de memória dedicada da GPU e os 64 GB de memória física,
e só metade dos 16 vCores.
O sentido está mais em dizer que simplesmente roda; não era uma forma de usar todos os recursos.
Cada consulta levou de 6 a 8 minutos.

 
cronex 2025-08-13

Acho que vou tentar fazer algo parecido.

 
crawler 2025-08-13

Achei que 32 GB seriam suficientes...

 
cnaa97 2025-08-13

Antes de tudo, no LM Studio em um M4 Max com 64 GB não roda ;_;

 
jinucho 2025-08-13

Como tem 65 GB... é uma pena T_T

 
GN⁺ 2025-08-13
Comentários no Hacker News
  • Fico curioso para saber se, ao rodar o modelo diretamente no próprio hardware, dá para desativar os guardrails
    • Para contornar os guardrails, parece que seria preciso encontrar um tipo de "abliterated finetune" que rastreie e remova os caminhos de neurônios que causam recusas
    • Segundo um texto que li recentemente, o GPT-OSS foi treinado apenas com dados artificiais/gerados, então ele nem teria tanto "conhecimento proibido" desde o início
      Texto relacionado
    • Dá para contornar com prompts de jailbreak; é um pouco incômodo, mas funciona bem
    • Versões com parte dos guardrails removidos perdem bastante desempenho, então pessoalmente acho que sai perdendo
    • Basicamente isso já vem embutido no modelo, mas existe uma comunidade que faz crack e modifica isso
  • Num ambiente com 5950x + 128GB de RAM + GPU 3060 de 12GB, a velocidade de geração de tokens é rápida, mas, quando o contexto cresce só um pouco, o processamento fica muito lento
    Então acabo usando mais outros modelos como qwen, mistral e gemma
    • Em vez de expressões subjetivas como "rápido" e "lento", queria ver números concretos de tokens
    • Também fico curioso sobre o que pretendem fazer com esse modelo além de chat simples/manipulação de texto
  • Num ambiente com 32GB de RAM + 16GB de VRAM, dá para colocar o modelo 20B inteiro na VRAM, mas, se a janela de contexto passar de 8k tokens, falta VRAM
    Vejo outras pessoas rodando o modelo 120B com menos VRAM, então talvez isso seja por falta de suporte a ROCm e uso de Vulkan
    Ainda assim, é divertido forçar o hardware até o limite
    • Quanto maior o contexto, mais camadas precisam ser descarregadas para a RAM do sistema
      No llama.cpp dá para definir manualmente quantas camadas de cálculo ficam na GPU, mas o ollama ajusta isso automaticamente
      Seria bom poder ajustar dinamicamente a proporção RAM/VRAM conforme o tamanho da sessão
  • É engraçado chamar 64GB de RAM + 8GB de VRAM de "apenas o suficiente"; para mim isso é uma configuração de milhares de dólares
    • Uns 300 CAD de RAM e uns 400 CAD de GPU, então num desktop dá para montar barato
    • Fica na faixa de um PC gamer intermediário de entrada; com um upgrade de algumas centenas de dólares já dá para rodar em casa
    • Também existem produtos em pré-venda na faixa de $1599~$1999 que não parecem caros
    • Dá para montar com peças novas por menos de US$ 1000; usado sai ainda mais barato e a GPU pode até ser melhor
    • 64GB de DDR5 ficam em torno de $150, e uma 3060 de 12GB em torno de $300; no eBay pode sair mais barato
  • Queria saber se alguém já rodou o modelo 20B num MacBook Air M4 ou numa RTX 3060
  • Não tenho RAM suficiente para usar modelos grandes, mas o modelo 20B é rápido no MacBook e atende bem ao meu uso
    Só que o function calling ainda está quebrado no llama.cpp
    • Esse bug foi corrigido neste PR
    • Ainda bem que era bug e não limite de RAM; até num MacBook Air com 16GB de RAM consigo rodar bem vários modelos
      Estou pensando em hospedar um chatbot de IA no quarto com um mini PC de $149, e o modelo Qwen3 4B parece uma boa opção
      Plano relacionado
  • Fico curioso se dá para otimizar as configurações com esse hardware no OpenWebUI ou em outra GUI; acho que o modelo 20B pode ser melhor
  • Sou iniciante em LLMs e queria saber se essa otimização se aplica a todos os modelos MoE
    • Como a abordagem aplica regex aos nomes das camadas, se a nomenclatura for parecida isso também funciona em outros modelos
      Por exemplo, funcionou no Qwen 3, e também dá para definir manualmente a regex para mover camadas específicas para um dispositivo específico
  • Queria saber se a versão otimizada com mlx rodaria num Mac de 64GB
    • Pela estimativa do LM Studio, com quantização de 3-bit (~50GB) isso deve rodar sem problemas