Phase 07 - Lesson 11
Mistura de Especialistas (MoE)
This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.
Um transformer denso de 70B ativa todos os parâmetros para cada token. Um MoE de 671B ativa apenas 37B por token e o supera em todos os benchmarks. A esparsidade é a ideia de escala mais importante da década.
Tipo: Construção Linguagens: Python Pré-requisitos: Fase 7 · 05 (Full Transformer), Fase 7 · 07 (GPT) Tempo: ~45 minutos
O Problema
Os FLOPs de inferência de um transformer denso equivalem à sua contagem de parâmetros (multiplicada por 2 para o passo forward). Ao escalar um modelo denso, cada token paga a conta completa. Em 2024, a fronteira estava atingindo uma barreira de computação: para ser significativamente mais inteligente, você precisava de exponencialmente mais FLOPs por token.
A Mistura de Especialistas (Mixture of Experts) quebra essa ligação. Substitua cada FFN por E especialistas independentes + um roteador que escolhe k especialistas por token. Parâmetros totais = E × FFN_size. Parâmetros ativos por token = k × FFN_size. Configuração típica de 2026: E=256, k=8. O armazenamento escala com E, a computação escala com k.
A fronteira de 2026 é quase inteiramente MoE: DeepSeek-V3 (671B totais / 37B ativos), Mixtral 8×22B, Qwen2.5-MoE, Llama 4, Kimi K2, gpt-oss. No leaderboard independente da Artificial Analysis, os 10 principais modelos de código aberto são todos MoE.
O Conceito
A substituição de FFN
Bloco de transformer denso:
h = x + attn(norm(x))
h = h + FFN(norm(h))
Bloco MoE:
h = x + attn(norm(x))
scores = router(norm(h)) # (N_tokens, E)
top_k = argmax_k(scores) # pick k of E per token
h = h + sum_{e in top_k}(
gate(scores[e]) * Expert_e(norm(h))
)
Cada especialista é uma FFN independente (geralmente SwiGLU). O roteador é uma única camada linear. Cada token escolhe seus próprios k especialistas e recebe uma mistura ponderada (gated) de suas saídas.
O problema de balanceamento de carga
Se o roteador passar 90% dos tokens pelo especialista 3, os outros especialistas morrerão de fome (starve). Três soluções já foram tentadas:
- Perda auxiliar de balanceamento de carga (Switch Transformer, Mixtral). Adiciona uma penalidade proporcional à variância no uso dos especialistas. Funciona, mas adiciona um hiperparâmetro e um segundo sinal de gradiente.
- Capacidade do especialista + descarte de tokens (versões antigas do Switch). Cada especialista processa no máximo
C × N/Etokens; tokens excedentes pulam a camada. Prejudica a qualidade. - Balanceamento sem perda auxiliar (DeepSeek-V3). Adiciona um viés (bias) aprendido por especialista que desloca a seleção de top-k do roteador. O viés é atualizado fora da perda de treinamento. Sem penalidade no objetivo principal. O grande avanço de 2024.
Abordagem do DeepSeek-V3: após cada etapa de treinamento, para cada especialista, verifica-se se seu uso está acima ou abaixo da meta. Ajusta-se o viés em ±γ. A seleção usa scores + bias. As probabilidades dos especialistas usadas para ponderação (gating) são as pontuações brutas scores inalteradas. Isso desacopla o roteamento da expressão.
Especialistas compartilhados
O DeepSeek-V2/V3 também divide os especialistas em compartilhados e roteados. Cada token passa por todos os especialistas compartilhados. Os especialistas roteados são escolhidos via top-k. Os especialistas compartilhados capturam o conhecimento comum; os especialistas roteados se especializam. O V3 executa 1 especialista compartilhado mais os top-8 de 256 especialistas roteados.
Especialistas de granularidade fina
MoE clássico (GShard, Switch): cada especialista é tão amplo quanto uma FFN completa. E é pequeno (8–64), k é pequeno (1–2).
MoE moderno de granularidade fina (DeepSeek-V3, Qwen-MoE): cada especialista é mais estreito (1/8 do tamanho de uma FFN). E é grande (256+), k é maior (8+). A mesma quantidade total de parâmetros, mas as combinações escalam muito mais rápido. C(256, 8) = 400 trilhões de "especialistas" possíveis por token. A qualidade aumenta, e a latência permanece estável.
O perfil de custo
Por token, por camada:
| Configuração | Parâmetros ativos / token | Parâmetros totais |
|---|---|---|
| Mixtral 8×22B | ~39B | 141B |
| Llama 3 70B (denso) | 70B | 70B |
| DeepSeek-V3 | 37B | 671B |
| Kimi K2 (MoE) | ~32B | 1T |
O DeepSeek-V3 supera o Llama 3 70B (denso) em quase todos os benchmarks, ao mesmo tempo em que realiza menos FLOPs ativos por token. Mais parâmetros = mais conhecimento. Mais FLOPs ativos = mais computação por token. O MoE os desacopla.
O porém: memória
Todos os especialistas residem na GPU, independentemente de quais deles são acionados. Um modelo de 671B precisa de ~1.3 TB de VRAM para pesos em fp16. A implantação de MoEs de fronteira exige paralelismo de especialistas — fragmentar os especialistas entre GPUs e rotear tokens pela rede. A latência é dominada pela comunicação all-to-all, e não pela multiplicação de matrizes (matmul).
Construa
Consulte code/main.py. Uma camada MoE compacta em biblioteca padrão pura com:
n_experts=8especialistas do tipo SwiGLU (uma camada linear cada, para fins ilustrativos)- roteamento top-k=2
- pesos de gating normalizados via softmax
- balanceamento sem perda auxiliar através de viés por especialista
Passo 1: o roteador
def route(hidden, W_router, top_k, bias):
scores = [sum(h * w for h, w in zip(hidden, W_router[e])) for e in range(len(W_router))]
biased = [s + b for s, b in zip(scores, bias)]
top_idx = sorted(range(len(biased)), key=lambda i: -biased[i])[:top_k]
# softmax over ORIGINAL scores of the chosen experts
chosen = [scores[i] for i in top_idx]
m = max(chosen)
exps = [math.exp(c - m) for c in chosen]
s = sum(exps)
gates = [e / s for e in exps]
return top_idx, gates
O viés afeta a seleção, não o peso do gate. Esse é o truque do DeepSeek-V3 — o viés corrige o desequilíbrio de carga sem interferir nas previsões do modelo.
Passo 2: passar 100 tokens pelo roteador
Monitore a frequência com que cada especialista é acionado. Sem o viés, o uso é distorcido. Com um loop de atualização do viés (-γ para especialistas superutilizados, +γ para subutilizados), o uso converge para uma distribuição uniforme ao longo de algumas iterações.
Passo 3: comparação do número de parâmetros
Imprima o "equivalente denso" de uma configuração de MoE. No formato do DeepSeek-V3: 256 especialistas roteados + 1 compartilhado, 8 ativos, d_model=7168. A contagem total de parâmetros é impressionante. A contagem ativa é um sétimo de um Llama 3 70B denso.
Use
HuggingFace loading:
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("mistralai/Mixtral-8x22B-v0.1")
Inferência de produção em 2026: o vLLM oferece suporte nativo ao roteamento de MoE. O SGLang tem o caminho mais rápido para paralelismo de especialistas. Ambos lidam automaticamente com a seleção de top-k e o paralelismo de especialistas.
Quando escolher MoE:
- Você deseja qualidade de fronteira com menor custo de inferência por token.
- Você tem VRAM / infraestrutura de paralelismo de especialistas.
- Sua carga de trabalho é focada em geração de tokens (chat, código), não em contextos longos (documentos extensos).
Quando NÃO escolher MoE:
- Implantação local/edge — você paga pelo armazenamento total para qualquer FLOP ativo.
- Atendimento a um único usuário com latência crítica — o roteamento de especialistas adiciona sobrecarga (overhead).
- Modelos pequenos (<7B) — a vantagem de qualidade do MoE só aparece acima de um limite computacional (~6B de parâmetros ativos).
Implante
Consulte outputs/skill-moe-configurator.md. A habilidade (skill) escolhe E, k e o layout de especialistas compartilhados para um novo MoE, considerando o orçamento de parâmetros, tokens de treinamento e o destino de implantação.
Exercícios
- Fácil. Execute
code/main.py. Observe como a atualização do viés sem perda auxiliar equilibra o uso dos especialistas ao longo de 50 iterações. - Médio. Substitua o roteador aprendido por um roteador baseado em hash (determinístico, sem aprendizado). Compare a qualidade e o equilíbrio. Por que o roteador aprendido é melhor?
- Difícil. Implemente o "roteamento emparelhado por rollout" (rollout-matched routing) no estilo GRPO (truque do DeepSeek-V3.2): registre quais especialistas são acionados durante a inferência, force o mesmo roteamento durante o cálculo do gradiente. Meça o efeito em uma configuração simples de gradiente de política (policy-gradient).
Termos-Chave
| Termo | O que as pessoas dizem | O que realmente significa |
|---|---|---|
| Expert (Especialista) | "Uma FFN entre muitas" | Uma rede feed-forward independente; parâmetros dedicados a uma fatia esparsa do cálculo da FFN. |
| Router (Roteador) | "O gate" | Uma pequena camada linear que pontua cada token em relação a cada especialista; seleção top-k. |
| Roteamento top-k | "k especialistas ativos por token" | O cálculo da FFN de cada token passa por exatamente k especialistas, ponderado pelo gate. |
| Perda auxiliar | "Penalidade de balanceamento de carga" | Termo de perda extra que penaliza o uso desequilibrado dos especialistas. |
| Sem perda auxiliar (Auxiliary-loss-free) | "Truque do DeepSeek-V3" | Balanceamento via viés por especialista apenas na seleção do roteador; sem gradiente extra. |
| Especialista compartilhado | "Sempre ativo" | Especialista extra pelo qual todos os tokens passam; captura o conhecimento comum. |
| Paralelismo de especialistas | "Fragmentar por especialista" | Distribuir diferentes especialistas em diferentes GPUs; rotear os tokens pela rede. |
| Esparsidade | "Parâmetros ativos < parâmetros totais" | A razão k × expert_size / (E × expert_size); 37/671 ≈ 5.5% para o DeepSeek-V3. |
Leituras Adicionais
- Shazeer et al. (2017). Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer — a ideia.
- Fedus, Zoph, Shazeer (2022). Switch Transformer: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity — Switch, o MoE clássico.
- Jiang et al. (2024). Mixtral of Experts — Mixtral 8×7B.
- DeepSeek-AI (2024). DeepSeek-V3 Technical Report — MLA + MoE sem perda auxiliar + MTP.
- Wang et al. (2024). Auxiliary-Loss-Free Load Balancing Strategy for Mixture-of-Experts — o artigo sobre balanceamento baseado em viés.
- Dai et al. (2024). DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models — a divisão entre especialistas de granularidade fina + compartilhados que o roteador desta lição usa.
- Kim et al. (2022). DeepSpeed-MoE: Advancing Mixture-of-Experts Inference and Training — o artigo original sobre especialistas compartilhados.