Phase 07: Transformers Deep Dive

Le groupe d'experts (MoE)

Un transformateur dense 70B active tous les paramètres pour chaque jeton. Un MoE 671B active seulement 37B par jeton et le bat sur chaque référence.

Type: Build

Languages: Python

Prerequisites: Phase 7 · 05 (Full Transformer), Phase 7 · 07 (GPT)

Time: ~45 minutes

Le problème

Les FLOP d'un transformateur dense sont à l'inférence égaux au nombre de paramètres (deux fois pour le passage à l'avant).

Le mélange d'experts rompt ce lien.Eexperts indépendants + un routeur qui choisit kParmi les paramètres de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de la valeur de cette valeur de cette valeur de cette valeur de cette valeur de cette valeur de cette valeur de cette valeur de cette valeur de cette valeur,E × FFN_size. Paramètres actifs par jeton = k × FFN_size. Configuration typique pour 2026: E=256- Je suis là .k=8- Balances de stockage avecE, calculer des échelles avec k- Je suis désolé .

La frontière 2026 est presque entièrement MoE: DeepSeek-V3 (671B total / 37B actif), Mixtral 8×22B, Qwen2.5-MoE, Llama 4, Kimi K2, gpt-oss.

Le concept

!MoE layer: router selects k of E experts per token

Le swap FFN

Bloc de transformateur dense:

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

Bloc de la moée:

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))
    )

Chaque expert est un FFN indépendant (typiquement SwiGLU). le routeur est une seule couche linéaire. chaque jeton choisit son proprekles experts et obtient un mélange fermé de leurs résultats.

Le problème de l'équilibre de la charge

Si le routeur passe 90% des jetons par l'expert 3, les autres experts meurent de faim.

  1. Auxiliary load-balancing loss(Switch Transformer, Mixtral). Ajouter une pénalité proportionnelle à la variance dans l'utilisation des experts. Fonctionne, mais ajoute un hyperparamètre et un deuxième signal de gradient.
  2. Expert capacity + token dropping(début de la mise en place).C × N/ELes jetons de débordement sautent la couche.
  3. Auxiliary-loss-free balancing(DeepSeek-V3). Ajouter un biais appris par expert qui change la sélection top-k du routeur.

Approche de DeepSeek-V3: après chaque étape de formation, chaque expert vérifie si son utilisation est supérieure ou inférieure à l'objectif.±γ. Utilisation de sélection scores + biasLes probabilités d' expertise utilisées pour le dépistage sont les premièresscoresDécoupe le routage de l'expression.

Des experts partagés

DeepSeek-V2/V3 divise également les experts en shared et routed. Chaque jeton passe par tous les experts partagés. Les experts partagés sont choisis par le biais de top-k. Les experts partagés capturent les connaissances communes; les experts partagés se spécialisent. V3 exécute 1 expert partagé plus le top-8 des 256 partagés.

Des experts en grains fins

MoE classique (GShard, Switch): chaque expert est aussi large qu'un FFN complet. Eest petite (864), kest petite (12).

MoE moderne à grains fins (DeepSeek-V3, Qwen-MoE): chaque expert est plus étroit (1/8 FFN de taille). Eest grand (256+), kLes paramètres totaux sont les mêmes, mais les combinaisons évoluent beaucoup plus rapidement. C(256, 8) = 400 trillionLa qualité augmente, la latence reste stable.

Le profil des coûts

Par jeton, par couche:

ConfigActive params / tokenTotal params
Mixtral 8×22B~39B141B
Llama 3 70B (dense)70B70B
DeepSeek-V337B671B
Kimi K2 (MoE)~32B1T

DeepSeek-V3 bat Llama 3 70B (dense) sur presque tous les indicateurs de référence en faisant fewer active FLOPs per tokenPlus de paramètres = plus de connaissances. Plus de FLOPs actifs = plus de calcul par jeton.

Le problème: la mémoire

