AI・機械学習
上級

3D並列(スリーディーヘイレツ)

データ並列(DP)・テンソル並列(TP)・パイプライン並列(PP)の3つの並列化手法を同時に組み合わせた大規模分散学習戦略。数百〜数千GPUでの効率的なLLM学習を実現し、Megatron-LMやDeepSpeedが代表的な実装。

0 回閲覧
0 いいね

3D並列とは

3D並列(3D Parallelism)は、データ並列(DP)・テンソル並列(TP)・パイプライン並列(PP)の3つの並列化次元を同時に組み合わせた分散学習戦略である。各手法の長所を活かし短所を補完することで、数千GPU規模の大規模LLM学習を効率的に実現する。NVIDIAのMegatron-LMが2021年に体系化し、現在では事実上の業界標準となっている。

3D並列の構成

3D並列では、全GPU群を3つの次元で論理的にグループ分けする。

  • テンソル並列(TP)次元: ノード内のGPUグループ(通常8台)。各レイヤーの行列演算を分割。NVLink接続が前提
  • パイプライン並列(PP)次元: 複数ノードにまたがるステージ。モデルのレイヤー群をステージに分割。InfiniBand/RoCE接続
  • データ並列(DP)次元: 上記TP×PPで構成された「モデルレプリカ」を複数作り、データを分割して並列学習。AllReduceで勾配同期

例えば64台のH100(8ノード×8GPU)で TP=8, PP=4, DP=2 の場合:

  • 各ノード内の8GPUがTP=8で1レイヤーの行列演算を分割
  • 4ノード(4ステージ)でPP=4のパイプラインを構成
  • 同一構成のパイプラインが2本(DP=2)で並列学習

GPU配置の設計原則

並列次元通信頻度通信量/回推奨接続配置範囲
TP極高(毎レイヤー)hidden_size × batchNVLink 900GB/sノード内
PP中(ステージ境界)activation × micro_batchInfiniBand 400Gbpsノード間(近接)
DP低(全レイヤー計算後)全パラメータ勾配InfiniBand 400Gbpsノード間(広域可)

最も通信頻度の高いTPをノード内に、次にPPを近接ノード間に、DPを残りのノード間に配置するのが鉄則。

代表的な3D並列構成例

モデル総GPU数TPPPDPフレームワーク
Llama 3.1 405B16,384 H100816128内製
GPT-NeoX 20B96 A1002412Megatron-DeepSpeed
Bloom 176B384 A1004128Megatron-DeepSpeed
DeepSeek-V3 671B2,048 H8001(EP=64)168内製
Falcon 180B4,096 A1008864内製

DeepSeek-V3はMoEのため、テンソル並列の代わりにExpert並列(EP=64)を使用している点が特徴的。

パイプライン並列のスケジューリング

パイプライン並列ではGPUがアイドルになる「バブル」が問題となる。以下のスケジューリング手法で最小化する。

  • GPipe: 全マイクロバッチのforwardを完了後、全backwardを実行。バブル率 = (PP-1) / マイクロバッチ数
  • 1F1B(One Forward One Backward): forwardとbackwardを交互に実行してバブルを削減。PipeDreamが提唱
  • Interleaved 1F1B: 各GPUに非連続のレイヤーチャンクを割り当て、バブルをさらに削減。Megatron-LM v3+
  • Zero Bubble Pipeline: バブルをほぼゼロにする手法。backward計算を入力勾配(B)と重み勾配(W)に分離して並列化
スケジュールバブル率メモリ使用量実装複雑度
GPipe(PP-1)/M高(全マイクロバッチ保持)低
1F1B(PP-1)/M中(PP個のマイクロバッチ保持)中
Interleaved 1F1B(PP-1)/(M×V)中高
Zero Bubble≈0中非常に高

※ M=マイクロバッチ数、V=仮想ステージ数

Megatron-LMでの3D並列設定

# Megatron-LM 3D並列の設定パラメータ例(概念)
# --tensor-model-parallel-size 8    # TP=8(ノード内)
# --pipeline-model-parallel-size 4  # PP=4(4ノードにまたがる)
# --data-parallel-size は自動計算   # DP = 総GPU / (TP × PP)
# --micro-batch-size 1              # マイクロバッチサイズ
# --global-batch-size 2048          # グローバルバッチサイズ
# --num-layers-per-virtual-pipeline-stage 2  # Interleaved 1F1B
# --sequence-parallel                        # シーケンス並列有効化
# --use-flash-attn                           # FlashAttention使用

総GPU数 = TP × PP × DP で決まる。例: 256 GPU = 8 × 4 × 8。

3D並列の設計指針

3D並列の各次元をどう設定するかはモデルサイズ・GPU数・ネットワーク構成で決まる。

  1. TP度: ノード内GPU数以下に設定(H100 DGX: TP≤8)。モデルの隠れ層サイズがTP度で割り切れること
  2. PP度: メモリに収まる最小PP度を選択。PP度が大きいとバブルが増加するため必要最小限にする
  3. DP度: 残りのGPUで自動決定(DP = 総GPU / TP / PP)。バッチサイズの拡大に寄与
  4. マイクロバッチ数: PP度の4倍以上を推奨(バブル削減のため)
  5. アクティベーション再計算: TPとPPでメモリが足りない場合に有効化

4D並列・5D並列への拡張

2025-2026年には3D並列をさらに拡張する手法が登場している。

  • Expert並列(EP): MoEモデルでExpertを異なるGPUに配置。3D+EP=4D並列(DeepSeek-V3)
  • Context並列(CP): 長シーケンスをシーケンス次元で分割。3D+CP=4D並列。Ring Attentionベース
  • シーケンス並列(SP): LayerNormやDropoutをシーケンス次元で分割。TPと組み合わせ
  • 5D並列: TP+PP+DP+EP+CPの全5次元を組み合わせ。NVIDIA Megatron-Core v0.8+で対応

よくある質問(FAQ)

Q1: 3D並列の各次元の優先順位は? A: まずTPをノード内GPU数に設定(通信帯域が最重要)、次にPPをメモリに収まる最小値に、残りをDPに割り当てる。DP度が大きいほどスケーリング効率が良いため、TP・PPは必要最小限にする。

Q2: 小規模(8-16GPU)でも3D並列は使いますか? A: 8GPUならTP=8のみ(1Dテンソル並列)で十分なことが多い。16GPU(2ノード)からTP=8+PP=2やTP=8+DP=2が選択肢。3次元すべて使うのは通常32GPU以上。

Q3: 3D並列のデバッグはどうしますか? A: Megatron-LMの--log-validation-ppl-to-tensorboardで各ステージの損失を監視。NCCL_DEBUG=INFOで通信ログを確認。小規模(2-4GPU)で動作確認後にスケールアップする段階的アプローチが推奨。

Q4: 3D並列の設定ミスで起きやすい問題は? A: TP度がhidden_sizeを割り切れない場合のクラッシュ、PP度が大きすぎてバブルが50%以上になる性能劣化、DP度が小さすぎてAllReduceの効率が悪化する、マイクロバッチ数不足でパイプラインが埋まらない、などが典型的。

まとめ

  • 3D並列はTP+PP+DPの3次元を組み合わせた大規模分散学習の標準戦略
  • TPはノード内NVLink、PPはノード間InfiniBand、DPは広域に配置
  • パイプラインバブル削減にInterleaved 1F1Bが有効
  • TP度はノード内GPU数以下、PP度は最小限、DP度で残りを埋める
  • 4D/5D並列(Expert並列、Context並列)への拡張が進行中