PyTorch FSDP(フルシャードデータ並列)(パイトーチエフエスディーピーフルシャードデータヘイレツ)
PyTorchネイティブの完全シャードデータ並列学習ライブラリ。モデルパラメータ・勾配・オプティマイザ状態をGPU間で完全分散し、DeepSpeed ZeRO Stage 3相当のメモリ削減を実現。LLaMA/Mistral系モデルの学習で広く採用されている。
PyTorch FSDP(フルシャードデータ並列)
FSDPはMeta AI(FAIR)が開発しPyTorch 1.12でコア統合した完全シャードデータ並列ライブラリ。データ並列の各レプリカがモデル全体のコピーを持つ従来DDPと違い、FSDPはモデルを「シャード(断片)」に分割して各GPUに分散保持する。デバイスメッシュ全体でパラメータ・勾配・オプティマイザ状態が完全分散され、DeepSpeed ZeRO Stage 3と同等のメモリ削減を実現する。
FSDP vs DDP
DDPは全GPU同一パラメータを複製し、勾配をAllReduceで集約。FSDPはN分割でメモリをNx削減するが、通信としてReduceScatter+AllGatherの組み合わせが必要になる。FSDPのセットアップはDDPより複雑だが、数十億パラメータ以上のモデルではFSDPの方が実用的だ。
FSDP2(PyTorch 2.x)
PyTorch 2.2以降のFSDP2はAPIを大幅刷新。per_parameter_fsdpで粒度細かい制御が可能になり、パラメータごとに異なるシャーディング戦略を適用できる。torch.compileとの相性も改善し、学習速度が向上した。
シャーディング戦略
from torch.distributed.fsdp import FullyShardedDataParallel as FSDP
from torch.distributed.fsdp import ShardingStrategy
# 完全シャード(ZeRO-3相当)
model = FSDP(model, sharding_strategy=ShardingStrategy.FULL_SHARD)
# ハイブリッド(ノード内DDP + ノード間FSDP)
model = FSDP(model, sharding_strategy=ShardingStrategy.HYBRID_SHARD)
HYBRID_SHARDはノード内(NVLink接続GPU群)でシャード、ノード間(InfiniBand)でDDPという階層構造。NVLinkの高帯域を生かしつつノード間通信量を削減する実用的な設定だ。
LLaMA/Mistral学習での採用
Meta公式のLLaMA-2学習コードがFSDPを使用したことで業界標準化が加速。Hugging Face accelerateライブラリのFSDPバックエンド対応により、Transformersモデルをほぼコード変更なしでFSDP学習できる環境が整った。2024〜2025年はllamafactory、LitGPT、torchtuneなどFSDP採用の学習ライブラリが主流になっている。
メモリ効率の実例
LLaMA-3 8Bをフルファインチューニングする場合、DDPのBF16では8GPU×16GB=128GB VRAM必要。FSDP Stage3のBF16では8GPU×約20GB(オーバーヘッド含む)、activation checkpointing組み合わせで8GPU×約12GBまで削減できる。activation checkpointingとの組み合わせで実用的な8×A100(80GB)構成での100B規模モデル学習が実現する。