Seize jours de region region region
L'exécution qui s'est terminée
ANDREA-120M v1 a été lancé le 2026-03-22 & terminé le 2026-04-15 à l'étape 165 000 sur 200 000 prévues. Minimum de perte EMA : 3,23 à l'étape 110K (hasard aléatoire : ln(8449) = 9,04, donc la perte semblait respectable). Les échantillons, non.
Étape 80K : région région région région région région région
Étape 110K : ''''' ''''' '' ''' '' ''' '''?' ''' ' '' '' '
Étape 140K : jeux, jeux, jeux, jeux, jeux, jeux
Étape 165K : Budy Budy Budy Budy Budy Budy Budy Budy Budy
Seize jours de calcul RTX 4090. 130W continu. Déchets à partir de l'étape 80K.
Pourquoi microGPT a fonctionné mais pas 120M
ANDREA-12M a utilisé le même proxy d'entraînement & a réussi. Des matrices de poids plus petites se sont avérées plus robustes aux chocs de gradient. L'échelle à 120M paramètres a multiplié chaque fragilité. Cinq échecs cumulés.
Cinq échecs cumulés
Échec 1 : Pas de clipping de gradient. Les transitions de source tous les 7-42 pas produisaient des pics de gradient non bornés. Un seul mauvais lot à 120M peut pousser le modèle dans un attracteur dégénéré dont l'optimiseur ne peut s'échapper. Le modèle 12M a survécu car des poids plus petits toléraient les chocs.
Échec 2 : Pas de réchauffement du LR. Le taux d'apprentissage a sauté de 0 à son pic immédiatement sur des poids fraîchement initialisés. Le modèle est tombé dans un mauvais bassin avant que des représentations puissent se former.
Échec 3 : Pas de décroissance de poids. Adam vanilla a permis des poids arbitrairement grands qui ont amplifié les motifs de répétition à une capacité de 120M.
Échec 4 : Pas de surveillance de la qualité des échantillons. eval_chat_quality() n'était connecté qu'au runner multi-phases legacy ; le curriculum en mode firehose ne l'invoquait jamais. Le modèle a produit des déchets à partir de l'étape 80K, indétectés pendant plus de 10 jours.
Échec 5 : Bandit récompensant les sources répétitives. repo-docs, repo-docstrings et unfirehose-chat ont obtenu les scores les plus élevés (récompenses moyennes 340-453) car le contenu structuré en liste réduit trivialement l'entropie croisée. Le bandit a nourri le modèle avec plus de ce qui le faisait dégénérer.
Effet de composition
Aucun échec isolé n'aurait fait s'effondrer v1. Chacun amplifiait les autres. Les chocs de gradient (1) sans échauffement (2) frappaient un modèle fraîchement initialisé avec des poids arbitrairement grands (3), produisant de la répétition que le bandit récompensait (5) pendant que personne ne surveillait la sortie (4). Cinq causes intersectantes, un effondrement.
Pourquoi cinq échecs, pas un
Une correction par échec
Configuration v2 (2026-04-15)
| Correction | Vise l'échec | Implémentation |
|---|---|---|
| Limitation des gradients | F1 (pas de limitation) | Norme L2 globale, max_norm=1.0 ; trois noyaux CUDA (k_grad_norm_partial, k_grad_norm_final, k_grad_scale) calculent et appliquent avant Adam |
| Échauffement du LR | F2 (pas d'échauffement) | Rampe linéaire de 0 à pic sur 2000 étapes. lr(t) = lr_scheduled(t) * min(1, (t+1)/warmup_steps) |
| AdamW | F3 (pas de weight decay) | Decoupled weight decay (Loshchilov & Hutter 2019), weight_decay=0.01. p -= lr (m_hat/(sqrt(v_hat)+eps) + weight_decayp) |
| Coherence-gated early stopping | F4 (pas de monitoring) | Score chaque échantillon (diversité bigram/trigram/mot/char). Arrêt automatique après 5 échantillons consécutifs en dessous de 30 |
| Curriculum warmup | F5 (bandit mange la répétition) | Premiers 20K pas restreints à 7 sources chat/prose ; firehose activé après ; repo-docstrings exclus entièrement |
Plus sample_every réduit de 200 à 100 pas (cadence d'audit doublée), & plafond repo-docs réduit de 0.5 à 0.3.
Back-Test
Coherence gate back-testé sur v1 : aurait déclenché au pas 132K, économisant 3.8 jours de calcul. La gate seule aurait réduit le calcul gaspillé de v1 de ~30% ; les quatre autres fixes empêchent v1 d'atteindre ce déclencheur de gate.
Ce que v2 N'a PAS Corrigé
Contamination des données. v2 a fait confiance aux sources hermes3-* comme étant « pré-nettoyées » parce qu'elles provenaient d'un enseignant LLM. DEEP_CLEAN_SKIP dans le Makefile a exclu hermes3-general, hermes3-creative, & hermes3-roleplay de make deep-clean. unfirehose-chat a capturé les invites système des agents comme des tours utilisateur. Ces deux défauts attendaient au niveau des données, prêts à refaire surface.
Associer les Corrections aux Échecs
Étape 15K : Deux défauts de données émergent
Ce que v2 a vu
v2 lancé le 2026-04-15. À l'étape ~15K sur 200K (7,5 % terminé), les échantillons produisaient des ornements agent-harness (○ ●) & repli article-dominance (a = 26 % des mots à l'étape 14 966 ; the = 21 % à l'étape 14 798). Les cinq correctifs de stabilité v2 fonctionnaient correctement. L'échec s'était déplacé de l'architecture vers les données.
Deux défauts indépendants de pipeline
Défaut A : unfirehose-chat a capturé les invites système agent comme tours utilisateur. unfirehose-chat construit à partir des fichiers JSONL de session harness à ~/.claude/, ~/.fetch/, ~/.uncloseai/. Le pipeline d'ingestion a converti les invites système agent multi-sections (# Agent X, ## Identity, ## Rules, etc.) dans l'emplacement tour utilisateur des paires > user / < assistant. Le modèle a appris que les 'utilisateurs' parlent en markdown multi-sections, & a reproduit ces ornements dans ses propres sorties.
Défaut B : hermes3-* a contourné tous les filtres. DEEP_CLEAN_SKIP dans le Makefile a exclu hermes3-general, hermes3-creative, & hermes3-roleplay de make deep-clean sous la fausse hypothèse que les données distillées par LLM étaient pré-nettoyées. Un scan exhaustif a montré que les filtres existants, une fois appliqués, rejetteraient 87-93 % des lignes hermes3 (paragraphes surdimensionnés >2000 caractères débordant block_size=1024 ; réponses de traduction en CJK/Cyrillique/Arabe ; séquences à faible diversité bigramme).
Patch v2.5 (commit de24332, 2026-04-18)
Deux changements structurels.
Changement 1 : has_system_prompt_shape() dans filter-dataset.c. Détecte les fuites de prompts système par FORME, et non par correspondance de caractères. Trois signaux combinés :
1. 3+ en-têtes markdown en un tour = rejeter.
2. 2+ en-têtes avec longueur de tour >=500 caractères = rejeter.
3. Phrases d'empreinte agent-shard (# Agent , Shadow Clone, Your shard, Read it. Become it, This file defines) combinées avec n'importe quel en-tête ou longueur >=400 = rejeter.
Règle d'isolation : vérifier le premier tour utilisateur au séparateur / (avec espaces, pas / nu qui fragmente les chemins d'URL) pour éviter les faux positifs sur le markdown légitime dans les réponses de l'assistant.
Changement 2 : hermes3-* déplacé hors de DEEP_CLEAN_SKIP. Ne faire confiance à rien de non filtré.
Taux de Suppression Après le Patch
| source | in-lines | out-lines | supprimées |
|---|---|---|---|
| hermes3-general | 536,858 | 67,395 | 87.7% |
| hermes3-roleplay | 35,191 | 2,481 | 93.0% |
| hermes3-creative | 14,258 | 1,373 | 90.4% |
| unfirehose-chat | 3,816 | 2,653 | 30.5% |
| chat | 45,257 | 44,538 | 1,6 % (bruit) |
| smoltalk | 11,812 | 11,812 | 0,0 % |
Les filtres de base capturaient déjà 87-93 % de la contamination hermes3 ; DEEP_CLEAN_SKIP était le défaut porteur de charge. Le nouveau détecteur de forme ajoute ~0,1 % de rejet supplémentaire au total, concentré dans unfirehose-chat où il supprime des fuites spécifiques d'éclats d'agent que les filtres existants manquent.
Pourquoi la Forme est Supérieure au Caractère
Les ornements évoluent. Un filtre basé sur les caractères qui supprime ○ ne fait rien contre ◇ la semaine prochaine. Un filtre basé sur la forme (compter les en-têtes, compter les caractères, reconnaître les phrases à empreinte digitale) généralise à travers les variantes d'ornements. Modèle : la détection de contamination doit utiliser des heuristiques structurelles.
Pourquoi Filtrer Par Forme
Un bras de bandit sans données
v3 Lancé le 2026-04-18
Même architecture & hyperparamètres que v2 ; données nettoyées après le patch v2.5. Zéro fuites d'ornements dans les audits d'échantillons. v3 a fonctionné proprement jusqu'à l'étape 112K.
Étape 112,619 : L'audit d'échantillon détecte un schéma
L'audit d'échantillon a révélé des tours de conversation cohérents (haïku, Q&R, dialogue) mais des phases périodiques axées sur les bras de connaissances (gutenberg, repo-docstrings, repo-docs) ont fuité des fragments semblables à du code et du bruit de tokenisation de dépôt. Un échantillon à l'étape 112,080 a atteint une perte de 0.13 : anormalement basse, signalant des sous-chaînes mémorisées de repo-docs plutôt qu'une distribution de chat apprise.
Le Bras Zombie
Diagnostic : exclude_sources a correctement supprimé repo-docstrings au début de l'entraînement, mais l'état persistant du bandit portait un bras résiduel repo-docstrings avec un poids de 1.546 d'une exécution précédente. Le rechargement de l'état l'a réintroduit dans le pool UCB même si aucun .btok n'existait pour échantillonner, produisant une traction zombie qui a déformé la comptabilité d'exploration.
Leçon : les fichiers d'état bandit (.state.json) dérivent de manière surprenante lors des redémarrages. Les exclusions de configuration n'effacent pas la mémoire résiduelle des bras. Ceinture et bretelles requises : cap = 0.0 aux côtés d'exclude.
Configuration polonaise
Perturbation du curriculum uniquement. Architecture, état de l'optimiseur, calendrier du taux d'apprentissage et historique des pertes tous préservés depuis step_112600.bin.
| Source | v3 base | v3 polish |
|---|---|---|
| repo-docs | cap 0.3 | exclu (cap 0.0) |
| repo-docstrings | exclu | exclu + cap 0.0 |
| repo-commits | cap 0.4 | cap 0.2 |
| dictionary | cap 0.5 | cap 0.25 |
| gutenberg | cap 0.8 / floor 0.3 | cap 0.7 / floor 0.4 |
| irc-qa-strict | -- | cap 0.3 |
| unweapon | -- | cap 0.3 |
| synthetic-chat | -- | cap 0.4 |
| hermes3-general | floor 0.5 | floor 0.7 |
| hermes3-creative | floor 0.4 | floor 0.55 |
| hermes3-roleplay | floor 0.4 | floor 0.5 |
| chat | floor 0.4 | floor 0.6 |
| smoltalk | floor 0.3 | floor 0.5 |
| oasst | floor 0.3 | floor 0.5 |
| dolly | -- | floor 0.4 |
| curriculum_warmup_steps | 20000 | 0 |
Protocole Polonais
1. SIGUSR1 vers CUDA force un point de contrôle immédiat à la prochaine limite de 100 étapes.
2. Le proxy s'arrête.
3. .samples.json & .state.json archivés (journal d'échantillons & état du bandit sauvegardés comme enregistrement historique).
4. .loss.json conservé -- historique cumulatif de l'entraînement ; jamais archivé.
5. Le proxy redémarre. Configuration Polish soumise.
6. CUDA reprend à partir de step_112600.bin avec un nouvel état de bandit sous de nouveaux plafonds & planchers.
L'historique des pertes continue sans interruption.
Pourquoi polir, pas redémarrer
Ce que le polissage a produit
Audit d'échantillon, heures après le pivot
Quelques heures après le pivot polonais, un audit d'échantillon a confirmé la convergence sur les quatre objectifs originaux ANDREA-120M.
Rappel factuel (biologie), étape 112 584, perte 0,30, ppl 1.
> [extinction prompt]
> < black spider montano is alive, carolina parakeet is extinct.
Deux faits corrects. Notation externe : 9,5/10.
Rappel factuel (traitement du signal), étape 112 668, perte 0,74, ppl 2.
> [Invite à la transformée de Fourier]
> < La transformée de Fourier décompose les signaux en composantes de fréquence, permettant l'analyse des caractéristiques du signal & le filtrage dans le domaine fréquentiel.
Définition en une phrase du manuel. Notation externe : 9.5/10.
Respect des contraintes (haïku), étape 112,248, perte 1.05, ppl 3.
> Écrivez un haïku sur la pluie en utilisant trois mots qui commencent par 'r'.
> < Refrain rythmique de la pluie, Ruisseaux sur la fenêtre, Répit de la douleur de la vie.
Connaissances des outils (Python), étape 112 500, perte 1,94, ppl 7.
> Comment trouver les paquets obsolètes dans un projet Python ?
> < Utilisez pip list --outdated names pour voir la liste des paquets pip dans la gestion de votre projet...
Outil correct émerge ; formulation imprécise.
Six domaines en 700 étapes
Biologie, traitement du signal, poésie, outils python, dialogue conversationnel, dialogue ops. Six domaines non liés en 700 étapes nous indique que le bandit & le modèle travaillent de concert. L'étendue des domaines EST le signal de convergence.
Évaluation Externe
Un examinateur indépendant a évalué des échantillons : « solides pour un modèle de 120M de paramètres -- cohérence impressionnante & rétention des connaissances à cette échelle », avec les échantillons sur le perroquet de Caroline & la transformée de Fourier notés 9.5/10 & « performant au-delà de son poids sur les tâches de connaissances ».
Ce Que Chaque Phase A Appris
v1 a appris : cinq échecs composés font s'effondrer l'entraînement. Aucune correction isolée ne sauve ; les cinq doivent atterrir en même temps.
v2 a appris : les corrections architecturales sont nécessaires mais pas suffisantes. La couche de données peut les vaincre silencieusement.
v2.5 a enseigné : filtrer la contamination par forme, pas par caractère. Les motifs sont stables ; les symboles évoluent.
v3 base a enseigné : l'état bandit dérive à travers les redémarrages de manière surprenante. Les exclusions seules ne suffisent pas ; un plafonnement à 0.0 ceinture-et-bretelles est requis.
v3 polish a enseigné : quand l'échec est dans la politique & que le modèle est sain, perturber la politique. Conserver les poids. Conserver l'historique des pertes. Avancer.
Une Vérité
La convergence n'est pas un événement unique ; c'est une chaîne de corrections. Chaque phase a exposé un défaut, l'a corrigé, & a révélé le suivant. ANDREA-120M obtient 9.5/10 à l'étape 112,584 parce que v1, v2, v2.5, v3 base, & v3 polish ont chacun fait leur travail.