mcpField
N
nemo-mbridge-perf-parallelism-strategies

nemo-mbridge-perf-parallelism-strategies

github.com/nvidia開発3.8k1.8k 回インストール今日更新
リポジトリ

nemo-mbridge-perf-parallelism-strategies について

Megatron Bridge の学習並列化を選ぶためのスキルです。密モデルや MoE モデルを構成する担当者向けに、ハードウェア構成、系列長、メモリ見積もり、MoE の最小 GPU 数の算出方法をまとめています。

主な機能

  1. 01モデル規模別の並列化案
  2. 02MoE 並列化設定の例
  3. 03構成と系列長に応じた選択
  4. 04最小 GPU 数の算出
  5. 05学習メモリの見積もり

活用シーン

  1. 01密モデル学習の並列化計画
  2. 02MoE ジョブの GPU 数見積もり
  3. 03構成や系列長に応じた設定調整

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/nvidia/skills --skill nemo-mbridge-perf-parallelism-strategies

インストール後、Claude Code で/nemo-mbridge-perf-parallelism-strategiesを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

BENCHMARK.md
card.yaml
skill-card.md
skill.oms.sig
evals/
evals.json

詳細

並列化戦略の選択スキル

各並列化方式の安定した背景情報については、以下を参照してください。

  • @docs/parallelisms.md
  • @skills/nemo-mbridge-perf-parallelism-strategies/card.yaml

モデルサイズに基づく判断

Dense モデル
モデルサイズGPU 数推奨される開始設定
< 1B1-8DP のみ
1-10B8-16TP=2-4 + DP
10-70B16-64TP=4-8 + PP=2-4 + DP
70-175B64-256TP=8 + PP=4-8 + DP
175-500B256-1024TP=8 + PP=8-16 + CP=2 + DP
MoE モデル

MoE の並列化は Dense モデルとは異なります。トークンごとにアクティブになるパラメーターは一部だけなので、TP は多くの場合 1 または 2 のままにできます。アクティブなパラメーターのシャードがすでに単一 GPU に収まるためです。主なスケーリング軸は EP であり、PP はノード間のレイヤー分散を担います。

モデル(合計 / アクティブ)TPPPEP備考
OLMoE 7B / 1B118EP のみ、単一ノードに収まる
Moonlight 16B / 3B218共有レイヤー向けに小規模な TP
DeepSeek-V2 236B / 21B1432TP はまったく使用しない
GLM-4.5 Air 106B / 12B148TP はまったく使用しない
Qwen3 30B-A3B424
GLM-4.5 355B / 32B2816
Qwen3 235B-A22B4168事前学習では CP=2
DeepSeek-V3 671B / 37B21664TP=2 であり、8 ではない
Kimi-K2 1T21632

主なパターン:

  • TP の規模はパラメーターの合計数ではなく、アクティブなパラメーター数で決まります。アクティブなパラメーターが 37B の 671B MoE には、70B Dense モデルよりはるかに小さな TP で済みます。
  • EP はエキスパート数に合わせてスケーリングします。一般的な設定は、EP = num_experts または num_experts / experts_per_gpu です。
  • PP はモデルの深さを担います。大規模な MoE モデルでは、ノード間で PP=8-16 を使用します。
  • ETP(エキスパートテンソル並列化)はほとんど使用されません。Llama 4 は例外です(ETP=4)。

これらは開始点であり、絶対的なルールではありません。メモリ使用量と通信を検証するため、必ず最初のイテレーションをプロファイリングしてください。

ハードウェアトポロジーに基づく判断

NVLink を備えた単一ノード:

cfg.model.tensor_model_parallel_size = 8

InfiniBand を使用する複数ノード:

cfg.model.tensor_model_parallel_size = 8
cfg.model.pipeline_model_parallel_size = N

ネットワークが制限されている場合(Ethernet):

cfg.model.tensor_model_parallel_size = 4
cfg.model.pipeline_model_parallel_size = M

確実なルールは、TP を単一の NVLink ドメイン内に収めることです。ノード間のスケーリングには PP または DP を使用してください。ノード間の TP は、ほぼ常にパフォーマンスの低下につながります。

