English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

guest
1 / ?
back to lessons

單一 GPU 上的十六天計算

單一長時間執行

ANDREA-120M 在 RTX 4090 上需要約 23 天(FP16、6 步/分、200K 步)。牆上電力、中斷核心恐慌、代理崩潰,以及刻意的配置變更都會在這段時間內發生。沒有檢查點,單一小故障就會丟棄整個執行。


v1 因一個錯誤(lr=0.001 過於激進)損失了 27K 步,因為沒有檢查點比啟動點更近。v2 吸取了該教訓:檢查點頻率降至每 100 步,並且 CUDA 信號處理器保證在 SIGTERM 上寫入檢查點。


三個角色

檢查點同時承擔三個工作:


1. 恢復點。 程序死亡、機器重啟、內核崩潰:從最新的 step_NNNNNN.bin 恢復。

2. 精煉轉向。 第 112,619 步:更改課程而不需重新訓練。SIGUSR1 強制進行乾淨檢查點,代理停止,新的上限與下限提交,CUDA 從保存點在新策略下恢復。

3. 審計分叉。 在相同起始權重比較兩個配置:複製檢查點,運行兩個分歧分支向前,觀察哪個收斂。


每 100 步提供約 17 分鐘的訓練(以 6 步/分鐘計算),在此之間進行寫入。100 步也與 sample_every 匹配:每個檢查點對應一次新的樣本審核,且每個樣本審核對應一個可恢復點。

一個檔案的三大角色

命名檢查點檔案除了崩潰恢復之外所擔任的兩個不同職責。每個給出一個單句理由。

一個檔案中的五個區域

格式

每個 step_NNNNNN.bin 打包五個連續區域:


[int32 step] [int32 n_params] [n_params x float32 weights] [n_params x float32 m] [n_params x float32 v]

ANDREA Checkpoint Binary Format


逐區域解析


標頭(總計 8 位元組)。 一個 32 位元步數告訴我們這個快照位於訓練過程中的何處;一個 32 位元參數計數告訴我們後續三個陣列各自的大小。


權重(n_params x 4 位元組)。 每個學習到的參數,扁平化排列。順序與模型的參數迭代器一致:token 與位置嵌入,然後是每層的注意力與 MLP 權重,最後是輸出頭。


Adam 第一時刻 m(n_params x 4 位元組)。 過去梯度的 EMA(beta1 = 0.9)。形狀與權重相同。用於 AdamW 恢復。


Adam 第二矩 v (n_params x 4 bytes)。 過去平方梯度的 EMA (beta2 = 0.999)。與權重相同形狀。AdamW 恢復所需。


總大小

總位元組 = 8 + 12 x n_params。ANDREA-12M (12.8M params):磁碟上 154 MB (147 MB 四捨五入)。ANDREA-120M (~120M params) FP32:~1.44 GB。三個相同形狀的陣列,背靠背堆疊,加上一個微小標頭。


為何儲存 m & v

Vanilla Adam 透過 m & v 追蹤每個參數的學習率。在檢查點寫入時丟棄它們,恢復的運行會從零動量與零變異估計開始,等同於一步學習率 0 然後突然上升。損失激增;模型可能從當前盆地跌出。儲存 m & v 使恢復與從未停止的基準位元等價(模數據載入器隨機性)。

單一檢查點的尺寸

ANDREA-120M 擁有約 120,000,000 個以 FP32(每個浮點數 4 位元組)訓練的參數。計算:(a) 僅標頭使用的位元組;(b) 三個 float32 陣列合併(權重 + m + v)使用的位元組;(c) 檢查點總大小(MB)。請顯示您的算術。

SIGTERM & SIGUSR1

為什麼 CUDA 處理信號

訓練過程作為一個長壽命的前台進程運行。當代理或操作員想要停止 GPU 時,一個信號會發送到 CUDA 引擎。沒有處理器時,預設的 SIGTERM 會立即終止進程:飛行中的梯度計算被丟棄,自上次檢查點以來的最新權重丟失。有處理器時,引擎會先寫入檢查點然後乾淨退出。


SIGTERM:寫入並退出

由停止按鈕、systemctl stop 或父代理的 kill 發送。CUDA 完成當前步驟,將 step_NNNNNN.bin 寫入磁碟,然後退出。從此狀態恢復只需最新的 .bin:除了飛行中的部分步驟外,零工作丟失。


SIGUSR1:寫入並繼續

由操作員或代理腳本按需發送。CUDA 完成當前步驟,寫入 step_NNNNNN.bin,然後像什麼都沒發生一樣繼續訓練。有用於:就在配置更改前觸發審計點;在已知良好時刻捕獲權重;將檢查點與外部樣本品質評分運行對齊。


波蘭樞紐序列(步驟 112,619)

1. 操作員向 CUDA 發送 SIGUSR1。在下一個 100 步驟邊界(步驟 112,700)進行檢查點寫入。

2. 操作員停止代理。

