eval_chat_quality() Era Collegato al Runner Sbagliato
Un Fallimento di 10 Giorni Che Avrebbe Dovuto Fermarsi al Giorno 3
ANDREA-120M v1 è stato addestrato per 16,1 giorni su una RTX 4090 a 130W continui. Gli output di esempio sono stati salvati ogni 200 passi ma mai analizzati durante l'esecuzione. Al passo 80K (giorno 4), i campioni recitavano region region region region region. Al passo 110K, ''''' ''''' '' ''' ''. L'addestramento è continuato per altri 11 giorni prima di essere interrotto manualmente al passo 165K.
Cosa È Andato Storto con l'Allarme Antifumo
eval_chat_quality() esisteva nel codebase. Valutava la qualità dei sample. Funzionava persino correttamente. Ma era collegato solo al legacy multi-phase runner. Il v1 firehose curriculum usava un percorso di codice diverso e non invocava mai l'eval. L'allarme antincendio era in un'altra stanza con la porta chiusa.
Il Costo
16.1 giorni di compute. 130W continui. ~50 kWh di elettricità. Il modello non ha prodotto output utilizzabile in nessun momento. Loss EMA ha raggiunto il minimo a 3.23 al passo 110K, poi è risalito a 4.54 al passo 165K quando l'addestramento si è fermato. Numericamente ragionevole; semanticamente vuoto.
La probabilità casuale per un vocabolario di 8449 token è 9.04. v1 ha raggiunto una loss EMA di 3.23 mentre produceva region region region. La loss da sola non può rilevare il collasso della coerenza. Un modello che minimizza la cross-entropy ripetendo un token ad alta frequenza viene numericamente premiato per questa modalità di fallimento.
Perché le Curve di Loss Hanno Mentito
Valuta Ogni Campione su Quattro Assi
Il Punteggio Composito
v2 include un gate di coerenza che valuta ogni campione (prelevato ogni 100 step durante l'addestramento firehose) su quattro metriche:
| Metrica | Intervallo | Cosa rileva |
|---|---|---|
| Diversità bigram | 0-35 | Ripetizione a livello di due token (region region) |
| Diversità trigram | 0-35 | Ripetizione a livello di tre token (a, b, a, b, a, b) |
| Presenza parole inglesi | 0-20 | Deriva in non-inglese (CJK, cirillico, gibberish) |
| Diversità caratteri | 0-10 | Collasso su singolo carattere (''''', ... ... ...) |
Totale possibile: 100. Soglia: 30.
Perché Quattro Metriche, Non Una
Ogni metrica cattura una modalità di fallimento diversa:
- Un modello che collassa su un unico bigramma fallisce la Diversità Bigramma ma passa la Diversità Carattere.
- Un modello che produce rumore di punteggiatura (''''' ''''' '') fallisce la Diversità Carattere ma potrebbe passare la Diversità Bigramma se le coppie di punteggiatura variano.
- Un modello che scivola in una lingua non inglese (contaminazione da addestramento alla traduzione) fallisce la presenza di parole inglesi ma passa la diversità Bigram & Trigram se produce mandarino grammaticale.
- Un modello che produce a, b, a, b, a, b passa Bigram (a-b & b-a appaiono) ma fallisce Trigram (a-b-a, b-a-b dominano).
Insieme, le quattro metriche coprono lo spazio dei fallimenti. Un punteggio composito inferiore a 30 significa che almeno un asse è collassato abbastanza gravemente da trascinare giù l'intero campione.
Contatore Consecutivo
Auto-halt si attiva dopo 5 campioni consecutivi con punteggio inferiore a 30. Singoli campioni cattivi possono verificarsi durante transizioni di fase o estrazioni da fonti rare; cinque di fila significano che il modello ha smesso di riprendersi. Con campioni prelevati ogni 100 passi, 5 campioni degenerati consecutivi = 500 passi di collasso della coerenza confermato.
Calcola un Punteggio
Come Sarebbe Apparse v1
Trigger Back-Tested
Dato i campioni memorizzati di v1, applicando retroattivamente il gate di coerenza v2 mostra che il gate si sarebbe attivato al passo 132K. v1 è arrivata al passo 165K prima della terminazione manuale. Il gate avrebbe fermato l'addestramento 33.000 passi prima.
Compute Risparmiato
RTX 4090 addestrata a ~6 passi/min in FP16 cuBLAS. 33.000 passi / 6 passi/min = 5.500 minuti = 91,6 ore = 3,8 giorni di compute risparmiati. A 130W continui, sono ~12 kWh di elettricità, più 3,8 giorni di usura GPU.
Perché Step 132K e Non Step 80K
v1 ha prodotto region region region allo step 80K. Perché il gate non si è attivato allora?
Perché tra i campioni cattivi apparivano campioni buoni intermittenti. Il bandit ciclava attraverso le fonti ogni 7-42 passi. Anche un modello degenerato occasionalmente produceva output più diversi quando campionava da una fonte diversa, resettando momentaneamente il contatore consecutivo. Allo step 132K, il modello era collassato abbastanza profondamente da rendere inevitabili 5 campioni degenerati consecutivi (500 passi).
Lezione: Collega l'Allarme Antifumo a Ogni Cavo
v2 collega eval_chat_quality() direttamente al codice di gestione dei campioni del curriculum firehose, non solo al runner legacy. Ogni campione, ogni esecuzione, ogni percorso di codice: la stessa barriera. La correzione ha richiesto ~30 righe di codice.