Exercices corrigés — Chunking, causalité et préfill parallèle
Consigne générale: chaque réponse doit montrer les données, la transformation, le résultat, une vérification et une limite. Un nombre seul ou une définition recopiée ne suffit pas.
Données de départ: Pour 8 tokens en chunks de 4, le premier calcule un triangle 4×4 puis transmet S₄. Le second reçoit S₄, calcule son triangle local et produit S₈. Aucun token du premier bloc ne peut lire le second.
Frontière à conserver: Le chunking améliore l’exécution ; il ne change pas automatiquement la capacité informationnelle de l’état.
Exercice 1 — Trace calculée — Préfill et décodage
Reproduisez puis commentez la chaîne input → state → output. Passez de 8 à 10 tokens avec des chunks de taille 4. Dessinez les chunks, les masques causaux locaux et les états transmis entre chunks.
Livrable: un tableau données → opération → résultat → interprétation, plus deux phrases sur la valeur modifiée.
Solution guidée
Pour 8 tokens en chunks de 4, le premier calcule un triangle 4×4 puis transmet S₄. Le second reçoit S₄, calcule son triangle local et produit S₈. Aucun token du premier bloc ne peut lire le second.
Variante résolue: Les chunks ont les tailles [4,4,2]. Les deux premiers utilisent des triangles 4×4; le dernier un triangle 2×2. L’état de fin S₄ puis S₈ traverse les frontières; aucune position ne peut lire un token futur.
Deux phases, deux régimes : le préfill voit tous les tokens du prompt en même temps (travail massivement parallélisable) ; le décodage n’ajoute qu’un token par pas (travail intrinsèquement séquentiel). Même mécanisme, profils d’exécution opposés. Le diagnostic précis : la DÉPENDANCE est séquentielle (chaque S_t dépend de S_{t−1}), mais la majorité du CALCUL par token — produits q·k locaux, écritures k vᵀ — ne l’est pas. La récurrence naïve sérialise tout parce qu’elle ne sépare pas les deux. La vérification minimale consiste à contrôler les dimensions, le signe et l’ordre de grandeur. Si la variation obtenue contredit la prédiction, localiser la première opération qui change de sens au lieu de corriger seulement la dernière ligne.
Barème Exercice 1 — /10
| Critère | Points |
|---|---|
| Données et formes explicites | 2 |
| Calcul traçable | 3 |
| Prédiction avant variation | 2 |
| Interprétation et vérification | 2 |
| Limite nommée | 1 |
Exercice 2 — Diagnostic d’une explication séduisante — Découper en chunks
Un collègue affirme: « Découper en chunks prouve que le système sera exact, rapide et stable dans tous les contextes. »
- Séparez mécanisme, hypothèse, observation et conclusion.
- Citez deux éléments corrects de la leçon et deux extrapolations non justifiées.
- Proposez une expérience bornée avec variable contrôlée, métrique et seuil d’arrêt.
- Réécrivez l’affirmation en une phrase défendable.
Solution argumentée
Un chunk de C tokens calcule d’un coup ses interactions internes autorisées (matrice C×C triangulaire) et lit le passé antérieur via l’état entrant : O = M·V + K·S_entrant. Sur la trace, le chunk 1 produit S₄, le chunk 2 le consomme — et o₅…o₈ sont exactement ceux de la récurrence. Une matrice triangulaire inférieure matérialise la règle « i ne lit que j ≤ i » : les cases au-dessus de la diagonale sont interdites par construction. Piège de lecture : un 0 sous la diagonale est un produit scalaire nul (autorisé) ; un « . » au-dessus est la causalité. Le chunking améliore l’exécution ; il ne change pas automatiquement la capacité informationnelle de l’état.
L’affirmation mélange une relation locale et une garantie globale. Une version défendable décrit seulement le mécanisme observé, les conditions du test et la métrique relevée. Le test doit s’arrêter si les formes deviennent invalides, si la métrique se dégrade au-delà du seuil annoncé ou si une autre variable a changé.
Barème Exercice 2 — /10
2 points par élément : séparation, ancrage dans la leçon, extrapolations, protocole, reformulation.
Exercice 3 — Décision d’architecture et transfert — État entrant et sortant
Vous devez reproduire le cas guidé « Pour 8 tokens en chunks de 4, le premier calcule un triangle 4×4 puis transmet S₄. Le second reçoit S₄, calcule son triangle local et produit S₈. Aucun token du premier bloc ne peut lire le second. » dans deux conditions. Option A utilise la chaîne complète jusqu’à « État entrant et sortant ». Option B est une référence transparente qui conserve « Préfill et décodage », calcule directement la sortie attendue et n’utilise pas le mécanisme de compression ou d’ajustement étudié. Construisez une fiche de décision comportant:
- la charge et la contrainte dominante;
- le mécanisme de chaque option, sans slogan;
- une prédiction qualité, mémoire ou latence;
- un cas où votre procédure préférée perd;
- un protocole A/B, métriques et seuil de retour arrière;
- un verdict borné : choisir, différer ou refuser.
Éléments d’une bonne solution
Par l’état : le chunk 1 émet S₄ = K₁ᵀV₁, un résumé de taille fixe ; le chunk 2 le lit par q_tᵀS₄ et ajoute ses termes locaux. Sur la trace : o₅ = [3,4] (hérité) + [0,1] (local) = [3,5]. Les frontières transportent l’ordre et la causalité, pas les tokens. C arbitre deux coûts opposés : transitions séquentielles en n/C contre mémoire temporaire en C². Doubler C divise les transitions par 2 et multiplie le triangle par 4 — l’optimum se trouve là où le triangle sature juste la mémoire rapide (SRAM). Mécanismes établis ; les simplifications numériques sont pédagogiques.
Une bonne réponse ne présente pas le mécanisme récent comme gagnant par défaut. Elle conserve une référence mesurable, fixe le seuil avant le test et distingue le coût du composant du comportement du système complet. Le verdict doit citer ce qui reste incertain et la prochaine preuve qui pourrait le modifier.
Barème Exercice 3 — /15
| Critère | Points |
|---|---|
| Cadrage et référence | 3 |
| Chaînes causales comparées | 4 |
| Protocole et métriques | 4 |
| Seuil de retour arrière | 2 |
| Verdict borné | 2 |
Prolongement
Refaites l’exercice 3 en inversant la contrainte dominante. Si vous aviez optimisé la mémoire, imposez maintenant une qualité minimale stricte; si vous aviez optimisé la fidélité, imposez une enveloppe mémoire divisée par deux. Identifiez le premier point du verdict qui change et la preuve nécessaire.
Relecture avant remise
Relisez votre paquet comme si un autre groupe devait reproduire votre travail sans vous parler. Toutes les valeurs ou hypothèses de départ sont-elles présentes ? Les formes ou rôles sont-ils écrits avant les opérations ? La prédiction précède-t-elle réellement l’observation ? Le résultat est-il traduit en comportement plutôt que laissé comme nombre isolé ? Avez-vous testé une valeur limite et identifié une condition d’arrêt ? Le choix de procédure ou d’architecture conserve-t-il une référence mesurable et un seuil de retour arrière fixé avant le test ? Enfin, surlignez une phrase qui décrit ce qui est établi, une phrase qui reste une hypothèse et une mesure susceptible de changer votre verdict. Si l’un de ces éléments manque, le travail n’est pas reproductible.
Annexe de référence pour la correction
Chapitre 10 — Découpage en blocs et préremplissage parallèle
10.1 Pourquoi utiliser des blocs
But : combiner une règle de mémoire récurrente avec le calcul rapide d’un GPU. Traiter les jetons un par un est simple à décrire, mais utilise mal les nombreuses unités de calcul parallèles pendant la lecture du prompt, appelée préremplissage.
Au lieu de transporter les courses article par article, place plusieurs articles dans une caisse et déplace la caisse.
Étape par étape
-
Découper N jetons en blocs, par exemple 64 ou 128 dans une implémentation.
-
À l’intérieur d’un bloc, organiser de nombreuses lectures et mises à jour sous forme de grandes opérations matricielles.
-
Transmettre l’état final S d’un bloc au suivant.
-
Préserver l’ordre causal : le jeton t ne doit pas utiliser les jetons futurs.
Exemple détaillé : 12 jetons divisés en blocs de 4 donnent les blocs 1–4, 5–8 et 9–12. Le deuxième bloc reçoit l’état résumant les jetons 1–4. Ses quatre jetons peuvent effectuer une grande partie de leurs calculs ensemble, puis produire un état pour le troisième bloc.
Pourquoi c’est important : Le découpage ne change pas l’objectif d’apprentissage. Il réorganise des opérations équivalentes, ou soigneusement dérivées, afin que le matériel les exécute efficacement.
Vérification rapide : pourquoi ne pas choisir automatiquement un bloc gigantesque ? Réponse : les grands blocs augmentent le travail et le stockage temporaires ; la meilleure taille dépend du matériel et des noyaux de calcul.
10.2 Structure triangulaire causale
But : comprendre le masque triangulaire inférieur utilisé dans un bloc. Une matrice triangulaire inférieure contient des zéros au-dessus de sa diagonale principale.
C’est une règle scolaire : chaque élève peut lire seulement les lignes précédentes, jamais les réponses écrites plus tard.
Étape par étape
-
Pour quatre positions, les liens autorisés forment [[1,0,0,0],[1,1,0,0],[1,1,1,0],[1,1,1,1]].
-
La ligne 3 peut utiliser les positions 1, 2 et 3.
-
La ligne 1 peut utiliser uniquement la position 1.
Exemple détaillé : Le triangle empêche la prédiction du prochain jeton de tricher pendant l’entraînement et le préremplissage.
Pourquoi c’est important : La causalité est une condition de correction, pas seulement un détail d’optimisation.
Vérification rapide : dans un bloc causal, le jeton 2 peut-il utiliser le jeton 4 ? Réponse : non.
Sources et frontière de preuve
- Dossier de cours bilingue fourni par le propriétaire, chapitre 10.
- Katharopoulos et al., “Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention”, ICML (2020).
- Yang et al., “Gated Linear Attention Transformers with Hardware-Efficient Training” (chunkwise parallel form), ICML (2024).
- Dossier source fourni par le propriétaire; les détails sur des produits nommés restent attribués à cette source jusqu’à vérification primaire.
Portée: Mécanismes établis ; les simplifications numériques sont pédagogiques. Ces références soutiennent le cadre de la session; elles ne transforment pas un choix de produit rapporté en résultat indépendant.