Phase 07 - Lesson 11

Mezcla de Expertos (MoE)

This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.

Un transformer denso de 70B activa todos los parámetros para cada token. Un MoE de 671B activa solo 37B por token y lo supera en cada benchmark. La dispersión (sparsity) es la idea de escala más importante de la década.

Tipo: Construcción Lenguajes: Python Prerrequisitos: Fase 7 · 05 (Full Transformer), Fase 7 · 07 (GPT) Tiempo: ~45 minutos

El Problema

Los FLOPs de inferencia de un transformer denso equivalen a su conteo de parámetros (multiplicado por 2 para el paso forward). Al escalar un modelo denso, cada token paga la cuenta completa. Para 2024, la frontera estaba chocando contra una pared de cómputo: para ser significativamente más inteligente, se necesitaban exponencialmente más FLOPs por token.

La Mezcla de Expertos (Mixture of Experts) rompe este vínculo. Reemplaza cada FFN con E expertos independientes + un enrutador (router) que elige k expertos por token. Parámetros totales = E × FFN_size. Parámetros activos por token = k × FFN_size. Configuración típica de 2026: E=256, k=8. El almacenamiento escala con E, el cómputo escala con k.

La frontera de 2026 es casi en su totalidad MoE: DeepSeek-V3 (671B en total / 37B activos), Mixtral 8×22B, Qwen2.5-MoE, Llama 4, Kimi K2, gpt-oss. En la tabla de clasificación independiente de Artificial Analysis, los 10 mejores modelos de código abierto son todos MoE.

El Concepto

Capa MoE: el enrutador selecciona k de E expertos por token

El reemplazo de FFN

Bloque de transformer denso:

h = x + attn(norm(x))
h = h + FFN(norm(h))

Bloque 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 experto es una FFN independiente (normalmente SwiGLU). El enrutador es una sola capa lineal. Cada token elige sus propios k expertos y obtiene una mezcla ponderada (gated) de sus salidas.

El problema de balance de carga

Si el enrutador pasa el 90% de los tokens por el experto 3, los demás expertos se quedan inactivos (starve). Se han probado tres soluciones:

  1. Pérdida auxiliar de balance de carga (Switch Transformer, Mixtral). Añade una penalización proporcional a la varianza en el uso de expertos. Funciona, pero añade un hiperparámetro y una segunda señal de gradiente.
  2. Capacidad de expertos + descarte de tokens (primeros Switch). Cada experto procesa como máximo C × N/E tokens; los tokens sobrantes se saltan la capa. Afecta la calidad.
  3. Balance libre de pérdida auxiliar (DeepSeek-V3). Añade un sesgo (bias) aprendido por experto que desplaza la selección top-k del enrutador. El sesgo se actualiza fuera de la pérdida de entrenamiento. Sin penalización en el objetivo principal. El gran avance de 2024.

El enfoque de DeepSeek-V3: después de cada paso de entrenamiento, para cada experto, se verifica si su uso está por encima o por debajo del objetivo. Se ajusta el sesgo en ±γ. La selección utiliza scores + bias. Las probabilidades de los expertos utilizadas para la ponderación (gating) son las puntuaciones brutas scores sin cambios. Esto desacopla el enrutamiento de la expresión.

Expertos compartidos

DeepSeek-V2/V3 también divide los expertos en compartidos y enrutados. Cada token pasa a través de todos los expertos compartidos. Los expertos enrutados se eligen mediante top-k. Los expertos compartidos capturan el conocimiento común; los expertos enrutados se especializan. V3 ejecuta 1 experto compartido más los top-8 de 256 enrutados.

Expertos de granularidad fina

MoE clásico (GShard, Switch): cada experto es tan ancho como una FFN completa. E es pequeño (8–64), k es pequeño (1–2).

MoE moderno de granularidad fina (DeepSeek-V3, Qwen-MoE): cada experto es más estrecho (1/8 del tamaño de la FFN). E es grande (256+), k es mayor (8+). Los mismos parámetros totales, pero las combinaciones escalan mucho más rápido. C(256, 8) = 400 billones de posibles "expertos" por token. La calidad sube, la latencia se mantiene estable.

El perfil de costo

Por token, por capa:

Configuración Parámetros activos / token Parámetros totales
Mixtral 8×22B ~39B 141B
Llama 3 70B (denso) 70B 70B
DeepSeek-V3 37B 671B
Kimi K2 (MoE) ~32B 1T

DeepSeek-V3 supera a Llama 3 70B (denso) en casi todos los benchmarks, a la vez que realiza menos FLOPs activos por token. Más parámetros = más conocimiento. Más FLOPs activos = más cómputo por token. MoE los desacopla.

El inconveniente: memoria

