eval_chat_quality() Estava Conectada ao Executor Errado
Uma Falha de 10 Dias Que Deveria Ter Parado no Dia 3
ANDREA-120M v1 treinou por 16,1 dias em uma RTX 4090 a 130W contínuos. Saídas de amostras foram armazenadas a cada 200 passos, mas nunca analisadas durante a execução. No passo 80K (dia 4), as amostras liam region region region region region. No passo 110K, ''''' ''''' '' ''' ''. O treinamento continuou por mais 11 dias antes de ser interrompido manualmente no passo 165K.
O Que Deu Errado com o Alarme de Incêndio
A função eval_chat_quality() existia no código. Ela pontuava a qualidade das amostras. Ela até funcionava corretamente. Mas estava conectada apenas ao runner multi-fase legado. O currículo firehose v1 usava um caminho de código diferente e nunca invocava a eval. O alarme de fumaça ficava em outra sala com a porta fechada.
O Custo
16,1 dias de computação. 130W contínuos. ~50 kWh de eletricidade. O modelo não produziu saída utilizável em nenhum momento. A EMA de perda atingiu o mínimo de 3,23 no passo 110K, depois subiu para 4,54 no passo 165K quando o treinamento parou. Numericamente razoável; semanticamente vazio.
A chance aleatória para um vocabulário de 8449 tokens é 9,04. O v1 atingiu perda EMA 3,23 enquanto produzia region region region. A perda sozinha não pode detectar colapso de coerência. Um modelo que minimiza a entropia cruzada repetindo um token de alta frequência é numericamente recompensado pelo modo de falha.
Por Que as Curvas de Perda Mentiram
Pontue Cada Amostra em Quatro Eixos
A Pontuação Composta
A v2 implementa um portão de coerência que pontua cada amostra (coletada a cada 100 passos durante o treinamento em mangueira de incêndio) em quatro métricas:
| Métrica | Faixa | O que ela detecta |
|---|---|---|
| Diversidade de bigramas | 0-35 | Repetição no nível de dois tokens (região região) |
| Diversidade de trigramas | 0-35 | Repetição no nível de três tokens (a, b, a, b, a, b) |
| Presença de palavras em inglês | 0-20 | Desvio para não-inglês (CJK, cirílico, gibberish) |
| Diversidade de caracteres | 0-10 | Colapso em caractere único (''''', ... ... ...) |
Total possível: 100. Limiar: 30.
Por que Quatro Métricas, Não Uma
Cada métrica captura um modo de falha diferente:
- Um modelo colapsando para um bigrama único falha na Diversidade de Bigramas, mas passa na Diversidade de Caracteres.
- Um modelo produzindo ruído de pontuação (''''' ''''' '') falha na Diversidade de Caracteres, mas pode passar na Diversidade de Bigramas se os pares de pontuação variam.
- Um modelo que deriva para não-inglês (contaminação de treinamento de tradução) falha na presença de palavras em inglês, mas passa na diversidade de Bigram & Trigram se produzir mandarim gramatical.
- Um modelo que produz a, b, a, b, a, b passa no Bigram (a-b & b-a aparecem) mas falha no Trigram (a-b-a, b-a-b dominam).
Juntas, as quatro métricas abrangem o espaço de falhas. Uma pontuação composta abaixo de 30 significa que pelo menos um eixo colapsou o suficiente para arrastar toda a amostra para baixo.
Contador Consecutivo
O auto-halt dispara após 5 amostras consecutivas com pontuação abaixo de 30. Amostras ruins isoladas podem ocorrer durante transições de fase ou puxões de fontes raras; cinco seguidas significam que o modelo parou de se recuperar. Com amostras tomadas a cada 100 passos, 5 amostras degeneradas consecutivas = 500 passos de colapso de coerência confirmado.
Calcular uma Pontuação
Como a v1 Teria Parecido
Acionamento Testado Retroativamente
Dadas as amostras armazenadas da v1, aplicando retroativamente o gate de coerência da v2 mostra que o gate teria sido acionado no passo 132K. A v1 rodou até o passo 165K antes da terminação manual. O gate teria parado o treinamento 33.000 passos antes.
Computação Economizada
RTX 4090 treinada a ~6 passos/min em FP16 cuBLAS. 33.000 passos / 6 passos/min = 5.500 minutos = 91,6 horas = 3,8 dias de computação economizados. A 130W contínuos, isso é ~12 kWh de eletricidade, mais 3,8 dias de desgaste da GPU.
Por que Passo 132K e Não Passo 80K
v1 produziu region region region no passo 80K. Por que o gate não disparou então?
Porque amostras boas intermitentes apareciam entre as ruins. O bandit ciclava pelas fontes a cada 7-42 passos. Mesmo um modelo degenerado ocasionalmente produzia saídas mais diversas ao amostrar de uma fonte diferente, reiniciando momentaneamente o contador consecutivo. No passo 132K, o modelo havia colapsado profundamente o suficiente para que 5 amostras degeneradas consecutivas (500 passos) se tornassem inevitáveis.
Lição: Conecte o Alarme de Fumaça a Todos os Cabos
A v2 conecta eval_chat_quality() diretamente ao caminho de código de manipulação de amostras do currículo firehose, não apenas ao runner legado. Toda amostra, toda execução, todo caminho de código: o mesmo portão. A correção levou ~30 linhas de código.