シーケンス長に基づく判断

シーケンス長推奨事項
< 2K標準的な TP + PP + DP
2K-8KSP(sequence_parallel=True)を追加
8K-32KCP=2 を追加
32K+CP=4-8 を追加し、大規模な CP では a2a+p2p を検討

並列化の組み合わせの有効化

3D 並列化(TP + PP + DP):

cfg.model.tensor_model_parallel_size = 4
cfg.model.pipeline_model_parallel_size = 4
cfg.model.sequence_parallel = True

4D 並列化(TP + PP + CP + DP):

cfg.model.tensor_model_parallel_size = 8
cfg.model.pipeline_model_parallel_size = 8
cfg.model.context_parallel_size = 2
cfg.model.sequence_parallel = True

EP + PP を使用する MoE(例:128 GPU での DeepSeek-V2 236B):

cfg.model.tensor_model_parallel_size = 1
cfg.model.pipeline_model_parallel_size = 4
cfg.model.expert_model_parallel_size = 32
cfg.model.sequence_parallel = False

小規模な TP + PP + EP を使用する MoE(例:256 GPU での DeepSeek-V3 671B):

cfg.model.tensor_model_parallel_size = 2
cfg.model.pipeline_model_parallel_size = 16
cfg.model.expert_model_parallel_size = 64
cfg.model.sequence_parallel = True

DP サイズは常に暗黙的です:

data_parallel_size = world_size / (TP * PP * CP)        # dense path
expert_data_parallel_size = world_size / (PP * EP * ETP) # MoE path

最小 GPU 数

設定を実行するために必要な 最小 GPU 数(つまり DP=1、EDP=1 の場合)は、すべての並列化軸の積ではありません。Dense の経路では TP*CP メッシュを使用し、MoE の経路では EP*ETP メッシュを使用します。また、各 PP ステージ内でこれら 2 つのメッシュは同じ GPU 群を共有します。つまり重なっており、掛け合わせるのではありません。掛け合わせるのは、互いに重ならないモデルのスライスである PP ステージのみです。したがって:

min_gpus = PP * max(TP * CP, EP * ETP)

よくある簡略化(誤り): PP * TP * CP * EP * ETP。これは GPU を過剰に割り当てる計算であり、多くの README や slurm のサイジング表に見られます。この誤った計算を広めないでください。

Dense 経路とエキスパート経路で異なるメッシュ形状を使用し、PP ステージの GPU 群を共有する、アテンションと MoE の並列化の分離については、Pangu Ultra MoE (arXiv:2504.14960) で詳しく説明されています。

例
設定誤り(PP·TP·CP·EP·ETP)正しい値(PP·max(TP·CP, EP·ETP))
PP=1, TP=2, CP=1, EP=8, ETP=1168(1 ノード)
PP=1, TP=4, CP=1, EP=8, ETP=1328(max(4, 8))
PP=1, TP=2, CP=2, EP=8, ETP=1328(max(4, 8))
PP=1, TP=2, CP=4, EP=8, ETP=1648(max(8, 8))
PP=2, TP=2, CP=1, EP=8, ETP=13216(2 · max(2, 8))
PP=1, TP=2, CP=1, EP=4, ETP=2168(max(2, 8))
最小構成を超えるスケーリング

GPU を追加すると、DP および/または EDP がスケーリングされます(world_size は両方の式を同時に満たす必要があります)。min_gpus では、大きい方のメッシュの DP(または EDP)は 1 となり、小さい方が余剰分を吸収します。

例 — TP=2、CP=1、EP=8、ETP=1、PP=1:

  • 8 GPU(min_gpus):dense DP = 8/2 = 4、MoE EDP = 8/8 = 1
  • 16 GPU:dense DP = 8、MoE EDP = 2 → グローバルバッチが 2 倍
  • 32 GPU:dense DP = 16、MoE EDP = 4 → グローバルバッチが 4 倍

slurm スクリプトの規模を決める際は、min_gpus(または DP/EDP によるスループット向上を目的とした、その倍数)から --nodes を計算してください。

