Auto Recipe — Recipe Index & Recommendation
This skill indexes every shipped recipe and helps users pick the right starting
config, adjust parallelism, and avoid common pitfalls.
How to Use This Skill
- Ask the user for: model name/size, GPU count & type, training goal
(pretrain / SFT / PEFT), and sequence length (if non-default).
- Look up the best-match recipe in the index below.
- Recommend the recipe function name + entry-point command.
- Provide adjustment advice (parallelism resizing, batch tuning, pitfalls).
First Answer Checklist
When recommending recipes, always include these distinctions before the long
index details:
- Library recipes under
src/megatron/bridge/recipes/ are for functional
training and use scripts/training/run_recipe.py.
- Performance recipes under
scripts/performance/ are for upper-bound
throughput benchmarks. They use mock data and should not be presented as
production training recipes.
- For a first-time Bridge smoke test, recommend
llama3_8b_sft_config with
mock data via --dataset llm-pretrain-mock. Do not use llm-finetune for
the setup-only tryout unless the user specifically asks for an SFT data path.
- For normal SFT recommendations, use
--dataset llm-finetune; for pretrain
and mock validation recommendations, use --dataset llm-pretrain-mock.
- After the recipe and dataset, give the required resizing rules: TP must
divide
num_key_value_heads, keep TP within one node unless using
NVL72-class interconnect, enable SP when TP > 1, configure CP for long
context, DP is implicit, and reduce micro_batch_size first on OOM.
Entry Points
Library recipes (functional training)
# Pretrain with mock data
uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \
--recipe <recipe_function_name> \
--dataset llm-pretrain-mock
# SFT with SQuAD
uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \
--recipe <recipe_function_name> \
--dataset llm-finetune
# Override any field via CLI
uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \
--recipe llama3_8b_pretrain_config \
--dataset llm-pretrain-mock \
'model.tensor_model_parallel_size=2' \
'training.global_batch_size=64'
Performance recipes (throughput benchmarks)
python scripts/performance/run_script.py \
--recipe <model_family> \
--gpu_type h100 \
--num_gpus 64 \
--data mock
See the Performance Recipe Index for important caveats before using these for anything beyond throughput benchmarking.
Recipe Unification (Coming Soon — PR #2803)
PR #2803 is
unifying performance recipes into the same Python function format used by
library recipes. Key changes:
- Perf recipes move from
scripts/performance/configs/ → src/megatron/bridge/recipes/<family>/<model>_perf.py
- Each perf recipe becomes a self-contained Python function (e.g.
llama3_8b_h100_bf16_pretrain_config())
- The old
WorkloadBaseConfig → set_workload_base_configs → get_perf_optimized_recipe pipeline is removed
- Shared helpers:
_benchmark_common() (50 iters, timing, TE RNG), _perf_precision() (bf16 / fp8_cs / fp8_mx / nvfp4)
Why Python, not YAML? Previous YAML-based approaches had problems:
recipe logic was split across multiple indirection layers, configs were not
self-contained, and the two-level pipeline made maintenance and debugging
difficult. Python functions are explicit, greppable, and composable.
After #2803 lands, both library and perf recipes will be invocable through the
same run_recipe.py entry point.
Library Recipe Index
All recipes live under src/megatron/bridge/recipes/. Each function returns a
ConfigContainer with model, training, optimizer, and data settings.
Llama
| Recipe |
Mode |
TP |
PP |
CP |
SP |
GPUs (min) |
Seq Len |
llama2_7b_pretrain_config |
Pretrain |
2 |
1 |
— |
— |
2 |
4K |
llama3_8b_pretrain_config |
Pretrain |
2 |
1 |
— |
✓ |
2 |
8K |
llama3_8b_16k_pretrain_config |
Pretrain |
2 |
1 |
2 |
✓ |
4 |
16K |
llama3_8b_64k_pretrain_config |
Pretrain |
2 |
1 |
4 |
✓ |
8 |
64K |
llama3_8b_128k_pretrain_config |
Pretrain |
2 |
1 |
8 |
✓ |
16 |
128K |
llama3_70b_pretrain_config |
Pretrain |
8 |
4 |
— |
✓ |
32 |
8K |
llama3_70b_16k_pretrain_config |
Pretrain |
8 |
4 |
2 |
✓ |
64 |
16K |
llama3_70b_64k_pretrain_config |
Pretrain |
8 |
4 |
4 |
✓ |
128 |
64K |
llama31_405b_pretrain_config |
Pretrain |
8 |
16 |
— |
✓ |
128 |
8K |
llama3_8b_sft_config |
SFT |
2 |
1 |
— |
✓ |
2 |
8K |
llama3_70b_sft_config |
SFT |
4 |
4 |
— |
✓ |
16 |
8K |
llama31_405b_sft_config |
SFT |
8 |
8 |
— |
✓ |
64 |
8K |
llama3_8b_peft_config |
PEFT |
1 |
1 |
— |
— |
1 |
8K |
llama3_70b_peft_config |
PEFT |
2 |
4 |
— |
✓ |
8 |
8K |
llama31_405b_peft_config |
PEFT |
4 |
8 |
— |
✓ |
32 |
8K |
Qwen2 / Qwen2.5
| Recipe |
Mode |
TP |
PP |
Sizes |
qwen2_*_{pretrain,sft,peft}_config |
All |
1–8 |
1–4 |
500M, 1.5B, 7B, 14B, 32B, 72B |
qwen25_*_{pretrain,sft,peft}_config |
All |
1–8 |
1–4 |
500M, 1.5B, 3B, 7B, 14B, 32B, 72B |
Qwen3 (Dense)
| Recipe |
Mode |
TP |
PP |
CP |
Sizes |
qwen3_*_pretrain_config |
Pretrain |
1–8 |
1–2 |
— |
600M–32B |
qwen3_*_sft_config |
SFT |
1–8 |
1–2 |
— |
600M–32B |
qwen3_600m_sft_128k_config |
SFT |
1 |
1 |
8 |
600M (128K seq) |
qwen3_*_peft_config |
PEFT |
1 |
1 |
— |
600M–32B |
Qwen3 MoE
| Recipe |
Mode |
TP |
PP |
EP |
CP |
GPUs |
qwen3_30b_a3b_pretrain_config |
Pretrain |
1 |
1 |
8 |
— |
8 |
qwen3_30b_a3b_sft_config |
SFT |
1 |
1 |
8 |
— |
8 |
qwen3_30b_a3b_peft_config |
PEFT |
1 |
1 |
1 |
— |
1 |
qwen3_235b_a22b_pretrain_config |
Pretrain |
4 |
16 |
8 |
2 |
512+ |
qwen3_235b_a22b_sft_config |
SFT |
4 |
8 |
8 |
— |
256 |
qwen3_235b_a22b_peft_config |
PEFT |
1 |
4 |
4 |
— |
16 |
Qwen3-Next
| Recipe |
Mode |
TP |
PP |
EP |
qwen3_next_80b_a3b_pretrain_config |
Pretrain |
1 |
4 |
8 |
qwen3_next_80b_a3b_sft_config |
SFT |
1 |
2 |
8 |
qwen3_next_80b_a3b_peft_config |
PEFT |
1 |
1 |
4 |
DeepSeek
| Recipe |
Mode |
TP |
PP |
EP |
GPUs |
deepseek_v2_lite_pretrain_config |
Pretrain |
1 |
1 |
8 |
8 |
deepseek_v2_pretrain_config |
Pretrain |
1 |
4 |
32 |
128 |
deepseek_v3_pretrain_config |
Pretrain |
2 |
16 |
64 |
2048 |
deepseek_v3_pretrain_config_32nodes |
Pretrain |
2 |
8 |
32 |
256 |
GLM-4.5
| Recipe |
Mode |
TP |
PP |
EP |
GPUs |
glm45_355b_pretrain_config |
Pretrain |
2 |
8 |
16 |
256 |
glm45_air_106b_pretrain_config |
Pretrain |
1 |
4 |
8 |
32 |
glm45_355b_sft_config |
SFT |
2 |
8 |
16 |
256 |
glm45_air_106b_sft_config |
SFT |
1 |
4 |
8 |
32 |
glm45_355b_peft_config |
PEFT |
2 |
4 |
4 |
32 |
glm45_air_106b_peft_config |
PEFT |
1 |
2 |
4 |
8 |
Gemma
| Recipe |
Mode |
TP |
PP |
Sizes |
gemma2_*_{pretrain,sft,peft}_config |
All |
2–8 |
1–2 |
2B, 9B, 27B |
gemma3_1b_{pretrain,sft,peft}_config |
All |
1 |
1 |
1B (32K seq) |
NemotronH / Nemotron
| Recipe |
Mode |
TP |
PP |
EP |
Notes |
nemotronh_{4b,8b,47b,56b}_*_config |
P/S/PEFT |
1–8 |
1–4 |
— |
Dense SSM-hybrid |
nemotron_3_nano_*_config |
P/S/PEFT |
varies |
1 |
8 |
MoE + Mamba |
nemotron_3_super_*_config |
P/S/PEFT |
4 |
1 |
8 |
MoE + Mamba, ~40% CUDA graph gain |
nemotron_nano_{9b,12b}_v2_*_config |
P/S/PEFT |
varies |
1 |
— |
Dense |
Other Models
| Recipe |
Mode |
Notes |
moonlight_16b_{pretrain,sft,peft}_config |
All |
MoE EP=8 |
olmoe_7b_{pretrain,sft,peft}_config |
All |
MoE EP=8 |
ministral3_{3b,8b,14b}_{sft,peft}_config |
SFT/PEFT |
Dense |
gpt_oss_20b_*_config |
All |
MoE + FP8/MXFP8 variants |
gpt_oss_120b_*_config |
All |
MoE |
vanilla_gpt_pretrain_config |
Pretrain |
MLM/Bridge parity baseline |
gpt3_175b_pretrain_config |
Pretrain |
TP=4, PP=8, VP=6 |
kimi_k2_pretrain_config |
Pretrain |
1T MoE, TP=2 PP=16 EP=32 |
VLM Recipes
| Recipe |
Mode |
TP |
PP |
EP |
GPUs |
gemma3_vl_{4b,12b,27b}_{sft,peft}_config |
SFT/PEFT |
1–8 |
1–2 |
— |
1–16 |
qwen25_vl_{3b,7b,32b,72b}_{sft,peft}_config |
SFT/PEFT |
1–8 |
1–4 |
— |
1–32 |
qwen3_vl_{8b,30b_a3b,235b_a22b}_{sft,peft}_config |
SFT/PEFT |
1–4 |
1–8 |
1–32 |
1–512 |
qwen35_vl_*_{sft,peft}_config |
SFT/PEFT |
varies |
varies |
varies |
varies |
glm_45v_{sft,peft}_config |
SFT/PEFT |
1 |
8 |
4–16 |
64–512 |
nemotron_nano_v2_vl_12b_{sft,peft}_config |
SFT/PEFT |
2–4 |
1 |
— |
8 |
Diffusion Recipes
| Recipe |
Mode |
TP |
CP |
wan_1_3B_{pretrain,sft}_config |
P/SFT |
1 |
8 |
wan_14B_{pretrain,sft}_config |
P/SFT |
2 |
4 |
flux_12b_{pretrain,sft}_config |
P/SFT |
2 |
1 |
Performance Recipe Index
All perf recipes live under scripts/performance/. They are invoked via
run_script.py and use WorkloadBaseConfig presets per GPU type.
Important: Perf recipes are designed for upper-bound throughput
benchmarks, not production training. They run 50 iterations on mock
data by default. Throughput numbers are aspirational targets, not validated
convergence configs.
Llama 3 / 3.1
| Model |
GPUs |
GPU Types |
Key Features |
| Llama 3 8B |
8 |
H100, B200, B300, GB200, GB300, R100 |
CUDA graphs (local), FSDP on GB variants |
| Llama 3 70B |
64 |
H100, B200, B300, GB200, GB300 |
TP comm overlap (userbuffers), FSDP, CUDA graphs |
| Llama 3.1 405B |
128–1024 |
H100, B200, B300, GB200, GB300 |
TP+CP comm overlap (userbuffers), FSDP, heavy PP/VP |
SFT/LoRA variants also exist (e.g. 8B SFT with packed sequences, 70B SFT on 32 GPUs).
DeepSeek V3
| Model |
GPUs |
GPU Types |
Key Features |
| DeepSeek V3 (671B MoE) |
256–1024 |
H100, B200, B300, GB200, GB300 |
HybridEP dispatcher, MLA recompute, CUDA graphs (TE scoped) |
Qwen3 MoE
| Model |
GPUs |
GPU Types |
Key Features |
| Qwen3 30B-A3B |
8–16 |
H100, B200, B300, GB200, GB300 |
MoE alltoall/flex dispatcher |
| Qwen3 235B-A22B |
64–256 |
H100, B200, B300, GB200, GB300 |
TP comm overlap, CUDA graphs, MoE a2a overlap |
| Qwen3-Next 80B-A3B |
64–128 |
H100, B200, B300, GB200, GB300 |
EP 64–128 |
Qwen3-VL
| Model |
GPUs |
GPU Types |
Key Features |
| Qwen3-VL 30B-A3B |
8–16 |
H100, B200, B300, GB200, GB300 |
VLM + MoE |
| Qwen3-VL 235B-A22B |
64–256 |
H100, B200, B300, GB200, GB300 |
VLM + MoE, TP comm overlap |
Kimi K2
| Model |
GPUs |
GPU Types |
Key Features |
| Kimi K2 (1T MoE) |
256–1024 |
H100, B200, B300, GB200, GB300 |
Muon/Adam optimizer, HybridEP, pipeline layout helpers |
NemotronH
| Model |
GPUs |
GPU Types |
Key Features |
| Nemotron 3 Nano (30B MoE+Mamba) |
8–16 |
H100, B200, B300, GB200, GB300 |
TE CUDA graphs (attn+mamba+moe), HybridEP |
| Nemotron 3 Super |
64 |
H100, B200, B300, GB200, GB300 |
TE CUDA graphs, EP=64 |
| NemotronH 56B |
64 |
H100, B200, B300 |
TP=2–8, TE graphs (mamba+attn) |
GPT-OSS
| Model |
GPUs |
GPU Types |
Key Features |
| GPT-OSS 120B |
64 |
H100, B200, GB200 |
EP=64, HybridEP on GB200 |
Recommendation Decision Tree
User wants to train a model
│
├─ Know the model name?
│ ├─ Yes → Look up in Library Recipe Index above
│ │ ├─ Has a recipe for their size + mode? → Use it directly
│ │ └─ No exact match? → Use closest size, adjust parallelism
│ └─ No → Ask for model name, size, and HF model ID
│
├─ What's the training goal?
│ ├─ Pretrain → Use *_pretrain_config
│ ├─ SFT (full fine-tune) → Use *_sft_config
│ └─ PEFT (LoRA/DoRA) → Use *_peft_config (lowest GPU requirement)
│
├─ How many GPUs?
│ ├─ 1 GPU → Only PEFT recipes work (TP=1, PP=1)
│ ├─ 8 GPUs (1 node) → Most 8B–16B models, small MoE (EP=8)
│ ├─ 16–64 GPUs → 70B dense, medium MoE
│ └─ 128+ GPUs → 405B+, large MoE (DeepSeek V3, Kimi K2)
│
├─ Want throughput benchmarks?
│ ├─ Yes → Use perf recipes (scripts/performance/)
│ │ └─ ⚠️ These run on mock data for upper-bound perf only
│ └─ No → Use library recipes (scripts/training/run_recipe.py)
│
└─ Long context?
├─ > 8K → Need CP (context parallelism), check *_16k / *_64k / *_128k variants
└─ ≤ 8K → Default recipes work
Adjustment Advice (When Recommending)
Parallelism Resizing Rules
When the user's GPU count differs from the recipe default:
- TP must divide
num_key_value_heads (GQA constraint). E.g. if
num_key_value_heads=8, valid TP = {1, 2, 4, 8}.
- TP should stay within a single node (NVLink). TP > 8 requires
inter-node NVLink (e.g., GB200 NVL72).
- PP adds pipeline bubbles. Minimize PP; only increase when TP alone can't
fit the model. Use VP (virtual pipeline) to mitigate bubble overhead.
- EP doesn't reduce dense-layer memory. Only expert parameters shard with
EP. Shared attention/embeddings are replicated. For "OOM with MoE", increase
EP first, not TP.
- SP should be True whenever TP > 1. It eliminates redundant activation
copies and is essentially free.
- CP requires all-to-all or ring attention. Check
cp_comm_type. For
GQA models, a2a+p2p hierarchical CP allows CP > num_kv_heads.
- world_size = DP × TP × PP × CP × EP. DP is implicit. Make sure the
product of explicit parallelisms divides your total GPU count.
Batch Size Tuning
- Start with the recipe's
micro_batch_size. If OOM, reduce to 1.
global_batch_size determines learning dynamics. Scale with DP:
GBS = micro_batch_size × DP × gradient_accumulation_steps.
- For MoE,
micro_batch_size=1 is typical at scale.
Common Pitfalls to Warn About
| Pitfall |
Symptom |
Fix |
| TP > num_kv_heads |
Crash: "TP must divide num_query_groups" |
Reduce TP to a divisor of num_kv_heads |
| PP without VP |
Poor throughput (large bubble) |
Set virtual_pipeline_model_parallel_size |
| EP too low for large MoE |
OOM on expert params |
Increase EP; each expert lives on EP/num_experts ranks |
| CUDA graphs + packed sequences |
Assert: "CUDA graph accepts only Tensor inputs" |
Disable packing or use local full-iteration graphs |
| CUDA graphs + full recompute |
Assert: "full recompute only with full iteration CUDA graph" |
Disable recompute or switch to local impl |
use_te_rng_tracker not set |
Assert on provider init when CUDA graphs enabled |
Set cfg.model.use_te_rng_tracker = True and cfg.rng.te_rng_tracker = True |
| FSDP + TP > 1 on H100 |
Possible comm bottleneck |
Prefer FSDP with TP=1 or TP=2 on H100; FSDP shines on GB/B-series |
| Long context without CP |
OOM on activations |
Add CP=2/4/8; use *_16k, *_64k, or *_128k recipe variants |
MoE overlap_grad_reduce on H100 |
May hurt perf (False in many H100 presets) |
Set overlap_grad_reduce=False for MoE on H100 |
| VLM SFT missing image data |
Runs but produces garbage |
Provide actual multimodal dataset or use mock VLM data |
| Qwen35-VL MoE FSDP |
Tested on Blackwell only |
May not work on H100; validate first |
Recipe Override Examples
# Scale Llama3 8B from 2 GPUs to 8 GPUs (increase DP)
uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \
--recipe llama3_8b_pretrain_config \
--dataset llm-pretrain-mock
# Reduce parallelism for Qwen3-MoE 30B to fit on 4 GPUs
uv run python -m torch.distributed.run --nproc_per_node=4 scripts/training/run_recipe.py \
--recipe qwen3_30b_a3b_sft_config \
--dataset llm-finetune \
'model.expert_model_parallel_size=4'
# Add long context to an existing recipe
uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \
--recipe llama3_8b_pretrain_config \
--dataset llm-pretrain-mock \
'model.seq_length=32768' \
'model.context_parallel_size=4'
# Enable CUDA graphs on any recipe
uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \
--recipe qwen3_30b_a3b_pretrain_config \
--dataset llm-pretrain-mock \
'model.cuda_graph_impl=transformer_engine' \
'model.cuda_graph_scope=[attn,moe_router,moe_preprocess]' \
'model.use_te_rng_tracker=True' \
'rng.te_rng_tracker=True'
Quick Reference: Which Recipe for My Situation?
| I want to... |
Start with |
GPUs needed |
| Try Bridge for the first time |
llama3_8b_sft_config + mock data |
2 |
| Fine-tune a 7-8B model |
llama3_8b_sft_config or qwen3_8b_sft_config |
2–8 |
| LoRA on 1 GPU |
llama3_8b_peft_config or qwen3_8b_peft_config |
1 |
| Pretrain a dense 70B |
llama3_70b_pretrain_config |
32–64 |
| Train a small MoE |
qwen3_30b_a3b_pretrain_config |
8 |
| Train a large MoE (235B+) |
qwen3_235b_a22b_pretrain_config |
256–512 |
| Benchmark throughput |
Perf recipes via run_script.py |
Varies |
| Long-context training |
llama3_8b_128k_pretrain_config or add CP override |
16+ |
| VLM fine-tuning |
qwen3_vl_8b_sft_config or gemma3_vl_*_sft_config |
4–8 |
| Diffusion training |
wan_1_3B_pretrain_config or flux_12b_pretrain_config |
8 |
Code Anchors
| What |
Path |
| Library recipes root |
src/megatron/bridge/recipes/ |
Recipe __init__.py (all exports) |
src/megatron/bridge/recipes/__init__.py |
| Common recipe helpers |
src/megatron/bridge/recipes/common.py |
| Training entry point |
scripts/training/run_recipe.py |
| Perf recipes root |
scripts/performance/ |
| Perf entry point |
scripts/performance/run_script.py |
| Perf workload configs |
scripts/performance/configs/<family>/ |
| Perf overrides (benchmark defaults) |
scripts/performance/utils/overrides.py |
1---2name: nemo-mbridge-recipe-recommender3description: Recommend and customize Megatron Bridge recipes for a user's model, GPU count, and training goal. Indexes library recipes (pretrain/SFT/PEFT) and performance recipes.4license: Apache-2.05---67# Auto Recipe — Recipe Index & Recommendation89This skill indexes every shipped recipe and helps users pick the right starting10config, adjust parallelism, and avoid common pitfalls.1112## How to Use This Skill13141. Ask the user for: **model name/size**, **GPU count & type**, **training goal**15 (pretrain / SFT / PEFT), and **sequence length** (if non-default).162. Look up the best-match recipe in the index below.173. Recommend the recipe function name + entry-point command.184. Provide adjustment advice (parallelism resizing, batch tuning, pitfalls).1920## First Answer Checklist2122When recommending recipes, always include these distinctions before the long23index details:24251. **Library recipes** under `src/megatron/bridge/recipes/` are for functional26 training and use `scripts/training/run_recipe.py`.272. **Performance recipes** under `scripts/performance/` are for upper-bound28 throughput benchmarks. They use mock data and should not be presented as29 production training recipes.303. For a first-time Bridge smoke test, recommend `llama3_8b_sft_config` with31 mock data via `--dataset llm-pretrain-mock`. Do not use `llm-finetune` for32 the setup-only tryout unless the user specifically asks for an SFT data path.334. For normal SFT recommendations, use `--dataset llm-finetune`; for pretrain34 and mock validation recommendations, use `--dataset llm-pretrain-mock`.355. After the recipe and dataset, give the required resizing rules: TP must36 divide `num_key_value_heads`, keep TP within one node unless using37 NVL72-class interconnect, enable SP when TP > 1, configure CP for long38 context, DP is implicit, and reduce `micro_batch_size` first on OOM.3940---4142## Entry Points4344### Library recipes (functional training)4546```bash47# Pretrain with mock data48uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \49 --recipe <recipe_function_name> \50 --dataset llm-pretrain-mock5152# SFT with SQuAD53uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \54 --recipe <recipe_function_name> \55 --dataset llm-finetune5657# Override any field via CLI58uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \59 --recipe llama3_8b_pretrain_config \60 --dataset llm-pretrain-mock \61 'model.tensor_model_parallel_size=2' \62 'training.global_batch_size=64'63```6465### Performance recipes (throughput benchmarks)6667```bash68python scripts/performance/run_script.py \69 --recipe <model_family> \70 --gpu_type h100 \71 --num_gpus 64 \72 --data mock73```7475See the Performance Recipe Index for important caveats before using these for anything beyond throughput benchmarking.7677---7879## Recipe Unification (Coming Soon — PR #2803)8081PR [#2803](https://github.com/NVIDIA-NeMo/Megatron-Bridge/pull/2803) is82unifying performance recipes into the same **Python function** format used by83library recipes. Key changes:8485- Perf recipes move from `scripts/performance/configs/` → `src/megatron/bridge/recipes/<family>/<model>_perf.py`86- Each perf recipe becomes a **self-contained Python function** (e.g. `llama3_8b_h100_bf16_pretrain_config()`)87- The old `WorkloadBaseConfig` → `set_workload_base_configs` → `get_perf_optimized_recipe` pipeline is removed88- Shared helpers: `_benchmark_common()` (50 iters, timing, TE RNG), `_perf_precision()` (bf16 / fp8_cs / fp8_mx / nvfp4)8990**Why Python, not YAML?** Previous YAML-based approaches had problems:91recipe logic was split across multiple indirection layers, configs were not92self-contained, and the two-level pipeline made maintenance and debugging93difficult. Python functions are explicit, greppable, and composable.9495After #2803 lands, both library and perf recipes will be invocable through the96same `run_recipe.py` entry point.9798---99100## Library Recipe Index101102All recipes live under `src/megatron/bridge/recipes/`. Each function returns a103`ConfigContainer` with model, training, optimizer, and data settings.104105### Llama106107| Recipe | Mode | TP | PP | CP | SP | GPUs (min) | Seq Len |108|--------|------|----|----|----|----|------------|---------|109| `llama2_7b_pretrain_config` | Pretrain | 2 | 1 | — | — | 2 | 4K |110| `llama3_8b_pretrain_config` | Pretrain | 2 | 1 | — | ✓ | 2 | 8K |111| `llama3_8b_16k_pretrain_config` | Pretrain | 2 | 1 | 2 | ✓ | 4 | 16K |112| `llama3_8b_64k_pretrain_config` | Pretrain | 2 | 1 | 4 | ✓ | 8 | 64K |113| `llama3_8b_128k_pretrain_config` | Pretrain | 2 | 1 | 8 | ✓ | 16 | 128K |114| `llama3_70b_pretrain_config` | Pretrain | 8 | 4 | — | ✓ | 32 | 8K |115| `llama3_70b_16k_pretrain_config` | Pretrain | 8 | 4 | 2 | ✓ | 64 | 16K |116| `llama3_70b_64k_pretrain_config` | Pretrain | 8 | 4 | 4 | ✓ | 128 | 64K |117| `llama31_405b_pretrain_config` | Pretrain | 8 | 16 | — | ✓ | 128 | 8K |118| `llama3_8b_sft_config` | SFT | 2 | 1 | — | ✓ | 2 | 8K |119| `llama3_70b_sft_config` | SFT | 4 | 4 | — | ✓ | 16 | 8K |120| `llama31_405b_sft_config` | SFT | 8 | 8 | — | ✓ | 64 | 8K |121| `llama3_8b_peft_config` | PEFT | 1 | 1 | — | — | 1 | 8K |122| `llama3_70b_peft_config` | PEFT | 2 | 4 | — | ✓ | 8 | 8K |123| `llama31_405b_peft_config` | PEFT | 4 | 8 | — | ✓ | 32 | 8K |124125### Qwen2 / Qwen2.5126127| Recipe | Mode | TP | PP | Sizes |128|--------|------|----|----|-------|129| `qwen2_*_{pretrain,sft,peft}_config` | All | 1–8 | 1–4 | 500M, 1.5B, 7B, 14B, 32B, 72B |130| `qwen25_*_{pretrain,sft,peft}_config` | All | 1–8 | 1–4 | 500M, 1.5B, 3B, 7B, 14B, 32B, 72B |131132### Qwen3 (Dense)133134| Recipe | Mode | TP | PP | CP | Sizes |135|--------|------|----|----|-----|-------|136| `qwen3_*_pretrain_config` | Pretrain | 1–8 | 1–2 | — | 600M–32B |137| `qwen3_*_sft_config` | SFT | 1–8 | 1–2 | — | 600M–32B |138| `qwen3_600m_sft_128k_config` | SFT | 1 | 1 | 8 | 600M (128K seq) |139| `qwen3_*_peft_config` | PEFT | 1 | 1 | — | 600M–32B |140141### Qwen3 MoE142143| Recipe | Mode | TP | PP | EP | CP | GPUs |144|--------|------|----|----|----|----|------|145| `qwen3_30b_a3b_pretrain_config` | Pretrain | 1 | 1 | 8 | — | 8 |146| `qwen3_30b_a3b_sft_config` | SFT | 1 | 1 | 8 | — | 8 |147| `qwen3_30b_a3b_peft_config` | PEFT | 1 | 1 | 1 | — | 1 |148| `qwen3_235b_a22b_pretrain_config` | Pretrain | 4 | 16 | 8 | 2 | 512+ |149| `qwen3_235b_a22b_sft_config` | SFT | 4 | 8 | 8 | — | 256 |150| `qwen3_235b_a22b_peft_config` | PEFT | 1 | 4 | 4 | — | 16 |151152### Qwen3-Next153154| Recipe | Mode | TP | PP | EP |155|--------|------|----|----|-----|156| `qwen3_next_80b_a3b_pretrain_config` | Pretrain | 1 | 4 | 8 |157| `qwen3_next_80b_a3b_sft_config` | SFT | 1 | 2 | 8 |158| `qwen3_next_80b_a3b_peft_config` | PEFT | 1 | 1 | 4 |159160### DeepSeek161162| Recipe | Mode | TP | PP | EP | GPUs |163|--------|------|----|----|-----|------|164| `deepseek_v2_lite_pretrain_config` | Pretrain | 1 | 1 | 8 | 8 |165| `deepseek_v2_pretrain_config` | Pretrain | 1 | 4 | 32 | 128 |166| `deepseek_v3_pretrain_config` | Pretrain | 2 | 16 | 64 | 2048 |167| `deepseek_v3_pretrain_config_32nodes` | Pretrain | 2 | 8 | 32 | 256 |168169### GLM-4.5170171| Recipe | Mode | TP | PP | EP | GPUs |172|--------|------|----|----|-----|------|173| `glm45_355b_pretrain_config` | Pretrain | 2 | 8 | 16 | 256 |174| `glm45_air_106b_pretrain_config` | Pretrain | 1 | 4 | 8 | 32 |175| `glm45_355b_sft_config` | SFT | 2 | 8 | 16 | 256 |176| `glm45_air_106b_sft_config` | SFT | 1 | 4 | 8 | 32 |177| `glm45_355b_peft_config` | PEFT | 2 | 4 | 4 | 32 |178| `glm45_air_106b_peft_config` | PEFT | 1 | 2 | 4 | 8 |179180### Gemma181182| Recipe | Mode | TP | PP | Sizes |183|--------|------|----|----|-------|184| `gemma2_*_{pretrain,sft,peft}_config` | All | 2–8 | 1–2 | 2B, 9B, 27B |185| `gemma3_1b_{pretrain,sft,peft}_config` | All | 1 | 1 | 1B (32K seq) |186187### NemotronH / Nemotron188189| Recipe | Mode | TP | PP | EP | Notes |190|--------|------|----|----|-----|-------|191| `nemotronh_{4b,8b,47b,56b}_*_config` | P/S/PEFT | 1–8 | 1–4 | — | Dense SSM-hybrid |192| `nemotron_3_nano_*_config` | P/S/PEFT | varies | 1 | 8 | MoE + Mamba |193| `nemotron_3_super_*_config` | P/S/PEFT | 4 | 1 | 8 | MoE + Mamba, ~40% CUDA graph gain |194| `nemotron_nano_{9b,12b}_v2_*_config` | P/S/PEFT | varies | 1 | — | Dense |195196### Other Models197198| Recipe | Mode | Notes |199|--------|------|-------|200| `moonlight_16b_{pretrain,sft,peft}_config` | All | MoE EP=8 |201| `olmoe_7b_{pretrain,sft,peft}_config` | All | MoE EP=8 |202| `ministral3_{3b,8b,14b}_{sft,peft}_config` | SFT/PEFT | Dense |203| `gpt_oss_20b_*_config` | All | MoE + FP8/MXFP8 variants |204| `gpt_oss_120b_*_config` | All | MoE |205| `vanilla_gpt_pretrain_config` | Pretrain | MLM/Bridge parity baseline |206| `gpt3_175b_pretrain_config` | Pretrain | TP=4, PP=8, VP=6 |207| `kimi_k2_pretrain_config` | Pretrain | 1T MoE, TP=2 PP=16 EP=32 |208209### VLM Recipes210211| Recipe | Mode | TP | PP | EP | GPUs |212|--------|------|----|----|-----|------|213| `gemma3_vl_{4b,12b,27b}_{sft,peft}_config` | SFT/PEFT | 1–8 | 1–2 | — | 1–16 |214| `qwen25_vl_{3b,7b,32b,72b}_{sft,peft}_config` | SFT/PEFT | 1–8 | 1–4 | — | 1–32 |215| `qwen3_vl_{8b,30b_a3b,235b_a22b}_{sft,peft}_config` | SFT/PEFT | 1–4 | 1–8 | 1–32 | 1–512 |216| `qwen35_vl_*_{sft,peft}_config` | SFT/PEFT | varies | varies | varies | varies |217| `glm_45v_{sft,peft}_config` | SFT/PEFT | 1 | 8 | 4–16 | 64–512 |218| `nemotron_nano_v2_vl_12b_{sft,peft}_config` | SFT/PEFT | 2–4 | 1 | — | 8 |219220### Diffusion Recipes221222| Recipe | Mode | TP | CP |223|--------|------|----|----|224| `wan_1_3B_{pretrain,sft}_config` | P/SFT | 1 | 8 |225| `wan_14B_{pretrain,sft}_config` | P/SFT | 2 | 4 |226| `flux_12b_{pretrain,sft}_config` | P/SFT | 2 | 1 |227228---229230## Performance Recipe Index231232All perf recipes live under `scripts/performance/`. They are invoked via233`run_script.py` and use `WorkloadBaseConfig` presets per GPU type.234235> **Important:** Perf recipes are designed for **upper-bound throughput236> benchmarks**, not production training. They run **50 iterations** on **mock237> data** by default. Throughput numbers are aspirational targets, not validated238> convergence configs.239240### Llama 3 / 3.1241242| Model | GPUs | GPU Types | Key Features |243|-------|------|-----------|--------------|244| Llama 3 8B | 8 | H100, B200, B300, GB200, GB300, R100 | CUDA graphs (local), FSDP on GB variants |245| Llama 3 70B | 64 | H100, B200, B300, GB200, GB300 | TP comm overlap (userbuffers), FSDP, CUDA graphs |246| Llama 3.1 405B | 128–1024 | H100, B200, B300, GB200, GB300 | TP+CP comm overlap (userbuffers), FSDP, heavy PP/VP |247248SFT/LoRA variants also exist (e.g. 8B SFT with packed sequences, 70B SFT on 32 GPUs).249250### DeepSeek V3251252| Model | GPUs | GPU Types | Key Features |253|-------|------|-----------|--------------|254| DeepSeek V3 (671B MoE) | 256–1024 | H100, B200, B300, GB200, GB300 | HybridEP dispatcher, MLA recompute, CUDA graphs (TE scoped) |255256### Qwen3 MoE257258| Model | GPUs | GPU Types | Key Features |259|-------|------|-----------|--------------|260| Qwen3 30B-A3B | 8–16 | H100, B200, B300, GB200, GB300 | MoE alltoall/flex dispatcher |261| Qwen3 235B-A22B | 64–256 | H100, B200, B300, GB200, GB300 | TP comm overlap, CUDA graphs, MoE a2a overlap |262| Qwen3-Next 80B-A3B | 64–128 | H100, B200, B300, GB200, GB300 | EP 64–128 |263264### Qwen3-VL265266| Model | GPUs | GPU Types | Key Features |267|-------|------|-----------|--------------|268| Qwen3-VL 30B-A3B | 8–16 | H100, B200, B300, GB200, GB300 | VLM + MoE |269| Qwen3-VL 235B-A22B | 64–256 | H100, B200, B300, GB200, GB300 | VLM + MoE, TP comm overlap |270271### Kimi K2272273| Model | GPUs | GPU Types | Key Features |274|-------|------|-----------|--------------|275| Kimi K2 (1T MoE) | 256–1024 | H100, B200, B300, GB200, GB300 | Muon/Adam optimizer, HybridEP, pipeline layout helpers |276277### NemotronH278279| Model | GPUs | GPU Types | Key Features |280|-------|------|-----------|--------------|281| Nemotron 3 Nano (30B MoE+Mamba) | 8–16 | H100, B200, B300, GB200, GB300 | TE CUDA graphs (attn+mamba+moe), HybridEP |282| Nemotron 3 Super | 64 | H100, B200, B300, GB200, GB300 | TE CUDA graphs, EP=64 |283| NemotronH 56B | 64 | H100, B200, B300 | TP=2–8, TE graphs (mamba+attn) |284285### GPT-OSS286287| Model | GPUs | GPU Types | Key Features |288|-------|------|-----------|--------------|289| GPT-OSS 120B | 64 | H100, B200, GB200 | EP=64, HybridEP on GB200 |290291---292293## Recommendation Decision Tree294295```text296User wants to train a model297│298├─ Know the model name?299│ ├─ Yes → Look up in Library Recipe Index above300│ │ ├─ Has a recipe for their size + mode? → Use it directly301│ │ └─ No exact match? → Use closest size, adjust parallelism302│ └─ No → Ask for model name, size, and HF model ID303│304├─ What's the training goal?305│ ├─ Pretrain → Use *_pretrain_config306│ ├─ SFT (full fine-tune) → Use *_sft_config307│ └─ PEFT (LoRA/DoRA) → Use *_peft_config (lowest GPU requirement)308│309├─ How many GPUs?310│ ├─ 1 GPU → Only PEFT recipes work (TP=1, PP=1)311│ ├─ 8 GPUs (1 node) → Most 8B–16B models, small MoE (EP=8)312│ ├─ 16–64 GPUs → 70B dense, medium MoE313│ └─ 128+ GPUs → 405B+, large MoE (DeepSeek V3, Kimi K2)314│315├─ Want throughput benchmarks?316│ ├─ Yes → Use perf recipes (scripts/performance/)317│ │ └─ ⚠️ These run on mock data for upper-bound perf only318│ └─ No → Use library recipes (scripts/training/run_recipe.py)319│320└─ Long context?321 ├─ > 8K → Need CP (context parallelism), check *_16k / *_64k / *_128k variants322 └─ ≤ 8K → Default recipes work323```324325---326327## Adjustment Advice (When Recommending)328329### Parallelism Resizing Rules330331When the user's GPU count differs from the recipe default:3323331. **TP must divide `num_key_value_heads`** (GQA constraint). E.g. if334 `num_key_value_heads=8`, valid TP = {1, 2, 4, 8}.3352. **TP should stay within a single node** (NVLink). TP > 8 requires336 inter-node NVLink (e.g., GB200 NVL72).3373. **PP adds pipeline bubbles.** Minimize PP; only increase when TP alone can't338 fit the model. Use VP (virtual pipeline) to mitigate bubble overhead.3394. **EP doesn't reduce dense-layer memory.** Only expert parameters shard with340 EP. Shared attention/embeddings are replicated. For "OOM with MoE", increase341 EP first, not TP.3425. **SP should be True whenever TP > 1.** It eliminates redundant activation343 copies and is essentially free.3446. **CP requires all-to-all or ring attention.** Check `cp_comm_type`. For345 GQA models, `a2a+p2p` hierarchical CP allows CP > num_kv_heads.3467. **world_size = DP × TP × PP × CP × EP.** DP is implicit. Make sure the347 product of explicit parallelisms divides your total GPU count.348349### Batch Size Tuning350351- Start with the recipe's `micro_batch_size`. If OOM, reduce to 1.352- `global_batch_size` determines learning dynamics. Scale with DP:353 `GBS = micro_batch_size × DP × gradient_accumulation_steps`.354- For MoE, `micro_batch_size=1` is typical at scale.355356### Common Pitfalls to Warn About357358| Pitfall | Symptom | Fix |359|---------|---------|-----|360| TP > num_kv_heads | Crash: "TP must divide num_query_groups" | Reduce TP to a divisor of num_kv_heads |361| PP without VP | Poor throughput (large bubble) | Set `virtual_pipeline_model_parallel_size` |362| EP too low for large MoE | OOM on expert params | Increase EP; each expert lives on EP/num_experts ranks |363| CUDA graphs + packed sequences | Assert: "CUDA graph accepts only Tensor inputs" | Disable packing or use `local` full-iteration graphs |364| CUDA graphs + full recompute | Assert: "full recompute only with full iteration CUDA graph" | Disable recompute or switch to `local` impl |365| `use_te_rng_tracker` not set | Assert on provider init when CUDA graphs enabled | Set `cfg.model.use_te_rng_tracker = True` and `cfg.rng.te_rng_tracker = True` |366| FSDP + TP > 1 on H100 | Possible comm bottleneck | Prefer FSDP with TP=1 or TP=2 on H100; FSDP shines on GB/B-series |367| Long context without CP | OOM on activations | Add CP=2/4/8; use `*_16k`, `*_64k`, or `*_128k` recipe variants |368| MoE `overlap_grad_reduce` on H100 | May hurt perf (False in many H100 presets) | Set `overlap_grad_reduce=False` for MoE on H100 |369| VLM SFT missing image data | Runs but produces garbage | Provide actual multimodal dataset or use mock VLM data |370| Qwen35-VL MoE FSDP | Tested on Blackwell only | May not work on H100; validate first |371372### Recipe Override Examples373374```bash375# Scale Llama3 8B from 2 GPUs to 8 GPUs (increase DP)376uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \377 --recipe llama3_8b_pretrain_config \378 --dataset llm-pretrain-mock379380# Reduce parallelism for Qwen3-MoE 30B to fit on 4 GPUs381uv run python -m torch.distributed.run --nproc_per_node=4 scripts/training/run_recipe.py \382 --recipe qwen3_30b_a3b_sft_config \383 --dataset llm-finetune \384 'model.expert_model_parallel_size=4'385386# Add long context to an existing recipe387uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \388 --recipe llama3_8b_pretrain_config \389 --dataset llm-pretrain-mock \390 'model.seq_length=32768' \391 'model.context_parallel_size=4'392393# Enable CUDA graphs on any recipe394uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \395 --recipe qwen3_30b_a3b_pretrain_config \396 --dataset llm-pretrain-mock \397 'model.cuda_graph_impl=transformer_engine' \398 'model.cuda_graph_scope=[attn,moe_router,moe_preprocess]' \399 'model.use_te_rng_tracker=True' \400 'rng.te_rng_tracker=True'401```402403---404405## Quick Reference: Which Recipe for My Situation?406407| I want to... | Start with | GPUs needed |408|---|---|---|409| Try Bridge for the first time | `llama3_8b_sft_config` + mock data | 2 |410| Fine-tune a 7-8B model | `llama3_8b_sft_config` or `qwen3_8b_sft_config` | 2–8 |411| LoRA on 1 GPU | `llama3_8b_peft_config` or `qwen3_8b_peft_config` | 1 |412| Pretrain a dense 70B | `llama3_70b_pretrain_config` | 32–64 |413| Train a small MoE | `qwen3_30b_a3b_pretrain_config` | 8 |414| Train a large MoE (235B+) | `qwen3_235b_a22b_pretrain_config` | 256–512 |415| Benchmark throughput | Perf recipes via `run_script.py` | Varies |416| Long-context training | `llama3_8b_128k_pretrain_config` or add CP override | 16+ |417| VLM fine-tuning | `qwen3_vl_8b_sft_config` or `gemma3_vl_*_sft_config` | 4–8 |418| Diffusion training | `wan_1_3B_pretrain_config` or `flux_12b_pretrain_config` | 8 |419420---421422## Code Anchors423424| What | Path |425|------|------|426| Library recipes root | `src/megatron/bridge/recipes/` |427| Recipe `__init__.py` (all exports) | `src/megatron/bridge/recipes/__init__.py` |428| Common recipe helpers | `src/megatron/bridge/recipes/common.py` |429| Training entry point | `scripts/training/run_recipe.py` |430| Perf recipes root | `scripts/performance/` |431| Perf entry point | `scripts/performance/run_script.py` |432| Perf workload configs | `scripts/performance/configs/<family>/` |433| Perf overrides (benchmark defaults) | `scripts/performance/utils/overrides.py` |