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() 存在於程式碼庫中。它評分樣本品質。它甚至正確運作。但它只連接到舊版的 multi-phase runner。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 本身無法偵測連貫性崩潰。 一個透過重複高頻詞彙來最小化 cross-entropy 的模型,會因這種失敗模式而得到數值上的獎勵。
為什麼 Loss 曲線說謊
在四個軸上評分每個樣本
複合分數
v2 提供了一個連貫性閘門,對每個樣本(在火hose訓練期間每 100 步採樣一次)在四個指標上進行評分:
| 指標 | 範圍 | 捕捉的內容 |
|---|---|---|
| 二元組多樣性 | 0-35 | 兩個詞元層級的重複 (region region) |
| 三元組多樣性 | 0-35 | 三個詞元層級的重複 (a, b, a, b, a, b) |
| 英文單詞存在度 | 0-20 | 偏離至非英文 (CJK、斯拉夫文、亂碼) |
| 字元多樣性 | 0-10 | 單一字元崩潰 (''''', ... ... ...)
總分可能:100。門檻:30。
為什麼使用四個指標,而不是一個
每個指標捕捉不同的失敗模式:
- 模型崩潰成一個二元組的模型會失敗於二元組多樣性,但通過字符多樣性。
- 產生標點噪聲的模型(''''' ''''' '')會失敗於字符多樣性,但如果標點對變化,可能通過二元組多樣性。
- 模型漂移到非英語(翻譯訓練污染)會失敗英語單字存在性,但如果產生語法正確的普通話,則通過 Bigram & Trigram 多樣性。
- 產生 a, b, a, b, a, b 的模型通過 Bigram(a-b & b-a 出現),但失敗 Trigram(a-b-a, b-a-b 主導)。
這四個指標共同涵蓋失敗空間。複合分數低於 30 表示至少一個軸崩潰得足夠嚴重,以拖累整個樣本。
連續計數器
自動停止在 5 個連續樣本 分數低於 30 後觸發。單一壞樣本可能在階段轉換或罕見來源抽取時發生;連續五個表示模型已停止恢復。以每 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。為什麼當時閘門沒有觸發?
因為在壞樣本之間偶爾出現好的樣本。bandit 每 7-42 步循環遍歷來源。即使是退化模型,偶爾從不同來源採樣時會產生更多樣的輸出,暫時重置連續計數器。到第 132K 步,模型已崩潰得足夠深,以至於 5 個連續退化樣本(500 步)變得不可避免。
課程:將煙霧警報器連接到每個執行器
v2 將 eval_chat_quality() 直接連接到火hose課程的樣本處理程式碼路徑,而不僅僅是舊版執行器。每個樣本、每次執行、每個程式碼路徑:相同的閘門。此修復花費約 30 行程式碼。