remote-gpu-trainer — 深度學習實驗生命週期
概述
一個技能涵蓋深度學習實驗的完整流程:執行 → 驗證 → 交付。
- 執行 — 讓長時間的 GPU 工作順利啟動、存活並完成,然後從機器上取得結果。在自有機器上沒有計費問題;在租用機器上的核心洞見是你只是別人機器上的短期租戶——因此任務是將工作分離、讓結果比實例存活更久,並安全地停止計費,而不是建立一個叢集。邊界處有平台特定性(一個
profiles/<platform>.md負責所有路徑、代理、計費指令與競價規則),核心則是不變的。 - 驗證 — 這個數字是錯誤、真實效應還是雜訊? 一個令人驚訝的結果是假設,而非可報告的事實。與平台無關。
- 交付 — 組織結果,使每個送出的數字/圖表/表格都是一個不可變證據層的確定性函數;可追溯性與跨文件一致性由機制鎖定,而非由人類記得更新三份文件。與平台無關。
貫穿驗證與交付的兩個立場:使用者主權(科學決策——種子數量、哪些樣本、是否存在 aux 通道——由使用者決定;技能組織並揭露權衡取捨一次,然後停止嘮叨)和稽核→揭露,而非強制執行(技能是誠實的稽核員,而非守門員——完整性問題必須與其影響的結論一起浮現,但技能絕不阻止使用者交付)。口號:「揭露它,否則別聲稱它。」
先選路線
- 執行 — 自有還是租用機器?
- 本地(自有工作站/筆電,無計費)→
references/run-local/與profiles/local.md。 - 租用 / 遠端(任何有計費或共享、非自有的機器)→
references/run-remote/,並首先選擇你的profiles/<platform>.md(它負責所有階段委託的路徑/指令/代理)。
- 本地(自有工作站/筆電,無計費)→
- 然後務必 → 驗證結果(
references/verifying/)→ 交付結果(references/delivering/)。這兩個階段與平台無關;無論工作在本地還是租用機器上訓練,都執行相同的步驟。不要因為執行成功就跳過這裡的任何內容——綠色運行不等於真實數字,真實數字也不等於乾淨的可交付成果。
正在除錯一個無法收斂 / 出現 OOM / 掛起 / NaN 的模型,且不關心它在哪裡執行?直接跳到
references/training/(8 個檔案的除錯層),然後在報告前回來進行驗證。
運作原則(主幹)
承載不變性的關鍵點。每行一個;遠端生命週期的完整跨平台集合(10 個不變性)在 references/run-remote/principles.md 中——在遠端執行的第 0 階段前閱讀它。
- 檢查點到持久化儲存 + 冪等恢復是通用主幹。 檔案檢查點到持久化位置 + 無條件在啟動時載入最新版本是一個能在 SSH 斷線、Slurm 牆時間終止、K8s 重新排程、競價搶佔、Colab 斷線中倖存的機制。分離原始語(tmux / sbatch / Job)是可替換的插頭;這是不變性。
- 信任你載入的工件,而非聲稱成功的日誌行。 「已同步 / 已儲存 / 已完成」可能在靜默寫入失敗時說謊;監控器自身的狀態也是一種聲明——根據實際進程/工件/像素/位元組進行比對。
- 昂貴計算前的廉價檢查。 1–2 批次 CPU 冒煙測試(關閉記錄器)可以幾乎免費地消滅匯入/配置/形狀/縮放錯誤,避免它們消耗 GPU 時數。
- 成本與破壞性行為由使用者決定。 絕不自動釋放/終止,未經確認絕不刪除持久化檔案;如果清理無法釋放空間,要求擴充磁碟,而非默默縮小實驗規模。
- 稽核→揭露,而非強制執行。 強制的是揭露,而非修復。完整性發現(無不相交驗證、資料洩漏、在選擇期間觸及測試、你無法重新推導的數字)必須伴隨結論——但技能是揭露,而非阻擋。
執行 — 本地(自有機器)
無計費,無關閉時鐘——風險從金錢轉移到資源競爭與你機器的穩定性。不放鬆的紀律:環境衛生、資源意識、工件/檢查點維護,以及「陳述種子」。從 profiles/local.md 開始,然後是對應的文件:
- 環境衛生 — 絕不在持久機器的 conda
base中訓練/安裝;4 步驟閘門(列舉 → 選擇專案環境 → 確認sys.executable→ 執行)→references/run-local/env-hygiene.md。 - 啟動與分離 — nohup/tmux、日誌 + 存活探測、不要前景阻擋 →
references/run-local/launch.md。 - 單節點多 GPU —
torchrun/accelerateDDP 環境合約、首次運行 rank/掛起基礎 →references/run-local/multi-gpu.md(多節點 →references/run-remote/multinode.md)。 - 本地 OOM — 在無法租用更大硬體的機器上解決問題的階梯 →
references/run-local/local-oom.md。
執行 — 遠端(租用機器)
首先選擇你的設定檔——它綁定了各個階段委託的所有具體路徑/代理/憑證/計費指令/競價規則。心智指令模型(跨平台的統一 API;設定檔將每個指令綁定到實際命令):up(租用+連線)→ push(推送程式碼/資料)→ run(分離執行 + 檢查點)→ watch(持久監控)→ pull(拉取結果 + 驗證)→ down(停止計費)。
| 你在使用… | 設定檔 | 停止計費指令(陷阱) |
|---|---|---|
| AutoDL(最深入、經過實戰測試) | profiles/autodl.md | 關機停止計費,保留磁碟(AutoDL 例外) |
| RunPod | profiles/runpod.md | 終止(停止仍會收取 2 倍費用;會摧毀磁碟機) |
| vast.ai | profiles/vastai.md | 摧毀(停止會永遠計費磁碟) |
| Lambda | profiles/lambda.md | 終止(無停止狀態) |
| Paperspace | profiles/paperspace.md | 摧毀 + 釋放 IP + 刪除儲存 |
| 恆源雲 / 矩池雲 / Featurize / 攬睿星舟 | profiles/china.md | 各平台不同(資料磁碟常在停止時計費) |
| 純 SSH / Slurm / K8s / Colab | profiles/generic-ssh.md | 手動(遺忘的機器會 24/7 計費) |
6 階段生命週期(完整平台清單 → references/run-remote/lifecycle_checklist.md):
0 環境稽核(df -i 不僅是 df -h、cgroup memory.max、檢查點磁碟預算)· 1 SSH + 憑證(預建映像就是環境——不要在租用機器上執行 conda create;透過 stdin 傳遞密碼)· 2 包裝器 + 在租用前進行 CPU 冒煙測試閘門 · 3 分離啟動(探測,然後交回控制權——絕不執行阻擋的 sleep)· 4 持久監控(四層架構 → references/run-remote/monitoring_patterns.md;綁定會話的監控器會隨著會話死亡)· 5 彙總 + 驗證 + 關閉。
鐵律 — 關閉閘門: 在檢查點被拉取到本地並經由載入驗證(
scripts/verify_local.py),且使用者已明確批准成本影響行為之前,不得執行release/terminate/destroy/ 檔案刪除。「日誌看起來完成了」不是證據。在大多數平台上,停止計費的行為是不可逆的(會刪除磁碟)——確認更重要,而非更少。
其他遠端參考:ssh_transport.md(rsync/scp 可恢復、經 stdin 傳遞密碼、CRLF)· spot-resilience.md(搶佔寬限期、Young/Daly 節奏、原子寫入恢復)· china-network.md(鏡像 + HF_ENDPOINT + no_proxy 陷阱)· parallel_ablation.md(扇出獨立性 + 調解)· multinode.md(NCCL/框架,進階)· gotchas_universal.md(完整的 U1–U43 目錄,附 grep 索引)。
當訓練本身出錯時(模型問題,而非平台問題)
一旦機器開始運行,訓練會以其自身的方式出錯——本地或遠端,同樣的除錯層(references/training/,8 個檔案;每個條目症狀 → 根本原因 → 附有引用文件的修復)。依症狀導航:
- OOM / 放不下(CUDA-VRAM 或主機-RAM、步驟層級 OOM、解決階梯)→
oom-memory.md。 - 多 GPU 啟動 / 掛起(
torchrun/accelerate/deepspeed環境合約、DDP/FSDP/ZeRO)→distributed-launch.md。 - NaN / Inf / 損失突增(fp16/bf16/tf32、AMP/GradScaler、LLM 分歧)→
precision-stability.md。 - 太慢(GPU 密集型 vs 資料密集型 vs 通訊密集型、資料載入器調整、
torch.compile陷阱)→throughput-profiling.md。 - 恢復錯誤(完整狀態 + 分片儲存/恢復;週期重新啟動、重新洗牌、Scaler/EMA 遺失)→
checkpoint-resume.md。 - 領域特定陷阱(LLM、視覺偵測/分割、擴散模型、強化學習、多模態/VLM)→
by-domain.md。 - 可以運行但學不到(過擬合一個批次、參數未更新、學習率/排程、損失函數地雷、凍結)→
convergence-debugging.md。 - 資料載入器正確性(工作者 RNG 增強重複、IterableDataset 分片、RGB-vs-BGR / ÷255 /
set_epoch)→data-pipeline.md。
驗證 — 數字是真的嗎?
在你信任或報告任何指標、消融實驗差異,或「它現在可以運作」之前:將其分類為錯誤 / 效應 / 雜訊,與恰好一個變數變更的結果進行比較,並探測資料洩漏 / 公平比較 / 變異性 / 指標方向。你無法從已儲存的工件中重新推導的數字還不是結果。立場:稽核→揭露——將完整性問題與結論一同呈現,永遠不會靜默通過或強硬阻擋。
- 完整方法論(14 節探測階梯 + 6 個不變性)→
references/verifying/methodology.md。 - 常數 / 退化輸出、
real == shuffle、模型忽略輸入 →references/verifying/representation-collapse.md。 - 隱藏訓練不足的綠色冒煙測試 vs 真正的錯誤;損失低但樣本差 →
references/verifying/smoke-hidden-failures.md。
比較時陳述指標的方向(PSNR/SSIM/mAP ↑ 較好;LPIPS/NMSE/損失 ↓ 較好)——切勿假設。追蹤器鑑識 / 修剪重複運行 →
scripts/wandb_forensics.py。
交付 — 組織 → 單一來源 → 圖表
使可交付成果成為一個不可變、版本化的證據層的確定性函數;透過機制鎖定可追溯性與跨文件一致性,而非手動。八個原則,分層(references/delivering/principles.md):
- 核心(從第一個真實數字開始接線) — P1 證據/呈現層清晰分離(呈現層中完全無手打數字)· P2 數字從
results.json產生,而非轉錄(因此過時的數字在物理上不可能)· P3 內容定址 + 僅附加的不可變運行(重新執行產生新的<run-id>,永遠不會覆寫)· P7 圖表鏈可追溯性(results.json → source_data.csv → 圖表+.provenance側車檔案)+ 像素重新開啟閘門(已儲存的圖表不等於正確的圖表)· P8 交付 = 揭露閘門,而非阻擋閘門。 - 進階(接近提交時啟用——YAGNI 同樣適用於可追溯性) — P4 資料/分割版本化 + 哈希固定(資料洩漏變成可機械化檢查)· P5 從乾淨的克隆執行一條指令重現(
scripts/repro.sh.template)。
實作細節:磁碟目錄結構 → references/delivering/data-architecture.md;兩種清單綱要 → references/delivering/evidence-manifest-schema.md;每圖表一個資料夾慣例 + 像素閘門 → references/delivering/figures.md;每個數字的揭露檢查清單 → references/delivering/delivery-gate.md。
EVIDENCE.json是專案層級的單一事實來源——一個機器可讀的聲明↔證據對應表(每個聲明 ← 支援的實驗 ID / 指標 / 圖表 + 論文錨點 + 儲存庫中的file:line)。scripts/reconcile.py對整個儲存庫進行 grep,與其權威值進行比較,以捕捉跨文件漂移;scripts/manifest_scaffold.py建立初始結構。
輔助技能(皆為選用——此技能可獨立運作)
建議的獨立安裝,可深化執行 / 驗證 / 交付;此技能不需要它們,完全可獨立運作。每行一個列表,說明每個技能添加了什麼,以及無輔助技能時的替代方案 → references/companions.md。簡而言之:圖表繪製(nature-figure / publication-chart / scipilot-figure)、實驗驗證(experiment-verifier 代理)、平行消融(superpowers:dispatching-parallel-agents)、HF 傳輸 + 託管追蹤器(huggingface-skills:hf-cli / huggingface-trackio)。
隨著時間持續改進
技能是靜態的,但每次執行都可以教它一個陷阱——而不會破壞它。協議 → references/self-improvement.md:僅沉澱已找出根本原因、可重現、可泛化的陷阱(一次性問題是假設,不是陷阱);將使用者/專案特定的事實路由到主機的記憶體中,將可泛化的事實路由到提議的目錄編輯中;從不靜默地改寫技能檔案——草擬 症狀 → 根本原因 → 修復 並讓使用者批准。平台事實帶有 verified <月> 戳記——在賭上金錢或資料之前,根據當前文件重新驗證任何關閉/計費事實(scripts/check_staleness.py)。
捆綁的資源
僅載入當前階段需要的內容(以上主體部分指明了各個檔案)。
references/run-local/— 自有機器:環境衛生 · 啟動 · 多 GPU · 本地 OOM。references/run-remote/— 租用機器:原則 · 生命週期檢查清單 · 監控模式 · SSH 傳輸 · 競價彈性 · 中國網路 · 平行消融 · 多節點 · 通用陷阱(U1–U43)。references/training/— DL 訓練除錯層(8 個檔案;本地/遠端無關)——已在上方路由。references/verifying/— 數字是真的嗎:方法論 · 表示崩潰 · 冒煙測試隱藏失敗。references/delivering/— 可交付成果:原則 · 資料架構(+EVIDENCE.json)· 證據清單綱要 · 圖表 · 交付閘門。references/companions.md(選用技能 + 替代方案)·references/self-improvement.md(陷阱捕捉循環)。profiles/<platform>.md— 各平台基礎(7 個租用設定檔 +local.md;_schema.md= 欄位定義)。scripts/— 包裝器(run_one
…
[因篇幅限制而截斷]