nemo-mbridge-perf-parallelism-strategies について
Megatron Bridge の開発者向けに、モデル規模、ハードウェア構成、シーケンス長に応じた並列処理の初期設定を示すガイドです。MoE の GPU 数見積もりも解説し、提案値はプロファイリングで検証するよう説明します。
主な機能
- 01モデル規模に応じた並列次元の指針
- 02ハードウェア構成に応じた TP・PP の選択
- 03シーケンス長に応じた SP・CP の指針
- 04MoE の最小 GPU 数の計算
- 05メモリ見積もりと設定確認の要点
活用シーン
- 01モデルの並列処理設定の初期値選び
- 02MoE 学習に必要な GPU 数の見積もり
- 03ノード間 TP とネットワーク構成の検討
- 04複合並列処理の初期化確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ promptingcompany/ nv-skills --skill nemo-mbridge-perf-parallelism-strategiesインストール後、Claude Code で/nemo-mbridge-perf-parallelism-strategiesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
BENCHMARK.mdcard.yamlskill-card.mdskill.oms.sigevals/evals.json詳細
並列化戦略の選択スキル
各並列化方式の安定した背景情報については、以下を参照してください。
- @docs/parallelisms.md
- @skills/nemo-mbridge-perf-parallelism-strategies/card.yaml
モデルサイズに基づく判断
Dense モデル
| モデルサイズ | GPU 数 | 推奨される開始設定 |
|---|---|---|
| < 1B | 1-8 | DP のみ |
| 1-10B | 8-16 | TP=2-4 + DP |
| 10-70B | 16-64 | TP=4-8 + PP=2-4 + DP |
| 70-175B | 64-256 | TP=8 + PP=4-8 + DP |
| 175-500B | 256-1024 | TP=8 + PP=8-16 + CP=2 + DP |
MoE モデル
MoE の並列化は Dense モデルとは異なります。トークンごとにアクティブになるパラメーターは一部だけなので、TP は多くの場合 1 または 2 のままにできます。アクティブなパラメーターのシャードがすでに単一 GPU に収まるためです。主なスケーリング軸は EP であり、PP はノード間のレイヤー分散を担います。
| モデル(合計 / アクティブ) | TP | PP | EP | 備考 |
|---|---|---|---|---|
| OLMoE 7B / 1B | 1 | 1 | 8 | EP のみ、単一ノードに収まる |
| Moonlight 16B / 3B | 2 | 1 | 8 | 共有レイヤー向けに小規模な TP |
| DeepSeek-V2 236B / 21B | 1 | 4 | 32 | TP はまったく使用しない |
| GLM-4.5 Air 106B / 12B | 1 | 4 | 8 | TP はまったく使用しない |
| Qwen3 30B-A3B | 4 | 2 | 4 | |
| GLM-4.5 355B / 32B | 2 | 8 | 16 | |
| Qwen3 235B-A22B | 4 | 16 | 8 | 事前学習では CP=2 |
| DeepSeek-V3 671B / 37B | 2 | 16 | 64 | TP=2 であり、8 ではない |
| Kimi-K2 1T | 2 | 16 | 32 |
主なパターン:
- 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-8K | SP(sequence_parallel=True)を追加 |
| 8K-32K | CP=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=1 | 16 | 8(1 ノード) |
| PP=1, TP=4, CP=1, EP=8, ETP=1 | 32 | 8(max(4, 8)) |
| PP=1, TP=2, CP=2, EP=8, ETP=1 | 32 | 8(max(4, 8)) |
| PP=1, TP=2, CP=4, EP=8, ETP=1 | 64 | 8(max(8, 8)) |
| PP=2, TP=2, CP=1, EP=8, ETP=1 | 32 | 16(2 · max(2, 8)) |
| PP=1, TP=2, CP=1, EP=4, ETP=2 | 16 | 8(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):denseDP = 8/2 = 4、MoEEDP = 8/8 = 1 - 16 GPU:dense
DP = 8、MoEEDP = 2→ グローバルバッチが 2 倍 - 32 GPU:dense
DP = 16、MoEEDP = 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)、MoEworld_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,
...
)
注意点
-
ノードをまたいだ TP はスループットを低下させます。TP は必ず単一の NVLink ドメイン内に収めてください。
-
インターリーブなしの PP では、パイプラインのバブルが大きくなります。可能であれば
virtual_pipeline_model_parallel_sizeを使用してください。 -
SP には
tensor_model_parallel_size > 1が必要です。TP なしで SP のみを有効にすると、設定エラーになります。 -
CP では
seq_length % (2 * context_parallel_size) == 0が必要です。 -
EP は MoE モデル専用です。dense モデルで
expert_model_parallel_sizeを設定しても、何も起こらないか、エラーになります。 -
上記のモデルサイズと並列化の表は、最初の目安です。メモリと通信を確認するため、必ず最初のイテレーションをプロファイルしてください。
-
CUDA_DEVICE_MAX_CONNECTIONSなどの関連する環境変数は、オーバーラップ設定と相互作用します。@skills/nemo-mbridge-perf-tp-dp-comm-overlap/SKILL.md を参照してください。 -
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 のレイアウトが表示される