3. .samples.json & .state.json 被歸檔(樣本日誌 & 盜匪狀態保存為歷史記錄)。

4. .loss.json 保持原位。 累積訓練歷史;永不歸檔。

5. 代理在新的上下限下重新啟動。

6. CUDA 從 step_112700.bin 恢復,使用新的盜匪但完整的權重、m & v。


損失歷史在轉折點持續無間斷。樣本日誌乾淨重置。Bandit 在新策略下獲得全新開始。

選擇信號

兩個情境。(a) 代理腳本希望在從 v3-base 切換到 v3-polish 帽之前**立即**捕捉快照,而不停止訓練。哪個信號?為什麼?(b) 主機的 `systemctl stop unhomeschool-train` 在計劃重啟期間被觸發。systemd 預設發送哪個信號?CUDA 的處理器會做什麼?

累積訓練歷史

三個 Sidecar 檔案

在每個檢查點旁邊,proxy 會在運行目錄中維護三個 JSON sidecar 檔案:


- .loss.json -- 每個步驟一筆記錄,永遠如此。運行結束時約 200,000 筆記錄。累積訓練歷史。

- .samples.json -- 最近生成的樣本用於審核。在 polish pivots 時重置。

- .state.json -- bandit arm pulls、EMA rewards、階段計數器。在 polish pivots 時重置。


什麼會重置,什麼會持續

波蘭轉向是政策變更,不是運行重置。模型的權重、m、v 及損失歷史都會無縫持續。強盜的累積獎勵不會持續:新的上限與下限定義了不同的政策,強盜必須在新的政策下從乾淨狀態重新學習。


為什麼 .loss.json 保持不變

損失歷史作為運行的審計軌跡。每一個關於 ANDREA-120M 的已發布聲明(110K 步的損失 EMA、波蘭轉向恢復、112K 步的收斂)都追溯到此檔案中的記錄。在階段之間歸檔 .loss.json 會迫使讀者拼湊片段來重建運行;保持其僅追加且不變可保存出處。


殭屍手臂教訓

第 112,619 步在 .state.json 中發現一個 repo-docstrings 手臂,攜帶來自先前運行的權重 1.546。強盜狀態已在較早的重啟中被保留,但資料來源已不可用,產生扭曲探索計量的殭屍拉取。教訓:強盜狀態允許在重啟中以驚人方式漂移。損失歷史是運行全生命週期中必須保持不變的唯一檔案。


一條統御一切的規則

在各階段之間自由存檔 .samples.json.state.json。永遠不要存檔 .loss.json。最新的 .loss.json 始終是規範的訓練歷史。

應用規則

在第 112,619 步的拋光轉向期間的三個動作。對於每個,說明 ARCHIVE、KEEP IN PLACE 或 RESET,並給出一個單句理由:(a) `.samples.json`;(b) `.loss.json`;(c) `.state.json` (bandit memory)。

建置了什麼與原因

五個決定

1. 節奏:每 100 步。 恢復點粒度 ~17 分鐘。與 sample_every 對齊,因此每個檢查點對應一個新鮮樣本審核。

2. 格式:標頭 + 3 個陣列。 最小化:8 位元組標頭告訴我們每個尾隨陣列的大小。無中繼資料膨脹。當 m & v 被儲存時,位元等價的恢復。

3. 訊號:SIGTERM & SIGUSR1。 兩個角色,兩個訊號。預設 systemd 關機透過 SIGTERM 獲得乾淨檢查點;隨選審核點透過 SIGUSR1 獲得乾淨檢查點而不停止。

4. 損失連續性:永不封存。 累積訓練歷史在拋光轉向、重啟與政策變更中持續。一個審核軌跡適用於整個執行。

5. Bandit 狀態:允許重置。 Bandit 政策一次僅在一個設定檔下運行。拋光轉向重置;損失歷史持續。兩個不同生命週期共享相同的執行目錄。


本課程與之連結的內容


- 活動 23 (grow_a_language_model_sample_audit). sample_every 節奏與檢查點節奏匹配;兩者皆每 100 步驟觸發一次。

- 活動 24 (grow_a_language_model_microgpt_to_andrea). v1 崩潰、v2.5 修補、v3 精煉轉向皆需要乾淨的檢查點才能運作。

- 活動 10 (grow_a_language_model_adamw). 在檢查點中儲存 m & v 很重要,因為 AdamW 的更新規則依賴兩者。遺漏它們並恢復會導致分歧。


最後一項工程真理

程式碼比作者存續更久。基礎設施比建造者存續更久。一個簡單的檢查點格式比每一個承諾跳過儲存優化器狀態的複雜恢復方案存續更久。儲存那些位元組;儲存那次執行。

你將要建構什麼?

如果你自己訓練一個小型模型,這五個決定中哪些你會不變地採用,哪些你會調整?挑選一個,用 2-3 句話討論。沒有錯誤答案;問題在於你是否能推理權衡取捨。