eval_chat_quality() が間違ったランナーに接続されていた
3日目で停止すべきだった10日間の失敗
ANDREA-120M v1はRTX 4090で130W連続で16.1日間訓練されました。サンプル出力は200ステップごとに保存されましたが、実行中は一度も分析されませんでした。80Kステップ(4日目)でサンプルはregion region region region regionと出力。110Kステップでは''''' ''''' '' ''' ''。訓練はさらに11日続き、165Kステップで手動で終了しました。
煙感知器に何が起こったのか
eval_chat_quality() はコードベースに存在していました。サンプルの品質をスコアリングし、正しく動作していました。しかし、レガシーの多段階ランナーにのみ接続されていました。v1 firehose カリキュラムは異なるコードパスを使用し、eval を呼び出していませんでした。煙探知機は別の部屋に閉じ込められていました。
コスト
16.1 日分の計算リソース。130W 連続。~50 kWh の電力。モデルはどの時点でも使用可能な出力を生成しませんでした。Loss EMA はステップ 110K で 3.23 の底を打ち、その後トレーニングが停止したステップ 165K で 4.54 に戻りました。数値的には合理的;意味的には空虚です。
8449 トークンの語彙に対するランダム確率は 9.04 です。v1 は region region region を生成しながら 3.23 の EMA loss に到達しました。Loss だけでは一貫性の崩壊を検知できません。 クロスエントロピーを最小化するために高頻度トークンを繰り返すモデルは、この失敗モードに対して数値的に報酬を受け取ります。
なぜ Loss 曲線が嘘をついたのか
4つの軸ですべてのサンプルをスコアリング
合成スコア
v2は、一貫性ゲートを搭載しており、火hose訓練中に毎100ステップで採取されるすべてのサンプルを4つの指標でスコアリングします:
| メトリクス | 範囲 | 検出するもの |
|---|---|---|
| Bigram diversity | 0-35 | 2トークン単位での繰り返し (region region) |
| Trigram diversity | 0-35 | 3トークン単位での繰り返し (a, b, a, b, a, b) |
| English word presence | 0-20 | 非英語(CJK、キリル文字、意味不明な文字列)への逸脱 |
| Character diversity | 0-10 | 単一文字の崩壊 (''''', ... ... ...) |
合計可能点: 100。閾値: 30。
なぜ4つのメトリクスなのか、1つではなく
各メトリクスは異なる失敗モードを捉えます:
- 1つのビグラムに崩壊するモデルはビグラム多様性に失敗しますが、文字多様性はパスします。
- 句読点ノイズ(''''' ''''' '')を生成するモデルは文字多様性に失敗しますが、句読点のペアが多様であればビグラム多様性はパスする可能性があります。
- 非英語(翻訳訓練汚染)へドリフトするモデルは、英語の単語存在を失敗するが、文法的なマンダリンを生成すればBigramおよびTrigramの多様性を通過する。
- a, b, a, b, a, b を生成するモデルはBigram(a-bおよびb-aが出現)を通過するが、Trigram(a-b-a、b-a-bが支配的)を失敗する。
これら4つのメトリクスは、失敗空間を網羅する。合成スコアが30未満の場合、少なくとも1つの軸が全体のサンプルを低下させるほど深刻に崩壊したことを意味する。
連続カウンター
5連続サンプルが30未満のスコアになると自動停止が発動する。単一の不良サンプルは位相遷移や稀なソース引き出し中に発生し得るが、5連続はモデルが回復を停止したことを意味する。サンプルが100ステップごとに取得されるため、5連続の退化サンプル = 確認された一貫性崩壊の500ステップ。
スコアを計算する
v1はどのような様子だったか
バックテストされたトリガー
v1の保存されたサンプルにv2のコヒーレンスゲートを遡及的に適用すると、ゲートはステップ132Kでトリガーしていたことがわかります。v1は手動終了前にステップ165Kまで実行されました。ゲートは33,000ステップ早くトレーニングを停止していたでしょう。
節約された計算量
RTX 4090 は FP16 cuBLAS で約6ステップ/分で訓練。33,000ステップ / 6ステップ/分 = 5,500分 = 91.6時間 = 3.8日分の計算量を節約。 130W連続で、約12 kWhの電力、プラス3.8日分のGPU摩耗。
なぜステップ132Kで、ステップ80Kではないのか
v1はステップ80Kでregion region regionを生成。なぜその時ゲートが発火しなかったのか?
悪いサンプル間に断続的に良いサンプルが現れたため。バンディットは7-42ステップごとにソースを循環した。退化モデルでも異なるソースからサンプリングすると時折多様な出力が生まれ、連続カウンターが一時的にリセットされた。ステップ132Kまでモデルが深く崩壊し、5連続退化サンプル(500ステップ)が避けられなくなった。
レッスン: 煙探知機をすべてのランナーに配線する
v2 は eval_chat_quality() を firehose カリキュラムのサンプル処理コードパスに直接配線し、レガシーランナーだけではありません。すべてのサンプル、すべての実行、すべてのコードパス: 同じゲートです。この修正には約30行のコードが必要でした。