Todos los expertos residen en la GPU, independientemente de cuáles se activen. Un modelo de 671B necesita ~1.3 TB de VRAM para pesos en fp16. El despliegue de MoE en la frontera técnica requiere paralelismo de expertos: fragmentar los expertos entre las GPU y enrutar los tokens a través de la red. La latencia está dominada por la comunicación all-to-all, no por la multiplicación de matrices (matmul).

Constrúyelo

Consulta code/main.py. Una capa MoE compacta en biblioteca estándar pura con:

  • n_experts=8 expertos tipo SwiGLU (una capa lineal cada uno, para ilustración)
  • enrutamiento top-k=2
  • pesos de gating normalizados con softmax
  • balanceo libre de pérdida auxiliar mediante sesgo por experto

Paso 1: el enrutador

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

El sesgo afecta la selección, no el peso de la compuerta (gate). Ese es el truco de DeepSeek-V3: el sesgo corrige el desequilibrio de carga sin alterar las predicciones del modelo.

Paso 2: pasar 100 tokens por el enrutador

Realiza un seguimiento de la frecuencia con la que se activa cada experto. Sin el sesgo, el uso está sesgado. Con un ciclo de actualización de sesgo ( para expertos sobreutilizados, para subutilizados), el uso converge a una distribución uniforme en unas pocas iteraciones.

Paso 3: comparación del conteo de parámetros

Imprime el "equivalente denso" de una configuración de MoE. Con la forma de DeepSeek-V3: 256 expertos enrutados + 1 compartido, 8 activos, d_model=7168. El recuento total de parámetros es asombroso. El recuento activo es un séptimo de un Llama 3 70B denso.

Úsalo

HuggingFace loading:

from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("mistralai/Mixtral-8x22B-v0.1")

Inferencia de producción en 2026: vLLM admite el enrutamiento MoE de forma nativa. SGLang tiene la ruta paralela de expertos más rápida. Ambos manejan automáticamente la selección top-k y el paralelismo de expertos.

Cuándo elegir MoE:

  • Deseas calidad de frontera con un menor costo de inferencia por token.
  • Dispones de la VRAM / infraestructura paralela de expertos necesaria.
  • Tu carga de trabajo es pesada en tokens (chat, código), no en contexto (documentos largos).

Cuándo NO elegir MoE:

  • Despliegue en dispositivos locales (edge): pagas el almacenamiento completo por cualquier FLOP activo.
  • Servicio a un solo usuario con latencia crítica: el enrutamiento de expertos añade sobrecarga.
  • Modelos pequeños (<7B): la ventaja de calidad de MoE solo aparece por encima de un umbral de cómputo (~6B de parámetros activos).

Envíalo

Consulta outputs/skill-moe-configurator.md. La habilidad (skill) elige E, k y la disposición de expertos compartidos para un nuevo MoE dado un presupuesto de parámetros, tokens de entrenamiento y el objetivo de despliegue.

Ejercicios

  1. Fácil. Ejecuta code/main.py. Observa cómo la actualización de sesgo libre de pérdida auxiliar equilibra el uso de expertos durante 50 iteraciones.
  2. Medio. Reemplaza el enrutador aprendido con un enrutador basado en hash (determinista, sin aprendizaje). Compara la calidad y el equilibrio. ¿Por qué es mejor el enrutador aprendido?
  3. Difícil. Implementa el "enrutamiento adaptado al rollout" (rollout-matched routing) al estilo GRPO (truco de DeepSeek-V3.2): registra qué expertos se activan durante la inferencia, fuerza el mismo enrutamiento durante el cálculo del gradiente. Mide el efecto en una configuración básica de gradiente de política (policy-gradient).

Términos Clave

Término Lo que la gente dice Lo que realmente significa
Experto (Expert) "Una FFN entre muchas" Una red de alimentación hacia adelante (feed-forward) independiente; parámetros dedicados a una porción dispersa del cálculo de la FFN.
Enrutador (Router) "La compuerta" Una pequeña capa lineal que califica cada token contra cada experto; selección top-k.
Enrutamiento top-k "k expertos activos por token" El cálculo de la FFN de cada token pasa exactamente por k expertos, ponderado por la compuerta.
Pérdida auxiliar "Penalización de equilibrio de carga" Término de pérdida adicional que penaliza el uso sesgado de expertos.
Libre de pérdida auxiliar "El truco de DeepSeek-V3" Equilibrio a través de sesgo por experto solo en la selección del enrutador; sin gradiente adicional.
Experto compartido "Siempre activo" Experto adicional por el que pasa cada token; captura el conocimiento común.
Paralelismo de expertos "Fragmentar por experto" Distribuir diferentes expertos en diferentes GPU; enrutar tokens a través de la red.
Dispersión (Sparsity) "Parámetros activos < parámetros totales" La relación k × expert_size / (E × expert_size); 37/671 ≈ 5.5% para DeepSeek-V3.

Lecturas Adicionales

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