Kimi K2 local: 1 trilhão de parâmetros MoE em soi
Executar o Kimi K2 localmente com llama.cpp significa executar um modelo MoE com um trilhão de parâmetros em uma estação de trabalho pessoal. Essa façanha se deve a dois fatores: apenas 32 bilhões de parâmetros estão ativos por token (o restante fica inativo), e o llama.cpp consegue deixar os pesos inativos no SSD via mmap. Este guia detalha a configuração de hardware, a quantização Q2_K_S, o offload em disco e os números reais que se pode esperar.
#Por que considerar rodar o Kimi K2 localmente
Kimi K2 é o modelo principal da Moonshot AI, publicado com pesos abertos (Modified MIT) com uma arquitetura MoE (Mixture of Experts) de 1 trilhão de parâmetros totais e cerca de 32B ativos por token. Nos benchmarks de raciocínio e código, ele compete na mesma liga dos modelos de fronteira fechados, e seu longo contexto (128k tokens anunciados) o torna um candidato sério para análise documental em massa.
Executar um modelo desse tamanho localmente era, há 18 meses, um sonho. Três evoluções mudaram a realidade: a generalização de memória DDR5 de grande capacidade (192-384 GB por algumas centenas de euros), os SSD NVMe Gen 4 capazes de entregar 7 GB/s em leitura sequencial, e o trabalho da equipe llama.cpp com quantizações muito agressivas do tipo Q2_K_S e IQ1_M.
#Entender o MoE 1T / 32B ativos
Seu ChatGPT privado e gratuito na sua máquina em 1 hora — LM Studio, Ollama, Open WebUI, seus documentos, sem nuvem.
- Espaço online vitalício
- PDF + arquivos
- Atualizações vitalícias
A arquitetura MoE substitui os blocos FFN densos por uma camada de especialistas (geralmente 256+) entre os quais um roteador seleciona 8 a 12 por token. No cálculo, apenas os parâmetros dos especialistas escolhidos são tratados — por isso os ~32B «ativos». No entanto, na memória, todos os especialistas devem ser acessíveis, caso contrário o roteador perde acesso a 95% do modelo.
- Parâmetros totais
- ≈ 1 000 bilhões (1T). É o que fica armazenado na RAM ou em disco.
- Parâmetros ativos por token
- ≈ 32 bilhões. É isso que determina o cálculo e a velocidade.
- Especialistas por camada
- Várias centenas, das quais um número fixo de especialistas é roteado por token (top-k routing).
- Camadas compartilhadas (atenção)
- Sempre ativas. Elas representam a maior parte do consumo de memória quando o contexto é curto.
- Cache KV
- Cresce linearmente com o contexto. Em 128k, o KV pode ultrapassar 30 GB mesmo quantizado.
#Estimativa de memória necessária
O cálculo de memória para um MoE 1T se divide em três componentes distintos. Entender essa divisão é essencial antes de investir na RAM ou no SSD.
- Pesos do modelo (quantizados)
- Q2_K_S ≈ 245 GB, Q3_K_S ≈ 320 GB, Q4_K_M ≈ 480 GB, Q8_0 ≈ 1 TB. É o componente que mais ocupa memória e o mais compressível.
- Cache KV (contexto)
- Considerar ~0,25 MB por token em FP16, ~0,12 MB em Q8. Ou seja, 32 GB para 128k tokens em Q8. Configurável via --cache-type-k/-v.
- Buffers de ativações
- Alguns GB por GPU para cálculos intermediários. Marginal, mas não esquecer em GPUs de 24 GB.
#Pré-requisitos de hardware
Três perfis de máquinas permitem rodar o Kimi K2 localmente, com concessões muito diferentes em termos de velocidade.
- Perfil A — memória DDR5 potente (192-384 GB RAM)
- Workstation Threadripper/Xeon W ou plataforma EPYC. 256 GB de DDR5 ECC, sem necessidade de GPU. O modelo cabe inteiramente na RAM em Q2_K_S. Velocidade esperada: 4-8 tok/s usando apenas a CPU.
- Perfil B — DDR5 + 1 GPU de 24 GB
- 96-128 GB de RAM + RTX 4090/3090. As camadas compartilhadas são transferidas para a GPU, os especialistas permanecem na RAM. Velocidade esperada: 6-12 tok/s, dependendo do número de especialistas que cabem na VRAM.
- Perfil C — RAM modesta + SSD NVMe
- 64-96 GB de RAM + NVMe Gen 4 (7 GB/s de leitura, ≥ 1 TB livre). Fazemos mmap dos pesos a partir do SSD. Velocidade esperada: 1-3 tok/s, fortemente dependente da taxa de transferência real do SSD.
#1. Compilar o llama.cpp com o backend correto
Kimi K2 exige uma versão recente do llama.cpp (build recente após dezembro de 2025) que suporte sua arquitetura MoE e as quantizações IQ. Compila-se a partir do repositório oficial.
Em um Mac com Apple Silicon, substituir GGML_CUDA por GGML_METAL. Em hardware AMD com ROCm, usar GGML_HIP. A opção GGML_CUDA_FA_ALL_QUANTS ativa o Flash Attention para todas as quantizações — essencial para comportar 128k de contexto sem exceder a capacidade da VRAM.
#2. Escolher a quantização GGUF
Para um modelo desse tamanho, esqueça Q4_K_M e acima, a menos que você tenha 512 GB de RAM. A quantização extrema — Q2_K_S, IQ2_XXS, até IQ1_M — é o que torna o uso local viável, com perda de qualidade mensurável, mas geralmente aceitável em um MoE.
- Q2_K_S (~245 GB)
- O ponto ideal. ~5% de degradação nos benchmarks de código, ~3% em raciocínio. Recomendado se você tiver 256 GB de RAM ou um SSD rápido.
- IQ2_XXS (~210 GB)
- Ainda mais agressivo com uma matriz de importância. Cabe em 192 GB de RAM com um pouco de offload. Qualidade um nível abaixo.
- IQ1_M (~155 GB)
- Quantização 1-bit híbrida. Para configurações muito restritas. Degradação visível, mas o modelo permanece coerente.
- Q3_K_S (~320 GB)
- Qualidade quase-Q4, mas exige 384 GB de RAM. Para workstations EPYC bem equipadas.
Os arquivos GGUF desse tamanho são divididos em vários arquivos (split-00001-of-00007.gguf etc). O llama.cpp detecta automaticamente os splits se você apontar para o primeiro arquivo.
#3. Iniciar Kimi K2 com mmap e offload
O comando básico utiliza o llama-server, o servidor HTTP fornecido pelo llama.cpp. Ele expõe um endpoint compatível com a OpenAI na porta 8080 por padrão.
Com uma GPU de 24 GB, as camadas compartilhadas (atenção) são transferidas para a GPU, enquanto os especialistas MoE ficam na RAM ou em um SSD. O parâmetro -ot permite definir com precisão o que vai para a GPU e o que vai para a CPU.
A expressão regular passada para -ot significa: “todas as camadas FFN dos especialistas (a maior parte do modelo MoE) permanecem na CPU/RAM, e o restante vai para a GPU”. É esse truque que torna a execução híbrida viável: aproveitamos a GPU para a atenção sem precisar carregar tudo nela.
#4. Tokens/s reais medidos
Aqui estão algumas referências de taxa de geração observadas na prática. Os números variam conforme o prompt (o prefill é lento, a geração é mais estável) e o estado do cache de páginas do sistema operacional.
- EPYC 9354P, 384 GB DDR5, Q2_K_S, tudo em RAM
- Prefill ~80 tok/s, geração ~6-8 tok/s. Configuração de referência para raciocínio em lote.
- Threadripper 7960X, 256 GB DDR5, Q2_K_S
- Prefill ~50 tok/s, geração ~4-6 tok/s. A latência da memória DDR5 domina.
- Ryzen 9 7950X, 128 GB DDR5 + SSD NVMe Gen 4
- Prefill ~15 tok/s, geração ~1,5-3 tok/s. O SSD se torna o fator limitante a partir do momento em que ultrapassamos a RAM residente.
- Mac Studio M2 Ultra 192 GB
- Geração ~4-7 tok/s em IQ2_XXS. A largura de banda da memória unificada (800 GB/s) ajuda muito nos modelos MoE.
- Workstation 256 GB + RTX 4090 (híbrida)
- Prefill ~60 tok/s, geração ~7-10 tok/s. O GPU na atenção divide por 2 o tempo de prefill.
#5. Casos de uso com contexto de 128k
O grande diferencial do Kimi K2 em relação aos modelos locais de 7B a 70B é a janela de 128k tokens. Na prática, você pode fornecer a ele um relatório anual completo, uma base de código de tamanho médio ou cerca de cem páginas de PDF e pedir uma síntese global que considere o conjunto inteiro — em vez de RAG por chunks.
- Síntese de documentos longos
- Um relatório de 300 páginas ocupa menos de 120k tokens. O Kimi K2 gera uma síntese estruturada em uma única passagem, enquanto um RAG montaria um mosaico de trechos.
- Refatoração da base de código
- Carregar 50 arquivos Python (~80k tokens), solicitar uma revisão de arquitetura coerente. Muito útil para uma dívida técnica transversal.
- Análise de logs correlacionada
- Colar 50 MB de logs (após a filtragem) e pedir uma linha do tempo de um incidente. O modelo vê todas as correlações, não apenas as janelas deslizantes.
- Tradução de grandes documentos
- Mantém a coerência terminológica ao longo de um livro inteiro, enquanto uma tradução por blocos perde o fio.
#Solução de problemas
- « failed to load model » ou erro de número mágico
- O seu llama.cpp é muito antigo para esse GGUF. Atualize para uma build posterior a dezembro de 2025 e verifique a versão da arquitetura informada por quem reempacotou o GGUF.
- Geração a 0,2 tok/s, embora a RAM fosse suficiente
- O kernel continuará paginando a partir do GGUF enquanto não tiver acessado todas as páginas. Uma primeira « execução de aquecimento » com um prompt curto pré-carrega as páginas mais acessadas. Caso contrário, aumente --threads para saturar mais cedo a largura de banda.
- OOM brusco em prompt longo
- O cache KV explodiu. Reduza --ctx-size para 32768 ou ative a quantização Q8 do cache. O KV cresce linearmente com o contexto, não com o tamanho do modelo.
- Saída incoerente ou linguagem malformada
- Muitas vezes, a causa é um template de chat incorreto. Verifique --chat-template ou se o GGUF realmente inclui o template oficial da Moonshot (jinja). Um token de fim incorreto faz a geração se descontrolar em loop.
- SSD a 80 °C, com queda acentuada na taxa de transferência
- Os SSDs NVMe topo de linha reduzem o desempenho por aquecimento sem dissipador. Em uma sessão longa, instale um dissipador de calor ou reduza a carga usando uma versão quantizada menor que caiba na RAM.
#Para se aprofundar
O Kimi K2 rodando localmente é um campo de experimentação para modelos muito grandes. Três caminhos para ir além:
- Dominar a compilação do llama.cpp
- O guia "Compilar llama.cpp com CUDA" detalha flags menos evidentes (offload de tensores, MMQ, Flash Attention) que alteram o desempenho nesse tipo de modelo.
- Compreender as quantizações
- O guia "Escolher a quantização" apresenta as bases conceituais úteis antes de explorar IQ2_XXS ou Q3_K_S e esclarece o que realmente se degrada.
- Aumentar ainda mais a compressão
- O guia TurboQuant detalha um método mais recente que os K-quants para fazer modelos de fronteira caberem em hardware de uso doméstico, com diferentes concessões.
Um comentário, um erro ou uma observação? Avise-nos; isso ajuda a melhorar o guia para todos.