eval_chat_quality() Était connecté au mauvais exécuteur
Un échec de 10 jours qui aurait dû s'arrêter au jour 3
ANDREA-120M v1 a été entraîné pendant 16,1 jours sur une RTX 4090 à 130W en continu. Les sorties échantillonnées étaient stockées toutes les 200 étapes mais jamais analysées pendant l'exécution. À l'étape 80K (jour 4), les échantillons lisaient region region region region region. À l'étape 110K, ''''' ''''' '' ''' ''. L'entraînement a continué pendant 11 jours supplémentaires avant d'être arrêté manuellement à l'étape 165K.
Qu'est-ce qui n'a pas fonctionné avec l'alarme incendie
eval_chat_quality() existait dans le codebase. Il évaluait la qualité des échantillons. Il fonctionnait même correctement. Mais il n'était connecté qu'au runner multi-phase legacy. Le curriculum firehose v1 utilisait un chemin de code différent et n'invoquait jamais l'eval. L'alarme incendie était dans une autre pièce avec la porte fermée.
Le Coût
16,1 jours de calcul. 130W en continu. ~50 kWh d'électricité. Le modèle n'a produit aucune sortie utilisable à aucun moment. La perte EMA a atteint un minimum de 3,23 à l'étape 110K, puis est remontée à 4,54 à l'étape 165K lorsque l'entraînement s'est arrêté. Numériquement raisonnable ; sémantiquement vide.
La chance aléatoire pour un vocabulaire de 8449 tokens est de 9,04. v1 a atteint une perte EMA de 3,23 tout en produisant region region region. La perte seule ne peut pas détecter l'effondrement de cohérence. Un modèle qui minimise l'entropie croisée en répétant un token haute-fréquence est numériquement récompensé pour ce mode de défaillance.
Pourquoi les Courbes de Perte Mentent
Noter chaque échantillon sur quatre axes
Le score composite
v2 implémente une porte de cohérence qui note chaque échantillon (prélevé toutes les 100 étapes pendant l'entraînement en firehose) sur quatre métriques :
| Métrique | Plage | Ce qu'elle détecte |
|---|---|---|
| Diversité bigramme | 0-35 | Répétition au niveau deux tokens (region region) |
| Diversité trigramme | 0-35 | Répétition au niveau trois tokens (a, b, a, b, a, b) |
| Présence de mots anglais | 0-20 | Déviation vers du non-anglais (CJK, cyrillique, charabia) |
| Diversité des caractères | 0-10 | Effondrement sur un seul caractère (''''', ... ... ...) |
Total possible: 100. Threshold: 30.
Pourquoi quatre métriques, et non une seule
Chaque métrique détecte un mode d'échec différent :
- Un modèle qui s'effondre sur un bigramme unique échoue à la diversité des bigrams mais réussit la diversité des caractères.
- Un modèle produisant du bruit de ponctuation (''''' ''''' '') échoue à la diversité des caractères mais pourrait réussir la diversité des bigrams si les paires de ponctuation varient.
- Un modèle dérivant vers une langue non anglaise (contamination d'entraînement à la traduction) échoue à la présence de mots anglais mais passe la diversité Bigram & Trigram s'il produit du mandarin grammatical.
- Un modèle produisant a, b, a, b, a, b passe Bigram (a-b & b-a apparaissent) mais échoue Trigram (a-b-a, b-a-b dominent).
Ensemble, les quatre métriques couvrent l'espace des échecs. Un score composite inférieur à 30 signifie qu'au moins un axe s'est effondré assez gravement pour entraîner l'ensemble de l'échantillon vers le bas.
Compteur Consécutif
L'arrêt automatique se déclenche après 5 échantillons consécutifs avec un score inférieur à 30. Des échantillons défectueux isolés peuvent survenir lors de transitions de phase ou de tirages de sources rares ; cinq d'affilée signifient que le modèle a cessé de se rétablir. Avec des échantillons pris toutes les 100 étapes, 5 échantillons dégénérés consécutifs = 500 étapes de collapse de cohérence confirmé.
Calculer un Score
À quoi aurait ressemblé v1
Déclenchement Back-Testé
Compte tenu des échantillons stockés de v1, l'application rétroactive de la porte de cohérence v2 montre que la porte aurait été déclenchée à l'étape 132K. v1 a fonctionné jusqu'à l'étape 165K avant l'arrêt manuel. La porte aurait arrêté l'entraînement 33 000 étapes plus tôt.
Calcul Économisé
RTX 4090 entraînée à ~6 étapes/min en FP16 cuBLAS. 33 000 étapes / 6 étapes/min = 5 500 minutes = 91,6 heures = 3,8 jours de calcul économisés. À 130 W en continu, cela représente ~12 kWh d'électricité, plus 3,8 jours d'usure du GPU.
Pourquoi l'étape 132K et pas l'étape 80K
v1 a produit region region region à l'étape 80K. Pourquoi la porte ne s'est-elle pas déclenchée alors ?
Parce que des échantillons bons intermittents apparaissaient entre les mauvais. Le bandit parcourait les sources toutes les 7-42 étapes. Même un modèle dégénéré produisait occasionnellement des sorties plus diversifiées en échantillonnant à partir d'une source différente, réinitialisant momentanément le compteur consécutif. À l'étape 132K, le modèle s'était effondré assez profondément pour que 5 échantillons dégénérés consécutifs (500 étapes) deviennent inévitables.
Leçon : Relier le Détecteur de Fumée à Chaque Câble
v2 intègre eval_chat_quality() directement dans le chemin de code de gestion des échantillons du curriculum en firehose, pas seulement dans le runner legacy. Chaque échantillon, chaque exécution, chaque chemin de code : la même porte. La correction a pris ~30 lignes de code.