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.
Perf Recipe Layout
Performance recipes use the same Python function format as library recipes,
but live in a dedicated namespace for throughput benchmarking:
- Perf recipes live in
src/megatron/bridge/perf_recipes/<family>/<hardware>/<model>.py
- Each perf recipe is a self-contained Python function (e.g.
llama3_8b_pretrain_8gpu_h100_bf16_config())
- Recipe names encode model, task, GPU count, hardware, precision, and optional variant
scripts/performance/utils/utils.py derives compatibility WorkloadBaseConfig views from the flat recipe itself
- 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.
The training launcher can invoke both library recipes and perf recipes without
the removed legacy config package.
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
Perf recipe source lives under src/megatron/bridge/perf_recipes/. The
performance launcher in scripts/performance/ resolves those flat recipe names
and derives compatibility workload views from the selected flat recipe when
legacy helper paths still need them.
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 |
src/megatron/bridge/perf_recipes/ |
| Perf entry point |
scripts/performance/run_script.py |
| Perf recipe helpers |
scripts/performance/utils/utils.py |
| 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---6
7# Auto Recipe — Recipe Index & Recommendation
8
9This skill indexes every shipped recipe and helps users pick the right starting
10config, adjust parallelism, and avoid common pitfalls.
11
12## How to Use This Skill
13
141. 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).
19
20## First Answer Checklist
21
22When recommending recipes, always include these distinctions before the long
23index details:
24
251. **Library recipes** under `src/megatron/bridge/recipes/` are for functional
26 training and use `scripts/training/run_recipe.py`.
272. **Performance recipes** under `scripts/performance/` are for upper-bound
28 throughput benchmarks. They use mock data and should not be presented as
29 production training recipes.
303. For a first-time Bridge smoke test, recommend `llama3_8b_sft_config` with
31 mock data via `--dataset llm-pretrain-mock`. Do not use `llm-finetune` for
32 the setup-only tryout unless the user specifically asks for an SFT data path.
334. For normal SFT recommendations, use `--dataset llm-finetune`; for pretrain
34 and mock validation recommendations, use `--dataset llm-pretrain-mock`.
355. After the recipe and dataset, give the required resizing rules: TP must
36 divide `num_key_value_heads`, keep TP within one node unless using
37 NVL72-class interconnect, enable SP when TP > 1, configure CP for long
38 context, DP is implicit, and reduce `micro_batch_size` first on OOM.
39
40---
41
42## Entry Points
43
44### Library recipes (functional training)
45
46```bash
47# Pretrain with mock data
48uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \
49 --recipe <recipe_function_name> \
50 --dataset llm-pretrain-mock
51
52# SFT with SQuAD
53uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \
54 --recipe <recipe_function_name> \
55 --dataset llm-finetune
56
57# Override any field via CLI
58uv 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```
64
65### Performance recipes (throughput benchmarks)
66
67```bash
68python scripts/performance/run_script.py \
69 --recipe <model_family> \
70 --gpu_type h100 \
71 --num_gpus 64 \
72 --data mock
73```
74
75See the Performance Recipe Index for important caveats before using these for anything beyond throughput benchmarking.
76
77---
78
79## Perf Recipe Layout
80
81Performance recipes use the same **Python function** format as library recipes,
82but live in a dedicated namespace for throughput benchmarking:
83
84- Perf recipes live in `src/megatron/bridge/perf_recipes/<family>/<hardware>/<model>.py`
85- Each perf recipe is a **self-contained Python function** (e.g. `llama3_8b_pretrain_8gpu_h100_bf16_config()`)
86- Recipe names encode model, task, GPU count, hardware, precision, and optional variant
87- `scripts/performance/utils/utils.py` derives compatibility `WorkloadBaseConfig` views from the flat recipe itself
88- Shared helpers: `_benchmark_common()` (50 iters, timing, TE RNG), `_perf_precision()` (bf16 / fp8_cs / fp8_mx / nvfp4)
89
90**Why Python, not YAML?** Previous YAML-based approaches had problems:
91recipe logic was split across multiple indirection layers, configs were not
92self-contained, and the two-level pipeline made maintenance and debugging
93difficult. Python functions are explicit, greppable, and composable.
94
95The training launcher can invoke both library recipes and perf recipes without
96the removed legacy config package.
97
98---
99
100## Library Recipe Index
101
102All recipes live under `src/megatron/bridge/recipes/`. Each function returns a
103`ConfigContainer` with model, training, optimizer, and data settings.
104
105### Llama
106
107| 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 |
124
125### Qwen2 / Qwen2.5
126
127| 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 |
131
132### Qwen3 (Dense)
133
134| 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 |
140
141### Qwen3 MoE
142
143| 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 |
151
152### Qwen3-Next
153
154| 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 |
159
160### DeepSeek
161
162| 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 |
168
169### GLM-4.5
170
171| 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 |
179
180### Gemma
181
182| 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) |
186
187### NemotronH / Nemotron
188
189| 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 |
195
196### Other Models
197
198| 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 |
208
209### VLM Recipes
210
211| 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 |
219
220### Diffusion Recipes
221
222| 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 |
227
228---
229
230## Performance Recipe Index
231
232Perf recipe source lives under `src/megatron/bridge/perf_recipes/`. The
233performance launcher in `scripts/performance/` resolves those flat recipe names
234and derives compatibility workload views from the selected flat recipe when
235legacy helper paths still need them.
236
237> **Important:** Perf recipes are designed for **upper-bound throughput
238> benchmarks**, not production training. They run **50 iterations** on **mock
239> data** by default. Throughput numbers are aspirational targets, not validated
240> convergence configs.
241
242### Llama 3 / 3.1
243
244| Model | GPUs | GPU Types | Key Features |
245|-------|------|-----------|--------------|
246| Llama 3 8B | 8 | H100, B200, B300, GB200, GB300, R100 | CUDA graphs (local), FSDP on GB variants |
247| Llama 3 70B | 64 | H100, B200, B300, GB200, GB300 | TP comm overlap (userbuffers), FSDP, CUDA graphs |
248| Llama 3.1 405B | 128–1024 | H100, B200, B300, GB200, GB300 | TP+CP comm overlap (userbuffers), FSDP, heavy PP/VP |
249
250SFT/LoRA variants also exist (e.g. 8B SFT with packed sequences, 70B SFT on 32 GPUs).
251
252### DeepSeek V3
253
254| Model | GPUs | GPU Types | Key Features |
255|-------|------|-----------|--------------|
256| DeepSeek V3 (671B MoE) | 256–1024 | H100, B200, B300, GB200, GB300 | HybridEP dispatcher, MLA recompute, CUDA graphs (TE scoped) |
257
258### Qwen3 MoE
259
260| Model | GPUs | GPU Types | Key Features |
261|-------|------|-----------|--------------|
262| Qwen3 30B-A3B | 8–16 | H100, B200, B300, GB200, GB300 | MoE alltoall/flex dispatcher |
263| Qwen3 235B-A22B | 64–256 | H100, B200, B300, GB200, GB300 | TP comm overlap, CUDA graphs, MoE a2a overlap |
264| Qwen3-Next 80B-A3B | 64–128 | H100, B200, B300, GB200, GB300 | EP 64–128 |
265
266### Qwen3-VL
267
268| Model | GPUs | GPU Types | Key Features |
269|-------|------|-----------|--------------|
270| Qwen3-VL 30B-A3B | 8–16 | H100, B200, B300, GB200, GB300 | VLM + MoE |
271| Qwen3-VL 235B-A22B | 64–256 | H100, B200, B300, GB200, GB300 | VLM + MoE, TP comm overlap |
272
273### Kimi K2
274
275| Model | GPUs | GPU Types | Key Features |
276|-------|------|-----------|--------------|
277| Kimi K2 (1T MoE) | 256–1024 | H100, B200, B300, GB200, GB300 | Muon/Adam optimizer, HybridEP, pipeline layout helpers |
278
279### NemotronH
280
281| Model | GPUs | GPU Types | Key Features |
282|-------|------|-----------|--------------|
283| Nemotron 3 Nano (30B MoE+Mamba) | 8–16 | H100, B200, B300, GB200, GB300 | TE CUDA graphs (attn+mamba+moe), HybridEP |
284| Nemotron 3 Super | 64 | H100, B200, B300, GB200, GB300 | TE CUDA graphs, EP=64 |
285| NemotronH 56B | 64 | H100, B200, B300 | TP=2–8, TE graphs (mamba+attn) |
286
287### GPT-OSS
288
289| Model | GPUs | GPU Types | Key Features |
290|-------|------|-----------|--------------|
291| GPT-OSS 120B | 64 | H100, B200, GB200 | EP=64, HybridEP on GB200 |
292
293---
294
295## Recommendation Decision Tree
296
297```text
298User wants to train a model
299│
300├─ Know the model name?
301│ ├─ Yes → Look up in Library Recipe Index above
302│ │ ├─ Has a recipe for their size + mode? → Use it directly
303│ │ └─ No exact match? → Use closest size, adjust parallelism
304│ └─ No → Ask for model name, size, and HF model ID
305│
306├─ What's the training goal?
307│ ├─ Pretrain → Use *_pretrain_config
308│ ├─ SFT (full fine-tune) → Use *_sft_config
309│ └─ PEFT (LoRA/DoRA) → Use *_peft_config (lowest GPU requirement)
310│
311├─ How many GPUs?
312│ ├─ 1 GPU → Only PEFT recipes work (TP=1, PP=1)
313│ ├─ 8 GPUs (1 node) → Most 8B–16B models, small MoE (EP=8)
314│ ├─ 16–64 GPUs → 70B dense, medium MoE
315│ └─ 128+ GPUs → 405B+, large MoE (DeepSeek V3, Kimi K2)
316│
317├─ Want throughput benchmarks?
318│ ├─ Yes → Use perf recipes (scripts/performance/)
319│ │ └─ ⚠️ These run on mock data for upper-bound perf only
320│ └─ No → Use library recipes (scripts/training/run_recipe.py)
321│
322└─ Long context?
323 ├─ > 8K → Need CP (context parallelism), check *_16k / *_64k / *_128k variants
324 └─ ≤ 8K → Default recipes work
325```
326
327---
328
329## Adjustment Advice (When Recommending)
330
331### Parallelism Resizing Rules
332
333When the user's GPU count differs from the recipe default:
334
3351. **TP must divide `num_key_value_heads`** (GQA constraint). E.g. if
336 `num_key_value_heads=8`, valid TP = {1, 2, 4, 8}.
3372. **TP should stay within a single node** (NVLink). TP > 8 requires
338 inter-node NVLink (e.g., GB200 NVL72).
3393. **PP adds pipeline bubbles.** Minimize PP; only increase when TP alone can't
340 fit the model. Use VP (virtual pipeline) to mitigate bubble overhead.
3414. **EP doesn't reduce dense-layer memory.** Only expert parameters shard with
342 EP. Shared attention/embeddings are replicated. For "OOM with MoE", increase
343 EP first, not TP.
3445. **SP should be True whenever TP > 1.** It eliminates redundant activation
345 copies and is essentially free.
3466. **CP requires all-to-all or ring attention.** Check `cp_comm_type`. For
347 GQA models, `a2a+p2p` hierarchical CP allows CP > num_kv_heads.
3487. **world_size = DP × TP × PP × CP × EP.** DP is implicit. Make sure the
349 product of explicit parallelisms divides your total GPU count.
350
351### Batch Size Tuning
352
353- Start with the recipe's `micro_batch_size`. If OOM, reduce to 1.
354- `global_batch_size` determines learning dynamics. Scale with DP:
355 `GBS = micro_batch_size × DP × gradient_accumulation_steps`.
356- For MoE, `micro_batch_size=1` is typical at scale.
357
358### Common Pitfalls to Warn About
359
360| Pitfall | Symptom | Fix |
361|---------|---------|-----|
362| TP > num_kv_heads | Crash: "TP must divide num_query_groups" | Reduce TP to a divisor of num_kv_heads |
363| PP without VP | Poor throughput (large bubble) | Set `virtual_pipeline_model_parallel_size` |
364| EP too low for large MoE | OOM on expert params | Increase EP; each expert lives on EP/num_experts ranks |
365| CUDA graphs + packed sequences | Assert: "CUDA graph accepts only Tensor inputs" | Disable packing or use `local` full-iteration graphs |
366| CUDA graphs + full recompute | Assert: "full recompute only with full iteration CUDA graph" | Disable recompute or switch to `local` impl |
367| `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` |
368| FSDP + TP > 1 on H100 | Possible comm bottleneck | Prefer FSDP with TP=1 or TP=2 on H100; FSDP shines on GB/B-series |
369| Long context without CP | OOM on activations | Add CP=2/4/8; use `*_16k`, `*_64k`, or `*_128k` recipe variants |
370| MoE `overlap_grad_reduce` on H100 | May hurt perf (False in many H100 presets) | Set `overlap_grad_reduce=False` for MoE on H100 |
371| VLM SFT missing image data | Runs but produces garbage | Provide actual multimodal dataset or use mock VLM data |
372| Qwen35-VL MoE FSDP | Tested on Blackwell only | May not work on H100; validate first |
373
374### Recipe Override Examples
375
376```bash
377# Scale Llama3 8B from 2 GPUs to 8 GPUs (increase DP)
378uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \
379 --recipe llama3_8b_pretrain_config \
380 --dataset llm-pretrain-mock
381
382# Reduce parallelism for Qwen3-MoE 30B to fit on 4 GPUs
383uv run python -m torch.distributed.run --nproc_per_node=4 scripts/training/run_recipe.py \
384 --recipe qwen3_30b_a3b_sft_config \
385 --dataset llm-finetune \
386 'model.expert_model_parallel_size=4'
387
388# Add long context to an existing recipe
389uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \
390 --recipe llama3_8b_pretrain_config \
391 --dataset llm-pretrain-mock \
392 'model.seq_length=32768' \
393 'model.context_parallel_size=4'
394
395# Enable CUDA graphs on any recipe
396uv run python -m torch.distributed.run --nproc_per_node=8 scripts/training/run_recipe.py \
397 --recipe qwen3_30b_a3b_pretrain_config \
398 --dataset llm-pretrain-mock \
399 'model.cuda_graph_impl=transformer_engine' \
400 'model.cuda_graph_scope=[attn,moe_router,moe_preprocess]' \
401 'model.use_te_rng_tracker=True' \
402 'rng.te_rng_tracker=True'
403```
404
405---
406
407## Quick Reference: Which Recipe for My Situation?
408
409| I want to... | Start with | GPUs needed |
410|---|---|---|
411| Try Bridge for the first time | `llama3_8b_sft_config` + mock data | 2 |
412| Fine-tune a 7-8B model | `llama3_8b_sft_config` or `qwen3_8b_sft_config` | 2–8 |
413| LoRA on 1 GPU | `llama3_8b_peft_config` or `qwen3_8b_peft_config` | 1 |
414| Pretrain a dense 70B | `llama3_70b_pretrain_config` | 32–64 |
415| Train a small MoE | `qwen3_30b_a3b_pretrain_config` | 8 |
416| Train a large MoE (235B+) | `qwen3_235b_a22b_pretrain_config` | 256–512 |
417| Benchmark throughput | Perf recipes via `run_script.py` | Varies |
418| Long-context training | `llama3_8b_128k_pretrain_config` or add CP override | 16+ |
419| VLM fine-tuning | `qwen3_vl_8b_sft_config` or `gemma3_vl_*_sft_config` | 4–8 |
420| Diffusion training | `wan_1_3B_pretrain_config` or `flux_12b_pretrain_config` | 8 |
421
422---
423
424## Code Anchors
425
426| What | Path |
427|------|------|
428| Library recipes root | `src/megatron/bridge/recipes/` |
429| Recipe `__init__.py` (all exports) | `src/megatron/bridge/recipes/__init__.py` |
430| Common recipe helpers | `src/megatron/bridge/recipes/common.py` |
431| Training entry point | `scripts/training/run_recipe.py` |
432| Perf recipes root | `src/megatron/bridge/perf_recipes/` |
433| Perf entry point | `scripts/performance/run_script.py` |
434| Perf recipe helpers | `scripts/performance/utils/utils.py` |
435| Perf overrides (benchmark defaults) | `scripts/performance/utils/overrides.py` |