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

Camada MoE: o roteador seleciona k de E especialistas por token

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:

  1. 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.
  2. Capacidade do especialista + descarte de tokens (versões antigas do Switch). Cada especialista processa no máximo C × N/E tokens; tokens excedentes pulam a camada. Prejudica a qualidade.
  3. 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=8 especialistas 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

  1. 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.
  2. 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?
  3. 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

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).