¡Hola Devs! ¿Listos para entender los MoE?

Si has seguido el mundo de los LLMs, seguro has visto modelos como DeepSeek R1, Qwen 3.5 o Mixtral-8x7B. Todos usan una arquitectura llamada Mixture of Experts (MoE). ¿La idea? En lugar de usar todos los parámetros para cada token, solo activas un subconjunto de "expertos".

Ejemplo: GPT-OSS-20B tiene 21B parámetros totales, pero solo ~3.6B activos por token. Esto permite ~110 tokens/segundo en hardware de consumo.

Pero aquí viene el problema: las herramientas existentes (Hugging Face transformers, por ejemplo) fueron diseñadas para modelos densos. Cargar los pesos de un MoE, hacer quantización o distribuirlo entre GPUs era un dolor de cabeza. Hasta ahora.

Diagram showing Mixture of Experts architecture with router and multiple expert sub-networks in a Transformer Programming Illustration

El Refactor del Cargamento de Pesos: De 66s a 10s

El Problema

Imagina que tu checkpoint tiene 256 tensores separados para los expertos:

# DeepSeek-V3: 256 tensores por capa
'model.layers.3.mlp.experts.0.gate_proj.weight'
'model.layers.3.mlp.experts.1.gate_proj.weight'
# ... hasta expert 255

Pero la GPU quiere un solo tensor para hacer grouped GEMM. El código viejo simplemente no podía con eso.

La Solución: WeightConverter

Ahora el cargamento es un pipeline de conversión:

from transformers.models.llama.convert_weights import WeightConverter, MergeModulelist, Concatenate

# Junta todos los expertos en un solo tensor
converter = WeightConverter(
    ["block_sparse_moe.experts.*.w1.weight", "block_sparse_moe.experts.*.w3.weight"],
    "mlp.experts.gate_up_proj",
    operations=[
        MergeModulelist(dim=0),
        Concatenate(dim=1),
    ]
)

Resultados en Benchmarks

VersiónEstrategiaModoTiempo
v4.57.6device_map="auto"Threadpool66.24s
v4.57.6TPOOM
v5device_map="auto"Async20.71s
v5TPAsync10.1s

6x más rápido. Y no es solo por usar más hilos — es porque el pipeline evita picos de memoria y ya empaca los expertos durante la carga.

Developer running large MoE model weight loading on a server with GPU acceleration Algorithm Concept Visual

Expert Backend: El Motor que Puedes Cambiar

Una vez que los expertos están en un solo tensor, necesitas rutear los tokens eficientemente. El nuevo sistema de Expert Backend te permite elegir la implementación sin tocar el modelo:

from transformers.models.llama.modeling_llama import use_experts_implementation

@use_experts_implementation
class LlamaSparseMoeBlock(nn.Module):
    pass  # El decorator maneja el dispatch

Tres backends:

  • eager: loop simple, para debugging.
  • batched_mm: duplica pesos por token, usa torch.bmm. Rápido para batches pequeños.
  • grouped_mm: agrupa tokens por expert, usa torch._grouped_mm. Ideal para batches grandes.

Paralelismo de Expertos: MoE en Varias GPUs

¿Tienes 4 GPUs y un modelo de 120B? Activa expert parallelism con una línea:

from transformers.distributed.configuration_utils import DistributedConfig

distributed_config = DistributedConfig(enable_expert_parallel=True)
model = AutoModelForCausalLM.from_pretrained(
    "openai/gpt-oss-120b",
    distributed_config=distributed_config,
)

Ejecuta con:

torchrun --nproc-per-node 4 script.py

Cada GPU carga solo sus expertos locales y usa all-reduce para combinar resultados.

Entrenamiento MoE: 12x Más Rápido

Entrenar MoE siempre fue complicado — comunicación distribuida, inestabilidad en el ruteo... La colaboración con Unsloth lo cambió todo:

  • 12× más rápido que v4
  • >35% menos VRAM
  • 6× más contexto

Usan kernels customizados Triton + LoRA sobre el Expert Backend. Guía oficial de Unsloth.

Limitaciones y Cuidados

  • Router Collapse: Sin regularización, el router puede mandar todo al mismo expert. ¡Usa load balancing loss!
  • Memoria Total: Aunque los parámetros activos son pocos, los totales deben caber en la memoria agregada de tus GPUs.
  • Quantización por Expert: Ahora es posible con v5, pero sigue siendo un workflow avanzado.

¿Qué Sigue?

  1. Prueba cargar un modelo MoE con transformers>=5.0 y mide el tiempo.
  2. Experimenta con los tres backends en tu setup.
  3. Si entrenas, usa Unsloth para fine-tuning MoE.

Lecturas Recomendadas

Fuente: Blog de Hugging Face - MoE in Transformers

Distributed training setup with multiple GPUs communicating for expert parallelism Technical Structure Concept

Conclusión

El transformers v5 no es solo una actualización menor — es un rediseño completo que hace que los modelos MoE sean ciudadanos de primera clase. Si antes evitabas los MoE por la complejidad de carga o el overhead de entrenamiento, este es el momento de darle una oportunidad. La comunidad de código abierto en Latinoamérica ya está adoptándolo. ¡Vamos a darle! 🚀

Este contenido fue redactado con la asistencia de herramientas de IA, basándose en fuentes confiables, y fue revisado por nuestro equipo editorial antes de su publicación. No reemplaza el asesoramiento de un profesional especializado.