eval_chat_quality() Was Aangesloten op de Verkeerde Runner
Een 10-Daags Falen Dat Op Dag 3 Had Moeten Stoppen
ANDREA-120M v1 trainde 16.1 dagen op een RTX 4090 op 130W continu. Sample outputs werden elke 200 stappen opgeslagen maar nooit geanalyseerd tijdens de run. Bij stap 80K (dag 4) lazen samples region region region region region. Bij stap 110K, ''''' ''''' '' ''' ''. Training ging nog 11 dagen door voordat handmatig gestopt bij stap 165K.
Wat Ging Er Mis Met de Rookmelder
eval_chat_quality() bestond in de codebase. Het scoorde samplekwaliteit. Het werkte zelfs correct. Maar het was alleen aangesloten op de legacy multi-phase runner. De v1 firehose curriculum gebruikte een ander codepad & riep de eval nooit aan. De rookmelder stond in een andere kamer met de deur dicht.
De Kosten
16,1 dagen compute. 130W continu. ~50 kWh elektriciteit. Het model produceerde op geen enkel moment bruikbare output. Loss EMA bereikte een dieptepunt van 3,23 op stap 110K, klom toen terug naar 4,54 op stap 165K toen de training stopte. Numeriek redelijk; semantisch leeg.
Willekeurige kans voor een vocabulaire van 8449 tokens is 9,04. v1 bereikte 3,23 EMA loss terwijl het region region region produceerde. Loss alleen kan geen coherentie-instorting detecteren. Een model dat cross-entropy minimaliseert door één hoogfrequent token te herhalen, krijgt numeriek beloond voor de faalmodus.
Waarom Loss Curves Logen
Score Elk Monster op Vier Assen
De Samengestelde Score
v2 levert een coherentiepoort die elk monster scoret (genomen elke 100 stappen tijdens firehose training) op vier metrics:
| Metric | Bereik | Wat het detecteert |
|---|---|---|
| Bigram diversity | 0-35 | Herhaling op tweewoordniveau (region region) |
| Trigram diversity | 0-35 | Herhaling op driewoordniveau (a, b, a, b, a, b) |
| English word presence | 0-20 | Afwijken naar niet-Engels (CJK, Cyrillisch, onzin) |
| Character diversity | 0-10 | Ineenstorting tot enkel karakter (''''', ... ... ...) |
Totaal mogelijk: 100. Drempel: 30.
Waarom Vier Metrics, Niet Eén
Elke metric vangt een ander faalmodus op:
- Een model dat instort tot één bigram faalt Bigram diversiteit maar slaagt Character diversiteit.
- Een model dat leestekensruis produceert (''''' ''''' '') faalt Character diversiteit maar zou Bigram diversiteit kunnen slagen als de leestekensparen variëren.
- Een model dat afdrijft naar niet-Engels (vertaaltrainingscontaminatie) faalt in Engelse woord aanwezigheid maar slaagt voor Bigram & Trigram diversiteit als het grammaticaal Mandarijn produceert.
- Een model dat a, b, a, b, a, b produceert slaagt voor Bigram (a-b & b-a verschijnen) maar faalt voor Trigram (a-b-a, b-a-b domineren).
Samen bestrijken de vier metrics de faalruimte. Een composietscore onder de 30 betekent dat ten minste één as zo ernstig is ingestort dat het hele sample omlaag trekt.
Aaneensluitende Teller
Auto-halt activeert na 5 aaneensluitende samples met een score onder de 30. Enkele slechte samples kunnen voorkomen tijdens fase-overgangen of zeldzame-bron pulls; vijf op rij betekenen dat het model gestopt is met herstellen. Met samples genomen elke 100 stappen, 5 aaneensluitende gedegenereerde samples = 500 stappen van bevestigde coherentie-instorting.
Bereken een Score
Hoe v1 Eruit Zou Hebben Gezien
Back-Tested Trigger
Gezien v1's opgeslagen samples, het retroactief toepassen van de v2-coherentie gate toont dat de gate zou hebben getriggerd op stap 132K. v1 liep tot stap 165K voor handmatige terminatie. De gate zou de training 33.000 stappen eerder hebben gestopt.
Computertijd Bespaard
RTX 4090 getraind op ~6 stappen/min in FP16 cuBLAS. 33.000 stappen / 6 stappen/min = 5.500 minuten = 91,6 uur = 3,8 dagen computertijd bespaard. Bij 130W continu, dat is ~12 kWh elektriciteit, plus 3,8 dagen GPU-slijtage.
Waarom Stap 132K & Niet Stap 80K
v1 produceerde region region region bij stap 80K. Waarom vuurde de gate toen niet?
Omdat intermitterende goede samples verschenen tussen slechte. De bandit cyelde door bronnen elke 7-42 stappen. Zelfs een gedegenereerd model produceerde af en toe diversere outputs bij samplen uit een andere bron, wat de teller voor opeenvolgende samples tijdelijk resette. Bij stap 132K was het model zo diep gecollapseerd dat 5 opeenvolgende gedegenereerde samples (500 stappen) onvermijdelijk werden.
Les: Sluit de Rookmelder aan op Elke Runner
v2 sluit eval_chat_quality() direct aan op de sample-handling code path van de firehose curriculum, niet alleen op de legacy runner. Elke sample, elke run, elke code path: dezelfde poort. De fix kostte ~30 regels code.