MoE の規模に関するプロンプトに回答する際は、次のチェックリストを含めてください。

  • 指定された値を使って min_gpus = PP * max(TP * CP, EP * ETP) を計算する
  • 誤った式 PP * TP * CP * EP * ETP による総積を明確に否定する
  • DP の両方の式を示す:dense world_size / (TP * PP * CP)、MoE world_size / (PP * EP * ETP)
  • TP のトポロジー、SP、CP の割り切り条件、長いシーケンスに対する CP のガイダンスに言及する

メモリの見積もり

並列化なし(70B モデル、FP16):

parameters:       140 GB
gradients:        140 GB
optimizer states: 280 GB (Adam)
activations:       48 GB (batch=1, seq=4K)
total:            608 GB

TP=4、PP=4、DP=4(64 GPU)の場合:

parameters:        8.75 GB per GPU
gradients:         8.75 GB per GPU
optimizer states: 17.50 GB per GPU
activations:       3.00 GB per GPU
total:           ~38    GB per GPU

コードのアンカー

モデルプロバイダーで設定する並列化の次元:

model_config = GPTModelProvider(
    tensor_model_parallel_size=2,
    # ... other model parameters
)

DP サイズの計算:

data_parallel_size = world_size / (tensor_model_parallel_size × pipeline_model_parallel_size × context_parallel_size)

Bridge の初期化で並列化をプロセスグループに反映:

parallel_state.initialize_model_parallel(
    tensor_model_parallel_size=model_config.tensor_model_parallel_size,
    pipeline_model_parallel_size=model_config.pipeline_model_parallel_size,
    ...
    context_parallel_size=model_config.context_parallel_size,
    hierarchical_context_parallel_sizes=model_config.hierarchical_context_parallel_sizes,
    expert_model_parallel_size=model_config.expert_model_parallel_size,
    ...
)

注意点

  1. ノードをまたいだ TP はスループットを低下させます。TP は必ず単一の NVLink ドメイン内に収めてください。

  2. インターリーブなしの PP では、パイプラインのバブルが大きくなります。可能であれば virtual_pipeline_model_parallel_size を使用してください。

  3. SP には tensor_model_parallel_size > 1 が必要です。TP なしで SP のみを有効にすると、設定エラーになります。

  4. CP では seq_length % (2 * context_parallel_size) == 0 が必要です。

  5. EP は MoE モデル専用です。dense モデルで expert_model_parallel_size を設定しても、何も起こらないか、エラーになります。

  6. 上記のモデルサイズと並列化の表は、最初の目安です。メモリと通信を確認するため、必ず最初のイテレーションをプロファイルしてください。

  7. CUDA_DEVICE_MAX_CONNECTIONS などの関連する環境変数は、オーバーラップ設定と相互作用します。@skills/nemo-mbridge-perf-tp-dp-comm-overlap/SKILL.md を参照してください。

  8. MoE 構成に必要な最小 GPU 数は、すべての次元の積である PP * max(TP*CP, EP*ETP) ではありません。各 PP ステージでは、dense の TP*CP メッシュと MoE の EP*ETP メッシュが同じ GPU を共有します。上記の「最小 GPU 数」セクションを参照してください。

検証

並列化を上書きした、利用可能な最小のレシピを使って、組み合わせた並列化が正しく初期化されることを簡単に確認します。

CUDA_VISIBLE_DEVICES=0,1,2,3 uv run python -m torch.distributed.run --nproc_per_node=4 \
  scripts/training/run_recipe.py \
  --recipe llama32_1b_pretrain_config \
  model.tensor_model_parallel_size=2 \
  model.pipeline_model_parallel_size=2 \
  model.sequence_parallel=True \
  train.train_iters=3 train.global_batch_size=8 train.micro_batch_size=1 \
  scheduler.lr_warmup_iters=0 \
  validation.eval_iters=0 validation.eval_interval=0 \
  checkpoint.save_interval=0 \
  logger.log_interval=1

成功条件:

  • 終了コードが 0
  • イテレーション 3 で loss が有限(例:lm loss: 1.003808E+01)
  • ログに 4 ランクで TP=2、PP=2、DP=1 のレイアウトが表示される

コメント