Puntata 204
Puntata 204 — Mixture of Experts (MoE)
Livello: 🧙 Maestro Yoda · Capitolo 19 · Architetture
Un trucco per avere un modello da 600 miliardi di parametri che, per ogni token, ne usa 37. Come pagare un consulente ma rispondere al cellulare al tuo posto.
Il problema dello scaling
Vuoi che il tuo modello sia più intelligente. La ricetta classica: più parametri. Ma più parametri significa più FLOPs per ogni token, quindi più costo di training e di inferenza.
L’osservazione MoE: per ogni token, non serve usare tutto il modello. Alcune parti del cervello si attivano in matematica, altre in tedesco, altre in codice Rust. Se sapessi “instradare” i token alle parti giuste, potresti avere un modello gigantesco in parametri ma piccolo in compute attivo per ogni token.
Il sogno della sparsità condizionale: tanti pesi, pochi accesi alla volta.
Come è fatto un blocco MoE
Sostituisci il feed-forward (FFN) di un blocco transformer con:
- N “esperti” — N FFN indipendenti, con i loro pesi. Tipicamente N = 8, 16, 32, 64, 128.
- Un router (gating) — una piccola rete (di solito uno strato lineare + softmax) che per ogni token produce un punteggio per ogni esperto.
- Top-k selection — del router prendi i
kesperti col punteggio più alto (tipicamentek = 1ok = 2). - Combinazione pesata — fai forward attraverso quei
kesperti, mescoli i loro output con i pesi del router.
Pseudocodice:
def moe_block(x):
scores = router(x) # (n_tokens, n_experts)
top_k_scores, top_k_idx = topk(scores, k=2)
top_k_scores = softmax(top_k_scores)
output = zeros_like(x)
for i in range(k):
expert_id = top_k_idx[..., i]
weight = top_k_scores[..., i]
output += weight * experts[expert_id](x)
return output
Parametri totali: N × parametri_FFN. Parametri attivi per token: k × parametri_FFN. Il rapporto N/k è la sparsità.
Esempio Mixtral 8×7B (Mistral, fine 2023):
- 8 esperti, top-2 per token
- ~47B parametri totali, ~13B attivi per token
- Quality di un 13B in compute, capacità simile a un 70B in parametri
Il problema del load balancing
Se non controlli niente, il router impara a mandare tutti i token allo stesso esperto (collasso). Gli altri muoiono di fame e non imparano nulla.
Soluzione standard: load balancing loss auxiliare durante il training, che penalizza la distribuzione sbilanciata. Mira a far sì che ogni esperto riceva ~n_tokens × k / N token.
Varianti più moderne:
- Expert capacity — cap massimo di token per esperto per batch. I token “in eccesso” vengono droppati o instradati altrove.
- Aux-loss-free (DeepSeek V3, 2024) — eliminano la loss ausiliaria e bilanciano via bias dinamico sul router. Stato dell’arte attuale.
- Switch Transformer (Google 2021) — top-1 puro per massima efficienza, con dropping aggressivo.
Famiglia MoE moderna
| Modello | N × dim | Attivi/token | Note |
|---|---|---|---|
| Switch Transformer (Google, 2021) | fino a 1.6T parametri / 2048 esperti | top-1 | Il pionieristico open di MoE su grande scala |
| GLaM (Google, 2022) | 1.2T / 64 esperti | top-2 | ~50B attivi |
| Mixtral 8x7B (Mistral, 2023) | 47B / 8 | top-2 | Primo MoE open competitivo |
| Mixtral 8x22B (2024) | 141B / 8 | top-2 | ~39B attivi |
| DeepSeek V2 (2024) | 236B / 160 + 2 shared | top-6 | Architettura con shared expert |
| DeepSeek V3 / R1 (2024-25) | 671B / 256 + 1 shared | top-8 | ~37B attivi, training a costo bassissimo |
| Qwen2.5-MoE-A14B | 14B attivi su totale maggiore | top-? | Famiglia Alibaba |
| Grok-1 (xAI, 2024) | 314B / 8 | top-2 | ~78B attivi |
| GPT-4 family (rumored) | MoE | ? | Dettagli non pubblici, ma quasi certamente MoE |
Tendenza 2025-2026: N più alto (256, 512 esperti), expert più piccoli e specializzati, shared expert sempre attivo per il “core knowledge”.
I trade-off reali
Pro:
- Più parametri = più capacità a parità di compute attivo.
- Training più rapido a parità di quality finale (verified Switch, GLaM, DS V3).
- Specializzazione emergente: analisi mostrano che alcuni esperti si specializzano in domini (matematica, codice, lingua specifica).
Contro:
- VRAM totale enorme: devi caricare tutti i parametri anche se ne usi una frazione. Mixtral 8x22B chiede ~280 GB di VRAM in FP16. Per girare un MoE serve hardware grosso anche se “attivi pochi parametri”.
- Inferenza poco amichevole su singola GPU consumer: hai bisogno di tutti i pesi disponibili per il routing. Quantizzazione aiuta (vedi 227), ma c’è un floor.
- Batching complicato: con token che vanno a esperti diversi, il batch utile per ogni esperto si riduce. Soluzioni: expert parallelism che distribuisce esperti su diverse GPU.
- Stabilità di training: tuning del router non banale; senza load balancing collassa.
- Out-of-domain: se il routing è troppo specializzato, su input “diversi” la qualità crolla.
Quando ha senso usare MoE
Sì:
- Training su scala grandissima dove vuoi più capacità senza esplodere FLOPs.
- Inferenza dove hai VRAM abbondante e vuoi spingere quality/$.
- Modelli multilingua o multi-dominio dove la specializzazione paga.
No:
- Inferenza on-device. Non hai 200 GB di VRAM su un laptop.
- Single-GPU consumer con vincoli stringenti — un denso da 30B può vincere su un MoE da 70B totali / 13B attivi nella tua RTX 4090.
Shared expert: l’aggiunta DeepSeek
DeepSeek V2/V3 introducono un trucco semplice ed efficace: uno o due esperti sempre attivi (shared expert), oltre ai top-k ruotati.
Logica: c’è del “conoscimento generale” che serve sempre. Lasciarlo a un esperto sempre acceso libera gli altri dal doverlo replicare ognuno, e migliora la specializzazione.
È diventato pattern standard nei MoE 2024+.
Cosa “impara” un esperto?
Studi di interpretability su Mixtral, OLMoE e DeepSeek mostrano:
- Specializzazione debole per token category (verbi vs nomi, codice vs prosa, numeri).
- Specializzazione forte per lingua in modelli multilingua (esperti diversi per cinese, arabo, codice).
- Pattern di routing stabile per token comuni, rumoroso per token rari.
Non si trovano “esperti di chimica” o “esperti di Shakespeare” chiari. La specializzazione è più granulare di quanto sembri dal nome.
Glossario lampo
- Gating — la rete che decide il routing.
- Top-k routing — selezionare i k esperti più probabili.
- Expert capacity — cap di token per esperto, per evitare hot-spot.
- Shared expert — esperto sempre attivo, usato per la conoscenza comune.
- Expert parallelism — distribuire esperti diversi su GPU diverse per scalare.
TEST hands-on
- Scarica
mistralai/Mixtral-8x7B-Instruct-v0.1da HuggingFace (serve hardware: minimo 2× A100 40 GB, o quantization Q4 per girarlo su una H100 / RTX 6000 Ada). - In alternativa, usa
mistralai/Mixtral-8x7Bvia API (DeepInfra, Together, Fireworks). - Modifica il codice del transformer (o usa
transformersdirettamente) per loggare i routing decisions: per ogni token, quali sono i top-2 esperti scelti? - Manda 3 prompt diversi: uno in inglese, uno in italiano, uno in Python. Tabula la distribuzione degli esperti scelti per ogni caso. Vedi pattern emergenti?
- Bonus: prova
deepseek-ai/DeepSeek-V3via API e confronta. Il routing dovrebbe essere ancora più granulare (256 esperti vs 8).
Take-away
MoE è il modo con cui l’industria ha rotto la regola “più capacità = più costo”. È un acquisto di parametri pagato in VRAM invece che in compute. Non rende il modello più “intelligente per natura” — gli dà più posto dove mettere conoscenza, lasciando il processo computazionale leggero. La vera AGI, se mai arriverà, sarà quasi certamente sparsa.
➡️ Prossima puntata: State Space Models e Mamba — l’alternativa al transformer (vedi 205, già pubblicata).