Data Parallelism(データパラレリズム)
同一のモデルを複数のデバイスに複製し、学習データを分割して各デバイスで並列に勾配計算を行った後、勾配を集約してパラメータを同期更新する分散学習の基本手法。
Data Parallelism とは
Data Parallelism(DP)は、分散深層学習における最も基本的かつ広く使われている並列化戦略である。モデル全体のコピーを各 GPU に配置し、学習データのミニバッチを GPU 数で等分して並列に Forward/Backward を実行する。各 GPU で算出された勾配を AllReduce で集約・平均し、全 GPU のパラメータを同一に保つ。
DP の仕組み
4 GPU でバッチサイズ 1024 の学習を行う場合の流れ:
- ミニバッチ 1024 サンプルを 4 分割(各 GPU 256 サンプル)
- 各 GPU で独立に Forward Pass → Loss 計算 → Backward Pass
- AllReduce で 4 GPU の勾配を集約・平均
- 各 GPU が同じ勾配でパラメータを更新
- 全 GPU のパラメータが常に同一に保たれる
DP の利点と課題
利点
- 実装が簡単: PyTorch なら
torch.nn.DataParallelまたはDistributedDataParallel(DDP)で数行追加するだけ - 線形スケーリング: GPU 数に比例してスループットが向上(理想値)
- モデル変更不要: 既存のモデルコードをそのまま使える
課題
- メモリ非効率: 全 GPU にモデル全体 + 勾配 + オプティマイザ状態を複製するため、GPU あたりのメモリ使用量が大きい
- 通信ボトルネック: AllReduce の通信量がパラメータ数に比例し、GPU 数が増えると帯域が逼迫
- バッチサイズの肥大化: GPU 数 × マイクロバッチサイズが実効バッチサイズとなり、学習の安定性に影響
PyTorch DDP vs DataParallel
| 特徴 | DataParallel (DP) | DistributedDataParallel (DDP) |
|---|---|---|
| プロセスモデル | シングルプロセス・マルチスレッド | マルチプロセス |
| 通信 | GPU 0 に集約 | AllReduce(対等) |
| GIL の影響 | 受ける | 受けない |
| マルチノード | 非対応 | 対応 |
| 性能 | 低い | 高い |
PyTorch 公式は DDP を推奨しており、DataParallel は非推奨(legacy)となっている。DDP は NCCL バックエンドで AllReduce を効率的に実行し、Backward 計算と通信をオーバーラップさせることで性能を最大化する。
ZeRO による DP のメモリ最適化
Microsoft DeepSpeed の ZeRO(Zero Redundancy Optimizer)は、DP のメモリ非効率を段階的に解消する技術である。
| ステージ | シャーディング対象 | メモリ削減率(目安) |
|---|---|---|
| ZeRO-1 | オプティマイザ状態 | 4x |
| ZeRO-2 | + 勾配 | 8x |
| ZeRO-3 | + パラメータ | N x(GPU 数に比例) |
ZeRO-3 では各 GPU が全パラメータの 1/N だけを保持し、必要時に AllGather で収集する。これにより 70B モデルを 8 GPU で学習可能になる。
Gradient Accumulation との併用
GPU 数は限られているが大きなバッチサイズで学習したい場合、Gradient Accumulation と DP を併用する。4 GPU × Gradient Accumulation 4 ステップ × マイクロバッチ 64 = 実効バッチサイズ 1024 となり、GPU メモリを節約しつつ大バッチ学習が可能。
DP のスケーリング法則
GPU 数を増やしたときのスループット向上は、理想的な線形スケーリングから通信オーバーヘッド分だけ低下する。実測では 8 GPU で 7.5 倍、64 GPU で 55-60 倍程度が典型値。Ring AllReduce の採用と、計算・通信のオーバーラップにより、この効率は改善されてきている。
FAQ
Q1: DP と FSDP の違いは?
A1: 従来の DP はモデル全体を各 GPU に複製する。FSDP(Fully Sharded Data Parallel)は ZeRO-3 相当のパラメータシャーディングを行うため、GPU あたりのメモリ消費が大幅に少ない。70B 以上のモデルでは FSDP がほぼ必須。
Q2: DP でバッチサイズを増やしすぎると何が起きる?
A2: 実効バッチサイズが大きくなりすぎると、学習初期の収束が不安定になる「Large Batch Problem」が発生する。Learning Rate Warmup や LARS/LAMB オプティマイザで緩和できるが、実験的にモデルごとの最適バッチサイズを見つける必要がある。
Q3: DP は推論でも使えるか?
A3: 推論時に同一モデルの複製を複数 GPU に配置し、リクエストを分散するのは DP の一形態である。ただし、単一リクエストのレイテンシは改善しない。レイテンシ削減にはテンソル並列(TP)が必要。