為何一張 GPU 永遠不夠
兩道硬牆把預訓練逼上多台機器。第一是記憶體:一個數百億參數的模型,加上它的梯度與龐大的 AdamW 最佳化器狀態,需要的記憶體遠超任何單張 GPU 所有。第二是時間:一場正經訓練的算力預算——想想 10²³ 次 FLOPs——單一晶片要跑上好幾十年。答案是分散式訓練(distributed training):把工作攤到數百乃至數千張 GPU 上,讓它們像一體般協作。
在混合精度 Adam 训练中,每个参数约需 16 字节——权重、梯度与优化器状态相加——这正是内存(而非算力)迫使模型分布到多块 GPU 的原因。
難處在於這些 GPU 必須保持同步——它們訓練的是同一個模型——所以它們不斷透過高速互連交換資料。分散式訓練的藝術,就是把工作切得讓晶片把時間花在計算、而非互相等待上。切法有三種,彼此互補,而大型訓練會三種同時並用。
資料平行:複製模型,切分批次
最簡單也最常見的切法是資料平行(data parallelism)。在每張 GPU 上放一份完整的模型副本,給每份副本訓練批次中不同的一片,讓它們平行地各自計算梯度。接著是關鍵的一步:每張 GPU 分享它的梯度,並把它們平均起來(這個操作叫 all-reduce),於是所有副本套用一模一樣的更新,保持完美同步。
資料平行是讓訓練更快的方式:GPU 加倍,每秒能處理的批次就加倍。但它本身對記憶體沒有幫助,因為每張 GPU 仍裝著整個模型。現代的解法是切分式資料平行(FSDP/ZeRO 家族),它把權重、梯度、最佳化器狀態也切分到資料平行群組上,只在需要時才把各片湊齊——既保留簡單的程式模型,又大幅削減每張 GPU 的記憶體。
張量與管線平行:切分模型本身
當一個模型即使切分後仍大到單張 GPU 裝不下,你就必須把模型本身剖成幾塊——這就是張量與管線平行(tensor and pipeline parallelism)。它們沿兩個不同的軸來切:
張量平行(tensor parallelism)在一層之內切。一個巨大的矩陣乘法被按列切分到數張 GPU 上;每張做一部分運算,再把結果合併。它非常快,但很「聒噪」——GPU 在每一層都得交談——所以它用在一組緊密相連的晶片之內(通常是同一台伺服器內、以最快互連相連)。
一个 Transformer 模块——归一化、注意力、残差与前馈——其内部矩阵乘法按列拆分到多块 GPU。
管線平行(pipeline parallelism)在層之間切。第 1–8 層放在 GPU A、第 9–16 層放在 GPU B,依此類推,像生產線上的工作站。一個批次依序流過各個階段。危險在於後段等前段時出現的閒置「氣泡」,所以批次會被切成微批次(micro-batch),讓每個階段同時都有活幹。
a frontier run, 3D parallelism on 1024 GPUs: tensor parallel = 8 (within a server, splits each layer) pipeline parallel = 8 (across servers, splits the layer stack) data parallel = 16 (replicas, splits the batch) 8 * 8 * 16 = 1024 GPUs cooperating on one model
瓶頸在通訊,不在運算
這是規模上違反直覺的真相:有了數千張 GPU,限制因素很少是純粹的算術——而是在晶片之間搬資料。每一次梯度的 all-reduce、每一次管線階段之間的交接都是通訊,而網路比它所餵養的運算單元更慢。一場能用上理論算力 90% 的訓練是極佳的;許多訓練光是等網路就浪費了三分之一以上。
因此平行策略要配合硬體拓樸來選:把聒噪的張量平行群組放在伺服器內最快的連結上、讓管線階段跨伺服器運行,並盡可能讓通訊與計算重疊——在下一層還在計算時,就把上一層的梯度送出去。混合精度在這裡也有幫助:16 位元的梯度要傳的位元組只有一半,所以混合精度買到的不只是運算速度,還有通訊速度。
讓長達數月的訓練存活
數千張 GPU 連跑數週,總會有東西壞掉:一顆晶片故障、一條網路連結抖動、一個節點重開。在那個規模下,硬體故障不是意外,而是整場訓練幾乎必然會發生的事。再加上上一篇的損失尖峰,一場真實的預訓練既是機器學習問題,也同樣是維運問題。求生工具包如下:
一个运维生命周期闭环,监控反馈到检查点、重启与恢复。
- 分散式檢查點:每個節點定期存下自己那一片狀態,讓完整模型在任何當機後都能還原。
- 自動重啟:故障時換上備援節點,從最後的檢查點接續,無需有人值夜。
- 健康與指標監控:盯著損失、梯度範數、吞吐量、各 GPU 溫度,捕捉麻煩的第一個徵兆。
- 決定性與日誌:記錄資料順序與隨機種子,好讓訓練能回捲、跳過壞批次,並完整重現整個過程。
把這一切兜起來——一個乾淨的兆級詞元語料庫、一份懂 Chinchilla 的預算、在混合精度下搭配暖身—衰減排程的 AdamW、以及裹在容錯維運裡的 3D 平行——你就具備了把空白網路變成基礎模型所需的一切。從這裡,旅程繼續走向微調(fine-tuning)與對齊(alignment),在那裡,這個原始的下一個詞元預測器,被雕琢成你真正會與之對話的、樂於助人的助理。