Tous les experts vivent sur GPU, quel que soit le type de GPU. Un modèle 671B nécessite ~ 1,3 To de VRAM pour les poids fp16.

Faites-le

Regardez !code/main.py- une couche compacte de MoE en stdlib pur avec:

  • n_experts=8Des experts en SWIGU (un linéaire par exemplaire)
  • en route de haut-k=2
  • poids de fermeture normalisé à la hauteur de la douceur maximale
  • équilibrage sans perte auxiliaire par biais de biais par expert

Étape 1: le routeur

pythondef 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

Le biais affecte la sélection, pas le poids de la porte. C'est le truc DeepSeek-V3 bias corrige le déséquilibre de charge sans diriger les prédictions du modèle.

Étape 2: exécuter 100 jetons à travers le routeur

Suivre quelle fréquence les experts tirent. Sans le biais, l'utilisation est biaisée.-γpour les experts surutilisés +γLes utilisations sont généralement moins fréquentes (en fonction de la fréquence de l'utilisation), et l'utilisation converge à une distribution uniforme sur quelques itérations.

Étape 3: Comparation du nombre de paramètres

Imprimez l'équivalent dense d'une configuration MoE. DeepSeek-V3-forme: 256 routi + 1 partagé, 8 actif, d_model = 7168. Le nombre total de paramètres est impressionnant. Le nombre actif est un septième d'un Llama dense 3 70B.

Utilisez-le

Chargement de la face:

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

2026 production d'inférence: vLLM prend en charge le routage MoE natively. SGLang a le plus rapide parallèle expert-path.

When to pick MoE:

  • Vous voulez une qualité de pointe à un coût inférieur par jeton.
  • Vous disposez de l'infrastructure VRAM / expert parallèle.
  • Votre charge de travail est lourde en tokens (chat, code) et non lourde en contexte (longs documents).

When NOT to pick MoE:

  • Déploiement de bord vous payez le stockage complet pour tout FLOP actif.
  • L'expertise en routage pour un utilisateur unique critique de la latence ajoute des frais généraux.
  • Les modèles de petite taille (<7B) L'avantage de qualité du MoE ne se dégage qu'au-dessus d'un seuil de calcul (~6B paramètres actifs).

La faire partir

Regardez !outputs/skill-moe-configurator.md. La compétence choisit E, k et la mise en page partagée par des experts pour un nouveau budget de paramètre du MoE, des jetons de formation et des objectifs de déploiement.

Exercices

  1. Easy.On court .code/main.pyRegardez comment la mise à jour de biais sans perte auxiliaire équivaut à l'utilisation des experts sur 50 itérations.
  2. Medium.Remplacez le routeur apprenant par un routeur basé sur le hachage (déterministique, pas d'apprentissage). Comparer la qualité et l'équilibre. Pourquoi le routeur apprenant est-il meilleur?
  3. Hard.Implémenter le "routage parallèle de déploiement" (truc DeepSeek-V3.2): enregistrer ce que les experts tirent lors de l'inférence, forcer le même routage lors du calcul des gradients. Mesurer l'effet sur une configuration de politique de jeu-gradient.

Les termes clés

TermWhat people sayWhat it actually means
Expert"One FFN among many"An independent feed-forward network; parameters dedicated to a sparse slice of the FFN computation.
Router"The gate"A tiny linear layer that scores each token against each expert; top-k selection.
Top-k routing"k active experts per token"Each token's FFN computation goes through exactly k experts, weighted by gate.
Auxiliary loss"Load-balance penalty"Extra loss term that penalizes skewed expert usage.
Auxiliary-loss-free"DeepSeek-V3's trick"Balance via per-expert bias on the router's selection only; no extra gradient.
Shared expert"Always on"Extra expert through which every token passes; captures common knowledge.
Expert parallelism"Shard by expert"Distribute different experts to different GPUs; route tokens across the network.
Sparsity"Active params < total params"The ratio k × expert_size / (E × expert_size); 37/671 ≈ 5.5% for DeepSeek-V3.

Pour en savoir plus

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.