Ao vivo 18/11 · Turma 318 nov às 19:00 MSK — aula prática gratuita de agentes de IA · Turma 3 ao vivo começa 23/11Aula 18/11 →Turma 3 (23/11)
LançamentoAnálise · No radarHabr AI→ original

Cinco técnicas para acelerar MoE na GTX 1070: autoprefixo reduziu a latência de 13,3 para 6,1 s

O desenvolvedor do motor Strata roda um grande modelo MoE numa GTX 1070 com 8 GB de VRAM e reuniu cinco formas de acelerá-lo. Quatro já existem no motor, mas costumam ficar desligadas: decodificação especulativa, KV-cache na RAM, batching e cache adaptativo de especialistas. A quinta é um patch próprio com detecção automática de prefixo comum, que reduziu o tempo até o primeiro token de 13,3 para 6,1 segundos.

Processado por IA de Habr AI; editado por Hamidun News
Cinco técnicas para acelerar MoE na GTX 1070: autoprefixo reduziu a latência de 13,3 para 6,1 s
Fonte: Habr AI. Colagem: Hamidun News.
Ouvir artigo
Ficha técnica e números-chave
ParâmetroDados
Fonte originalHabr AI ↗
Editor-chefe
Dado-chave #1--spec/--mtp dá de 1,3x a 1,6x na geração, principalmente em código
Dado-chave #2--kv-resident entrega a VRAM liberada ao cache de especialistas
Dado-chave #3O cache adaptativo de especialistas é de 1,5 a 2 vezes mais rápido que o estático

Quem tenta rodar um grande modelo MoE numa placa de vídeo doméstica esbarra na memória, não no poder de cálculo. Os pesos dos especialistas não cabem na VRAM, parte vai para a RAM e para o SSD, e cada acesso a um especialista "frio" custa milissegundos preciosos. O autor do motor Strata, que roda o Qwen3.8-Flash-Next numa GTX 1070 com 8 GB, reuniu cinco técnicas para lidar com esse problema. Quatro delas já estão embutidas no motor. A quinta ele mesmo escreveu, e apresentou as medições.

Quatro técnicas que já existem no motor

A primeira é a decodificação especulativa (--spec N --mtp <caminho>). Uma pequena camada de rascunho prevê vários tokens à frente, e o modelo grande os verifica em uma única passada. Se o rascunho acertar, você recebe vários tokens pelo preço de um. O ganho costuma ficar entre 1,3x e 1,6x. O rascunho acerta bem em código e padrões repetitivos, e pior em prosa livre. O custo é um pouco de VRAM para a camada de rascunho e os buffers.

A segunda é o --kv-resident N. Na VRAM fica apenas a janela deslizante de atenção de N tokens, e todo o KV-cache vai para a RAM pinned. A atenção em si não fica mais rápida com isso. O ganho está em outro ponto: a memória liberada vai para o cache de especialistas. Em MoE, um gigabyte extra para especialistas residentes costuma valer mais do que a economia no KV. A verificação é simples: compare a taxa de acerto do expert cache no log antes e depois.

A terceira é o batching (--batch, --parallel). Trata-se de continuous batching: vários diálogos são decodificados nas mesmas janelas, e os pesos compartilhados são lidos uma única vez para todos. Numa única placa, o throughput por usuário até cai um pouco. Em compensação, ninguém espera na fila enquanto o vizinho é atendido. Se você tem várias GPUs com layer-split ou agentes em paralelo, consulte o docs/BATCHING.md.

A quarta é a residência adaptativa de especialistas (--adapt-every, --adapt-swaps). O cache realoca os pesos por conta própria entre VRAM, RAM e SSD, conforme a frequência de acesso, durante a própria geração. Segundo as medições do autor, a diferença entre o cache estático e o "vivo" ficou entre 1,5x e 2x, dependendo da homogeneidade do fluxo de prompts.

Quinta técnica: prefixo comum automático

O Strata tem o mecanismo strata_prefix: o cliente indica explicitamente onde termina a parte comum do prompt, e o motor guarda um checkpoint nesse ponto. As requisições seguintes que começam da mesma forma não precisam reler esse trecho. O problema é que quase nenhum cliente, seja chatbot, seja framework de agentes, faz isso.

