FSDP
3 秒看懂
FSDP(Fully Sharded Data Parallel,全分片資料並行)是一種將模型引數、梯度、最佳化器狀態在所有 GPU 上切成碎片儲存的分散式訓練策略,屬於資料並行範式的變體。它讓每一張 GPU 在訓練過程中僅始終持有模型的一個分片,在需要完整引數的前向/反向計算時才臨時通過通訊操作“拼”出全量引數,計算完馬上釋放,從而用多卡視訊記憶體換單卡可訓模型規模。你可以把它理解成:傳統資料並行是每張卡放一整份模型,FSDP 則是把一份模型拆碎後人人保管一小塊,用到時再互相借閱。
3 分鐘產業解釋
大型模型時代,單卡視訊記憶體早已無法放下一整份千億引數的模型,而傳統資料並行要求每張卡都有一份完整的模型副本,即使買再多卡也無濟於事。FSDP 正是在這一矛盾下由 PyTorch 團隊(Meta)採納零冗餘最佳化器(ZeRO)中 Stage‑3的思想整合進官方架構的方案。
產業價值在於:它讓開發者無需切換到更復雜的模型並行(張量並行、流水線並行),可以在通用的資料並行程式碼上做極小的改動,就將可訓練引數量從幾十億拉昇至數百億級別。這極大地降低了超大型模型訓練的門檻,同時保留了資料並行高計算效率(GPU 利用率高)的優勢。當前 FSDP 已成為主流大規模模型(如 LLaMA 系列、Stable Diffusion 等)的首選訓練策略之一,與張量並行、流水線並行混合使用,支撐起了萬億引數規模的預訓練。
15 分鐘專家深入
FSDP 的本質是用通訊換取視訊記憶體。它重新組織了訓練迴圈中的記憶體生命週期:
- 分片狀態:模型引數、梯度、最佳化器狀態(如 Adam 的一階/二階矩)被均分到所有 GPU rank,平常以分片形式駐留,只有計算時才對需要的那一部分做全域性收集。
- 動態重構:前向傳播需要某一層引數時,FSDP 觸發 all‑gather 操作,從所有 rank 將該層引數碎片拼回全量,存入臨時視訊記憶體區;該層計算完成立即釋放。反向傳播對稱執行,需要引數時重新 all‑gather,梯度計算後通過 reduce‑scatter 將梯度分片歸約並分發到各 rank,隨後釋放重構的引數和梯度全量。
- 最佳化器更新:每個 rank 只對自己保管的引數分片應用最佳化器步驟,不需額外通訊。
這一設計使得在一個通訊能力足夠的集群裡,模型的最大可訓規模近似隨 GPU 數量線性擴充套件,單卡只需承擔總引數量/GPU 數的記憶體開銷(加上少量臨時 buffer 和啟用記憶體)。同時,FSDP 可以按使用者指定的策略選擇哪些層做分片,支援混合精度、啟用檢查點、動態分片粒度(如 FlatParameter),以適應不同網路結構。
技術挑戰集中在通訊效率與計算的重疊:必須精心設計排程,使 all‑gather 和 reduce‑scatter 與矩陣乘法等計算非同步執行,否則通訊延遲將嚴重損害吞吐率。此外,大規模叢集下的網路拓撲、集合通訊庫(NCCL)的效能對 FSDP 的訓練速度有決定性影響。
技術原理(最深)
FSDP 的核心機制源自 DeepSpeed ZeRO‑Stage‑3,並在 PyTorch 內部實現為 torch.distributed.fsdp.FullyShardedDataParallel。其關鍵狀態機如下:
+-------------------------------+
| Sharded State (resident) |
| - param shard |
| - optimizer states shard |
+-------------------------------+
|
[pre-forward: all-gather]
v
+-------------------------------+
| Unsharded State (transient) |
| - full parameter |
+-------------------------------+
|
[layer computation]
|
v
+-------------------------------+
| Discard full param; |
| keep only param shard |
+-------------------------------+
|
[pre-backward: all-gather again]
v
+-------------------------------+
| Unsharded State (transient) |
| - full parameter |
+-------------------------------+
|
[backward pass]
|
v
+-------------------------------+
| Grad computed as full; |
| reduce-scatter to get grad |
| shard per rank |
+-------------------------------+
|
v
+-------------------------------+
| Sharded grad resident; |
| optimizer step on local shard|
+-------------------------------+
關鍵引數與機制(定性,無精確檢索數字):
- 分片策略:可對每個
nn.Module獨立設定分片策略,常將整個 transformer block 扁平成FlatParameter再分片,以減少通訊次數和記憶體碎片。 - 通訊原語:前向用
all-gather,反向梯度同步用reduce-scatter,兩者均通過 NCCL 實現。注意:這裡的通訊模式與張量並行的AllReduce或 MoE 的All-to-All有本質區別。 - 記憶體分解:單卡總記憶體 ≈ 分片引數 + 分片最佳化器狀態 + 分片梯度 + 啟用記憶體 + 臨時重構 buffer。若完全不使用 FSDP,總記憶體 ∝ 模型全量 × 常數;使用 FSDP 後,前三項被除以 GPU 數量,啟用記憶體仍然與 batch size 和層數相關,因此通常還需配合啟用檢查點。
- 動態釋放:通過註冊前向/反向鉤子,在
nn.Module前後自動執行 ungather 和 free,對使用者基本透明。
與模型並行混合:當單卡即使分片後仍無法容納某些超長層或超大嵌入表時,會疊加張量並行(切分單層矩陣乘法)或流水線並行(切分層間)。FSDP 作為外層資料並行,與內層模型並行正交組合,形成 3D 並行。
技術演進史
- 2017‑2019 年:PyTorch 的
DistributedDataParallel(DDP) 統治主流,通過AllReduce同步梯度,每張卡儲存完整模型副本,最大型模型規模受單卡視訊記憶體硬限。 - 2020 年:微軟 DeepSpeed 釋出 ZeRO 論文,提出將最佳化器狀態、梯度、引數分片的三個階段,開啟“零冗餘資料並行”時代。ZeRO‑Stage‑3 首次實現引數分片,讓千億模型訓練成為可能。
- 2021 年:PyTorch 社群推出 FSDP 早期版本,作為
torch.distributed.fsdp模組,原生整合到 PyTorch 生態,降低了部署門檻。 - 2022‑2023 年:FSDP 持續迭代,引入
SHARD_GRAD_OP、混合分片、通訊計算 overlap、CPU offload 等特性,逐步對齊甚至部分超越 DeepSpeed 的 Stage‑3 效能。 - 2024 年及以後:FSDP 成為 PyToch 官方推薦的大規模資料並行方案,與
torch.distributed下的管道並行torch.distributed.pipelining等形成統一併行化 API,支援多模態大型模型、MoE 等複雜架構的訓練。
技術路線對比(量化表)
由於缺乏檢索資料,以下為定性比較,基於公開技術原理(非本次檢索證據)。
| 維度 | FSDP (ZeRO‑Stage‑3) | DeepSpeed ZeRO‑3 | DDP (傳統) | 張量並行 (Megatron‑LM style) |
|---|---|---|---|---|
| 模型引數儲存 | 每卡僅存分片 | 每卡僅存分片 | 每卡存全量 | 每卡存垂直切片的子矩陣 |
| 通訊量級 | 每層 3×引數量 (前向 all‑gather + 反向 all‑gather 和 reduce‑scatter) | 類似 FSDP | 每步 2×引數量 (AllReduce 梯度) | 每層多次 AllReduce,通訊頻繁 |
| 最大可訓模型 | 隨 GPU 數近似線性擴充套件 | 隨 GPU 數擴充套件 | 受單卡視訊記憶體限制,無法擴充套件 | 受單卡視訊記憶體×模型並行度擴充套件 |
| 程式碼侵入性 | 低,包裹模型即可 | 低,配置 json 或呼叫 api | 非常低 | 高,需手動切分矩陣維度 |
| 額外功能 | CPU offload,mixed precision,啟用檢查點 | 同左,另有 ZeRO‑Infinity (NVMe offload) | 僅依賴於混合精度、DDP | 通常與流水線並行、資料並行結合 |
| 效能瓶頸 | 通訊延遲、all‑gather 與計算重疊程度 | 同左 | 多卡梯度的 AllReduce 頻寬 | 層內 AllReduce 的延遲,scale 受限 |
| 適用場景 | 數百億至千億稠密模型,通用性最強 | 同左 | 十億以內模型 | 萬億模型必需,配合 3D 並行 |
上下游
上游:
- 集合通訊庫:NCCL(NVIDIA)、RCCL(AMD)、Gloo(CPU)等是 FSDP 通訊高效性的命脈,直接影響訓練吞吐率。
- GPU 硬體:高頻寬視訊記憶體(HBM)、高速 NVLink/NVSwitch 實現跨 GPU 低延遲通訊,是分片後效能能否維持的關鍵。
- 深度學習架構:PyTorch 本身提供分散式基礎設施,FSDP 的實現深度依賴於
ProcessGroup、Tensor分片原語。
下游:
- 大規模預訓練:用於訓練 GPT、LLaMA、Gemma、Falcon 等語言模型,以及擴散模型等生成模型。
- 微調與定製:在引數高效微調(LoRA、QLoRA)場景,FSDP 可用於基座模型的分片,降低微調整體視訊記憶體。
- AI 雲端服務 / 算力平台:雲端廠商在其 AI 平台(如 Amazon SageMaker、Google Cloud TPU/GPU 服務)中整合 FSDP 作為大規模訓練的首選策略,為使用者提供開箱即用的方案。
關鍵指標
- 可擴充套件性(scale-out factor):定義為最大可訓引數量與單卡視訊記憶體之比。理想情況下接近 GPU 數量,實際受通訊開銷、啟用記憶體、臨時 buffer 影響可能打折扣。
- 模型 FLOPS 利用率(MFU):反映計算資源實際用於矩陣運算的比例。FSDP 引入的通訊易降低 MFU,通訊與計算的重疊程度是決定 MFU 的關鍵。
- 視訊記憶體峰值:通常由全量引數重構時的臨時 buffer 與啟用記憶體共同決定,可通過調整分片粒度、批次大小、啟用檢查點控制。
- 通訊頻寬利用率:受到 all‑gather / reduce‑scatter 資料量、網路拓撲、NCCL 演算法選擇的影響。
注:具體數值因硬體配置、模型結構差異極大,無法給出普適數字。
供需與市場資料
由於本次聯網檢索失敗,無法提供基於最新報告的市場規模或採用率數字。從已知產業趨勢推算(定性,[行業觀察]而非精確資料):
- 需求側:隨著百億、千億引數稠密模型成為雲端廠商、AI 實驗室和大型企業的“入場券”,能最大限度降低單卡視訊記憶體需求且複用資料並行優勢的 FSDP/ZeRO 已成為剛需。幾乎所有基於 Transformer 的大型模型訓練流程都直接或間接使用了 FSDP 或其等效機制。
- 供給側:PyTorch 官方 FSDP 因原生整合和質量保障,在學術和工業界份額快速攀升,擠壓了 DeepSpeed 的部分空間,但 DeepSpeed 仍憑藉更多最佳化特性(如 ZeRO‑Infinity 等)保持強競爭力。此外,JAX 生態下的
pjit/xmap和 TensorFlow 的tf.distribute也存在類似思想,但生態集中度不及 PyTorch 家族。 - 無精確資料:FSDP 作為軟體特性不單獨銷售,其經濟價值體現在所支撐的模型規模和業務營收上,未形成獨立市場統計。
代表公司與資本對映
- Meta (PyTorch 核心維護方):FSDP 的開發者與主要推動者,通過 PyTorch 生態服務於內部(LLaMA 訓練)和外部開發者,影響整個 AI 基礎設施。
- 微軟(DeepSpeed 團隊):FSDP 的直接競品 ZeRO 的締造者,DeepSpeed 被廣泛用於 Azure 之上的大型模型訓練,兩家在技術路線和生態上有競爭也有協作(如 PyTorch 與 DeepSpeed 互操作性)。
- NVIDIA:GPU 硬體與 NCCL、Megatron‑LM 的提供方,通過最佳化 NCCL 集合操作直接影響 FSDP 的實測效能,同時其 Megatron 架構與 FSDP 可組合使用。
- 雲端廠商(AWS、GCP、Oracle 等):在其 AI 訓練服務中提供預配置的 FSDP/DeepSpeed 環境,吸引大中型模型訓練客戶,以此帶動計算例項的消耗。
- 大型模型創業公司(OpenAI、Anthropic、Cohere 等):內部訓練棧極少會直接使用未修改的 FSDP,但常在其基礎設施中自建類似 FSDP 的“分片資料並行”模組;這些公司的技術選擇反向驅動開源社群的改進。
投資邏輯
- 算力基礎設施的乘數效應:FSDP 等技術讓同樣數量 GPU 能訓練更大型模型,單位算力的產出複雜度提升,降低了大型模型創新的算力門檻。這一效率放大效應使提供 GPU 叢集的雲端廠商和託管服務商受益,因為更多客戶能以可接受的成本進入大型模型賽道。
- 架構生態的護城河:掌握 FSDP 這類核心並行策略的架構(PyTorch)強化了使用者粘性,進而帶動其背後的公司(Meta)在 AI 標準制定上的話語權,以及與之深度繫結的硬體/雲端生態。
- 軟體最佳化能力成為競爭力:投資於能夠將 FSDP 等方案最佳化到極致的團隊(如能夠大幅提升 MFU、降低通訊損耗),可能帶來訓練成本的大幅下降,這在大型模型價格戰背景下是結構性優勢。
- 風險點:該領域技術演進快,可能出現顛覆性的並行策略或硬體架構(如可擴充套件的共享記憶體池、矽光互聯)弱化純資料並行的價值;但短期內 FSDP 仍是主力。
常見誤讀糾偏
-
“FSDP 就是資料並行 + 模型分片”
這不全面。傳統資料並行中每張卡擁有相同模型,僅梯度同步用 AllReduce。而 FSDP 是在資料並行架構內深度嵌入引數分片與動態重構機制,通訊模式變為每層的 all‑gather + reduce‑scatter,通訊量從 2×全引數量變為 3×全引數量(因為引數前向需 all‑gather,反向再 all‑gather 繼而梯度 reduce‑scatter),但換來視訊記憶體呈線性削減。兩者的通訊拓撲和資料流完全不同。 -
“用了 FSDP 就可以無限增大型模型”
錯誤。FSDP 緩解了引數與最佳化器狀態的記憶體壓力,但啟用記憶體仍按序列長度和批次大小增長,且重構引數所需的臨時 buffer 也需要額外空間。若單卡啟用記憶體已滿,即使引數分片為零也無法訓練。因此通常須配合啟用檢查點、流水線並行或其他策略才能持續擴大型模型。 -
“FSDP 和 DeepSpeed ZeRO‑3 完全一樣”
核心演算法相同,但工程實現和預設配置存在差異。FSDP 在通訊排程、混合精度整合、引數展平方式等方面有自己的設計(例如將整個 transformer 模組的引數展平成FlatParameter以減少通訊次數),效能特性在不同硬體和模型下可能與 DeepSpeed 不同。兩者都在快速迭代,不可簡單視為等價。
學習路徑
- 基礎儲備:理解 PyTorch 的
DataParallel和DistributedDataParallel原理,掌握集合通訊原語(all‑reduce, all‑gather, reduce‑scatter)與 NCCL 基礎。 - 核心論文:閱讀 ZeRO 論文《ZeRO: Memory Optimizations Toward Training Trillion Parameter Models》,理解三種分片狀態的記憶體節省邏輯。
- 官方教程:PyTorch 官方 FSDP 入門教程與 API 文件,通過小規模示例(如 ResNet、GPT‑2)動手測試,觀察視訊記憶體佔用變化與通訊開銷。
- 進階實戰:研究
torch.distributed.fsdp.wrap策略、auto_wrap_policy,嘗試對 Hugging Face 模型應用 FSDP,結合混合精度訓練的 O2/O3 模式,理解混合分片與通訊重疊。 - 系統最佳化:分析 NCCL 效能 profiling 結果,學習如何調優通訊與計算的重疊 (
limit_all_gathers)、使用 CPU offload 等技術,以及搭建 3D 並行的混合訓練棧。 - 追蹤前沿:關注 PyTorch 倉庫 FSDP 相關的 PR 和 RFC,以及各大型模型開源專案的訓練配置(如 Meta 釋出的 LLaMA 訓練指令碼),瞭解生產級調優實踐。
一句話總結
FSDP 是現代大型模型訓練棧中“低成本高擴充套件性”的標配元件:它把模型拆碎了存,需要時再拼,讓相同的 GPU 叢集能喂進大得多的模型,而開發者幾乎不用改變書寫模型迴圈的習慣。
延伸閱讀與來源
- ZeRO 論文:Rajbhandari et al., “ZeRO: Memory Optimizations Toward Training Trillion Parameter Models”, SC20.
- PyTorch FSDP 官方文件:https://pytorch.org/docs/stable/fsdp.html
- Meta 開源的 LLaMA 訓練程式碼(如 torchtitan 庫)中的 FSDP 配置示例。
- DeepSpeed 官方文件 ZeRO‑3 章節。
- NVIDIA Megatron‑LM 專案中關於張量並行與資料並行(含分片)組合使用的技術報告。
注:由於本次聯網檢索未返回結果,以上內容均基於公開技術原理給出定性描述,未引用具體數值或硬性指標。如需最新效能對比或產業採用率資料,建議查詢 [PyTorch 社群報告]、[雲端廠商技術白皮書] 等原始來源。