O autor adicionou uma camada no servidor (STRATA_AUTO_PREFIX=1, desligada por padrão). Ela mantém uma radix-trie, indexada por id de token, com os prompts recentes e controla um orçamento para o número de "pins" simultâneos. Cada pin toma VRAM do cache de especialistas; não existe pin de graça. Se a requisição chega sem prefixo explícito, o servidor encontra a correspondência sozinho e insere a fronteira. Para o motor, não há diferença.

A medição: Strata 0.2.12, uma GTX 1070 de 8 GB, Qwen3.8-Flash-Next UD-IQ4_XS, dois clientes com o mesmo documento longo.

  • Mediana de tokens relidos: 886 → 468.
  • Mediana de tokens vindos do cache: 0 → 413.
  • Mediana do tempo até o primeiro token: 13,3 s → 6,1 s.

São duas execuções do mesmo benchmark na mesma máquina, e a única coisa que muda é uma variável de ambiente.

Limitações e o que fazer

Primeiro, as ressalvas. Todos os números vêm de uma única configuração e de um único cenário com dois clientes, e o ganho do autoprefixo depende de quanto início em comum suas requisições têm. O patch está na branch de um fork e não foi aceito no upstream. O autor abriu uma issue, e não um PR, porque o CONTRIBUTING.md exige alinhar o escopo antes. Os pins disputam VRAM com o cache de especialistas, então será preciso ajustar o orçamento.

Na prática, a ordem é esta. Se você tem um MoE numa placa modesta, comece por --kv-resident e --spec/--mtp: é o ganho mais rápido, sem escrever uma linha de código. Depois, confira se a adaptação de especialistas está ativada. Se você usa RAG ou agentes com um prompt de sistema longo e comum, vale testar o autoprefixo no seu próprio tráfego. A lição principal vai além de um único motor: com VRAM limitada, quase toda otimização se resume a decidir no que gastar cada gigabyte. E essa decisão deve se basear em medições, não em intuição.

História

Perguntas frequentes sobre a notícia

O que se sabe sobre Quatro técnicas que já existem no motor?

A primeira é a decodificação especulativa (--spec N --mtp <caminho>). Uma pequena camada de rascunho prevê vários tokens à frente, e o modelo grande os verifica em uma única passada. Se o rascunho acertar, você recebe vários tokens pelo preço de um. O ganho costuma ficar entre 1,3x e 1,6x. O rascunho acerta bem em código e padrões repetitivos, e pior em prosa livre. O custo é um pouco de VRAM para a camada de rascunho e os buffers. A segunda é o --kv-resident N.

O que se sabe sobre Quinta técnica: prefixo comum automático?

O Strata tem o mecanismo strata_prefix: o cliente indica explicitamente onde termina a parte comum do prompt, e o motor guarda um checkpoint nesse ponto. As requisições seguintes que começam da mesma forma não precisam reler esse trecho. O problema é que quase nenhum cliente, seja chatbot, seja framework de agentes, faz isso. O autor adicionou uma camada no servidor (STRATA_AUTO_PREFIX=1, desligada por padrão).

O que se sabe sobre Limitações e o que fazer?

Primeiro, as ressalvas. Todos os números vêm de uma única configuração e de um único cenário com dois clientes, e o ganho do autoprefixo depende de quanto início em comum suas requisições têm. O patch está na branch de um fork e não foi aceito no upstream. O autor abriu uma issue, e não um PR, porque o CONTRIBUTING.md exige alinhar o escopo antes. Os pins disputam VRAM com o cache de especialistas, então será preciso ajustar o orçamento. Na prática, a ordem é esta.

ZK
Zhemal Khamidun — CPO da Alpina Digital, gerente de produto do AlpinaGPT. Cria produtos de IA desde 2019. O Hamidun News é um projeto pessoal que virou um agregador em produção com mais de 6.000 leitores.
✦ Unified AI Workspace · Nomad

Test Frontier LLMs & Autonomous Agents in One Workspace

Run Claude Opus 5.5, GPT-6, Gemini 3.1, and DeepSeek side-by-side in Nomad AI (nomadnet.ai) — unified model routing, deep research, and multimodal workflows under one subscription.

Try Nomad AI →Launch Nomad Agent
O que você acha?
Carregando comentários…