Skip to content

Commit b4cd23b

Browse files
authored
[models] refactor: Remove size-specific provider classes (#3854)
Signed-off-by: yaoyu-33 <yaoyu.094@gmail.com>
1 parent 84ad990 commit b4cd23b

42 files changed

Lines changed: 412 additions & 1009 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎docs/nemo2-migration-guide.md‎

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,29 @@ This guide helps you migrate from NeMo 2.0 training and recipes to Megatron Brid
1212

1313
## Model Configuration Mapping
1414

15-
Megatron Bridge offers model providers that directly map to NeMo 2.0 model configs.
15+
Megatron Bridge derives model provider settings from Hugging Face configs through
16+
`AutoBridge`, or from recipe functions that configure a base provider directly.
1617

1718
### Examples
1819

1920
| NeMo 2.0 | Megatron Bridge |
2021
|----------|-----------------|
21-
| `llm.Llama3Config8B` | {py:class}`bridge.models.Llama3ModelProvider8B` |
22-
| `llm.Llama31Config70B` | {py:class}`bridge.models.Llama31ModelProvider70B` |
23-
| `llm.Qwen2Config7B` | {py:class}`bridge.models.Qwen2ModelProvider7B` |
22+
| `llm.Llama3Config8B` | `AutoBridge.from_hf_pretrained("meta-llama/Meta-Llama-3-8B").to_megatron_provider()` |
23+
| `llm.Llama31Config70B` | `AutoBridge.from_hf_pretrained("meta-llama/Llama-3.1-70B").to_megatron_provider()` |
24+
| `llm.Qwen2Config7B` | `AutoBridge.from_hf_pretrained("Qwen/Qwen2-7B").to_megatron_provider()` |
2425
| `llm.DeepseekV2Config` | {py:class}`bridge.models.DeepseekV2ModelProvider` |
2526

2627
### Supported Model Families
2728

28-
Megatron Bridge supports the following model families with preset providers:
29+
Megatron Bridge supports the following model families through bridge mappings and provider classes:
2930
- **Base Models**: `GPTModelProvider`, `T5ModelProvider`, `MambaModelProvider`
3031
- **Llama**: Llama2, Llama3, Llama3.1, Llama3.2, CodeLlama, Llama4
3132
- **Qwen**: Qwen2, Qwen2.5, Qwen3, Qwen3MoE, Qwen2.5VL
3233
- **DeepSeek**: DeepSeek, DeepSeekV2, DeepSeekV2Lite, DeepSeekV3, Moonlight
3334
- **Nemotron**: Nemotron3, Nemotron4, NemotronH, NemotronNano
3435
- **NVIDIA Mamba**: Mamba variants and hybrid models
3536

36-
For a complete list of all model providers and their parameters, see {py:mod}`bridge.models`.
37+
For a complete list of bridge mappings, providers, and their parameters, see {py:mod}`bridge.models`.
3738

3839
<!-- TODO: Create a dedicated model support table with tested HF checkpoint mappings -->
3940

@@ -114,7 +115,7 @@ from megatron.bridge.training.config import (
114115
LoggerConfig,
115116
TrainingConfig,
116117
)
117-
from megatron.bridge.models import Llama3ModelProvider8B # Direct equivalent to Llama3Config8B
118+
from megatron.bridge.models import GPTModelProvider # Configure directly or derive with AutoBridge
118119
from megatron.core.optimizer import OptimizerConfig
119120
from megatron.bridge.training.config import SchedulerConfig
120121
from megatron.bridge.training.pretrain import pretrain
@@ -123,8 +124,8 @@ from megatron.bridge.training.gpt_step import forward_step
123124

124125
def create_config():
125126
return ConfigContainer(
126-
# Model with parallelism built-in - using preset 8B config
127-
model=Llama3ModelProvider8B(
127+
# Model with parallelism built in
128+
model=GPTModelProvider(
128129
# Parallelism settings (moved from MegatronStrategy)
129130
tensor_model_parallel_size=2,
130131
pipeline_model_parallel_size=2,
@@ -224,13 +225,13 @@ llm.finetune(
224225
#### Now: Megatron Bridge
225226
```python
226227
# Megatron Bridge fine-tuning configuration (with optional PEFT)
227-
from megatron.bridge.models import Llama3ModelProvider8B
228+
from megatron.bridge.models import GPTModelProvider
228229
from megatron.bridge.peft import LoRA
229230

230231
def create_finetune_config():
231232
return ConfigContainer(
232-
model=Llama3ModelProvider8B(
233-
# Preset config matching Llama3Config8B
233+
model=GPTModelProvider(
234+
# Configure architecture fields directly or derive with AutoBridge
234235
),
235236
train=TrainingConfig(
236237
micro_batch_size=1,
@@ -382,7 +383,7 @@ from megatron.bridge.training.config import (
382383
SchedulerConfig,
383384
)
384385
from megatron.core.optimizer import OptimizerConfig
385-
from megatron.bridge.models import Llama3ModelProvider8B
386+
from megatron.bridge.models import GPTModelProvider
386387
from megatron.bridge.training import pretrain
387388

388389
def llama3_8b_config(
@@ -404,9 +405,9 @@ def llama3_8b_config(
404405
) -> ConfigContainer:
405406
"""Create a Llama3 8B pretraining configuration."""
406407
return ConfigContainer(
407-
model=Llama3ModelProvider8B(
408-
# Preset architecture from Llama3Config8B (num_layers=32, hidden_size=4096, etc.)
409-
# Only need to specify parallelism and overrides
408+
model=GPTModelProvider(
409+
# Configure architecture fields directly or derive this provider with AutoBridge
410+
# Then specify parallelism and overrides
410411
tensor_model_parallel_size=tensor_parallelism,
411412
pipeline_model_parallel_size=pipeline_parallelism,
412413
),
@@ -697,7 +698,7 @@ In Megatron Bridge, vocabulary size can be specified in either the model provide
697698
```python
698699
# Option 1: Let tokenizer determine vocab size
699700
config = ConfigContainer(
700-
model=Llama3ModelProvider8B(
701+
model=GPTModelProvider(
701702
# vocab_size not set - will use tokenizer's vocab size
702703
vocab_size=None,
703704
),
@@ -709,7 +710,7 @@ config = ConfigContainer(
709710

710711
# Option 2: Explicitly set vocab size in model
711712
config = ConfigContainer(
712-
model=Llama3ModelProvider8B(
713+
model=GPTModelProvider(
713714
vocab_size=128256, # Explicitly set (must be >= tokenizer vocab size)
714715
),
715716
tokenizer=TokenizerConfig(...),
@@ -1154,7 +1155,7 @@ from megatron.bridge.training.config import ConfigContainer, CheckpointConfig
11541155

11551156
# Include PEFT in ConfigContainer
11561157
config = ConfigContainer(
1157-
model=Llama3ModelProvider8B(),
1158+
model=GPTModelProvider(),
11581159
# ... other configs
11591160
checkpoint=CheckpointConfig(
11601161
pretrained_checkpoint="/path/to/megatron/checkpoint", # Required for PEFT
@@ -1288,7 +1289,7 @@ from megatron.bridge.training import pretrain
12881289
from megatron.bridge.training.gpt_step import forward_step
12891290

12901291
config = ConfigContainer(
1291-
model=Llama3ModelProvider8B(
1292+
model=GPTModelProvider(
12921293
tensor_model_parallel_size=2,
12931294
pipeline_model_parallel_size=2,
12941295
),
@@ -1324,7 +1325,7 @@ from megatron.bridge.training import finetune
13241325
from megatron.bridge.training.gpt_step import forward_step
13251326

13261327
config = ConfigContainer(
1327-
model=Llama3ModelProvider8B(),
1328+
model=GPTModelProvider(),
13281329
train=TrainingConfig(
13291330
train_iters=1000,
13301331
eval_interval=100,
@@ -1355,7 +1356,7 @@ Add a `peft` configuration to enable parameter-efficient training:
13551356
from megatron.bridge.peft import LoRA
13561357

13571358
config = ConfigContainer(
1358-
model=Llama3ModelProvider8B(),
1359+
model=GPTModelProvider(),
13591360
train=TrainingConfig(
13601361
train_iters=1000,
13611362
eval_interval=100,

‎skills/adding-model-support/SKILL.md‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,13 @@ directory — keep them namespaced under the `modeling_<model>` prefix.
130130
then sets model-specific attributes on it. **Do not create a provider file** — the stock
131131
provider returned by `super().provider_bridge()` is usually sufficient for LLMs
132132
(e.g., `GPTModelProvider`, or another base provider selected via `PROVIDER_CLASS`).
133+
**Do not add size-specific provider classes** whose names combine
134+
`ModelProvider` with a model-size suffix. Examples of forbidden suffixes
135+
include `7B`, `200M`, and `A3B`. Model size and architecture fields should
136+
come from the Hugging Face config through `AutoBridge` /
137+
`MegatronModelBridge` config mapping. If a recipe needs a fixed
138+
architecture, configure the base provider inside the recipe function instead
139+
of exporting a provider subclass.
133140

134141
**VLM:**
135142
1. **Bridge** — Register bridge, implement config and weight mappings.
@@ -311,6 +318,12 @@ Each recipe file defines functions for each model size + training mode:
311318

312319
For detailed recipe patterns, see @skills/adding-model-support/recipe-patterns.md.
313320

321+
Recipes are the right API surface for model-size presets. Do not create or
322+
export size-specific provider subclasses for recipes; either call
323+
`AutoBridge.from_hf_pretrained(...).to_megatron_provider(load_weights=False)` to
324+
derive the provider from HF config, or instantiate the base provider class with
325+
explicit architecture fields inside the recipe function.
326+
314327
### Export checklist
315328

316329
1. Family `__init__.py` — import and add to `__all__`

‎skills/adding-model-support/llm-patterns.md‎

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ Create a `GPTModelProvider` subclass only when:
3838
RoPE params, custom MoE fields) that need to serialize into `run_config.yaml`.
3939
2. **Custom `provide()` logic** — The model needs special instantiation (e.g., TE version
4040
checks, sink attention, custom layer specs that require runtime logic).
41-
3. **Predefined size variants for recipes** — Hardcoded configs like `LlamaModelProvider8B`
42-
used by recipe functions (not by the bridge itself).
4341

4442
```python
4543
@dataclass
@@ -62,19 +60,35 @@ def provider_bridge(self, hf_pretrained) -> MyModelProvider:
6260
return provider
6361
```
6462

65-
### Predefined size variants (for recipes only)
63+
### No Size-Specific Provider Classes
6664

67-
Size-specific subclasses are used by recipes, not by the bridge:
65+
Do not create provider subclasses whose names combine `ModelProvider` with a
66+
model-size suffix. Examples of forbidden suffixes include `7B`, `200M`, and
67+
`A3B`. The bridge should derive architecture fields from the Hugging Face config
68+
via `AutoBridge` / `MegatronModelBridge` config mapping.
69+
70+
For recipe presets, keep the size in the recipe function name and configure a
71+
base provider inside the function:
6872

6973
```python
70-
@dataclass
71-
class MyModelProvider7B(MyModelProvider):
72-
num_layers: int = 32
73-
hidden_size: int = 4096
74-
num_attention_heads: int = 32
75-
num_query_groups: int = 8
76-
ffn_hidden_size: int = 14336
77-
vocab_size: int = 128256
74+
def my_model_7b_pretrain_config() -> ConfigContainer:
75+
cfg = _pretrain_common()
76+
cfg.model = MyModelProvider(
77+
num_layers=32,
78+
hidden_size=4096,
79+
num_attention_heads=32,
80+
num_query_groups=8,
81+
ffn_hidden_size=14336,
82+
vocab_size=128256,
83+
)
84+
return cfg
85+
```
86+
87+
When the recipe targets an existing HF checkpoint, prefer deriving the provider
88+
from HF config:
89+
90+
```python
91+
cfg.model = AutoBridge.from_hf_pretrained("org/my-model-7b").to_megatron_provider(load_weights=False)
7892
```
7993

8094
## Bridge Pattern

‎src/megatron/bridge/diffusion/models/wan/wan_provider.py‎

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -89,35 +89,3 @@ def provide(self, pre_process=None, post_process=None, vp_stage=None) -> WanMode
8989
fp16_lm_cross_entropy=self.fp16_lm_cross_entropy,
9090
parallel_output=self.parallel_output,
9191
)
92-
93-
94-
@dataclass
95-
class WanModelProvider1_3B(WanModelProvider):
96-
"""WAN 1.3B model configuration.
97-
98-
Architecture: 30 layers, hidden_size=1536, 12 attention heads,
99-
ffn_hidden_size=8960. Default seq_length=1024.
100-
"""
101-
102-
num_layers: int = 30
103-
hidden_size: int = 1536
104-
ffn_hidden_size: int = 8960
105-
num_attention_heads: int = 12
106-
crossattn_emb_size: int = 1536
107-
seq_length: int = 1024
108-
109-
110-
@dataclass
111-
class WanModelProvider14B(WanModelProvider):
112-
"""WAN 14B model configuration.
113-
114-
Architecture: 40 layers, hidden_size=5120, 40 attention heads,
115-
ffn_hidden_size=13824. Default seq_length=1024.
116-
"""
117-
118-
num_layers: int = 40
119-
hidden_size: int = 5120
120-
ffn_hidden_size: int = 13824
121-
num_attention_heads: int = 40
122-
crossattn_emb_size: int = 5120
123-
seq_length: int = 1024

‎src/megatron/bridge/diffusion/recipes/wan/wan.py‎

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from megatron.core.distributed import DistributedDataParallelConfig
1919

2020
from megatron.bridge.diffusion.data.wan.wan_energon_datamodule import WanDatasetConfig
21-
from megatron.bridge.diffusion.models.wan.wan_provider import WanModelProvider1_3B, WanModelProvider14B
21+
from megatron.bridge.diffusion.models.wan.wan_provider import WanModelProvider
2222
from megatron.bridge.training.config import (
2323
CheckpointConfig,
2424
ConfigContainer,
@@ -49,7 +49,14 @@ def wan_1_3b_pretrain_config() -> ConfigContainer:
4949
tensorboard_dir = os.path.join(run_output_dir, "tb_logs")
5050

5151
# Model configuration
52-
model_cfg = WanModelProvider1_3B()
52+
model_cfg = WanModelProvider(
53+
num_layers=30,
54+
hidden_size=1536,
55+
ffn_hidden_size=8960,
56+
num_attention_heads=12,
57+
crossattn_emb_size=1536,
58+
seq_length=1024,
59+
)
5360
model_cfg.tensor_model_parallel_size = 1
5461
model_cfg.pipeline_model_parallel_size = 1
5562
model_cfg.pipeline_dtype = torch.bfloat16
@@ -148,7 +155,14 @@ def wan_14b_pretrain_config() -> ConfigContainer:
148155
tensorboard_dir = os.path.join(run_output_dir, "tb_logs")
149156

150157
# Model configuration
151-
model_cfg = WanModelProvider14B()
158+
model_cfg = WanModelProvider(
159+
num_layers=40,
160+
hidden_size=5120,
161+
ffn_hidden_size=13824,
162+
num_attention_heads=40,
163+
crossattn_emb_size=5120,
164+
seq_length=1024,
165+
)
152166
model_cfg.tensor_model_parallel_size = 2
153167
model_cfg.pipeline_model_parallel_size = 1
154168
model_cfg.pipeline_dtype = torch.bfloat16

‎src/megatron/bridge/models/__init__.py‎

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,9 @@
3737
FalconH1ModelProvider,
3838
)
3939
from megatron.bridge.models.gemma import (
40-
CodeGemmaModelProvider2B,
41-
CodeGemmaModelProvider7B,
4240
Gemma2ModelProvider,
43-
Gemma2ModelProvider2B,
44-
Gemma2ModelProvider9B,
45-
Gemma2ModelProvider27B,
4641
Gemma3ModelProvider,
47-
Gemma3ModelProvider1B,
48-
Gemma3ModelProvider4B,
49-
Gemma3ModelProvider12B,
50-
Gemma3ModelProvider27B,
5142
GemmaModelProvider,
52-
GemmaModelProvider2B,
53-
GemmaModelProvider7B,
5443
)
5544
from megatron.bridge.models.gemma_vl import (
5645
Gemma3VLBridge,
@@ -99,13 +88,9 @@
9988
Ministral3Bridge,
10089
Ministral3Model,
10190
Ministral3ModelProvider,
102-
Ministral3ModelProvider3B,
103-
Ministral3ModelProvider8B,
104-
Ministral3ModelProvider14B,
10591
)
10692
from megatron.bridge.models.mistral import (
10793
MistralModelProvider,
108-
MistralSmall3ModelProvider24B,
10994
)
11095
from megatron.bridge.models.nemotron import (
11196
NemotronBridge,
@@ -115,9 +100,9 @@
115100
NemotronOmniModel,
116101
)
117102
from megatron.bridge.models.nemotron_vl import (
118-
NemotronNano12Bv2VLModelProvider,
119103
NemotronVLBridge,
120104
NemotronVLModel,
105+
NemotronVLModelProvider,
121106
)
122107
from megatron.bridge.models.nemotronh import (
123108
NemotronHBridge,
@@ -185,19 +170,8 @@
185170
"FalconH1Bridge",
186171
"FalconH1ModelProvider",
187172
"Gemma3ModelProvider",
188-
"Gemma3ModelProvider1B",
189-
"Gemma3ModelProvider4B",
190-
"Gemma3ModelProvider12B",
191-
"Gemma3ModelProvider27B",
192-
"CodeGemmaModelProvider2B",
193-
"CodeGemmaModelProvider7B",
194173
"GemmaModelProvider",
195-
"GemmaModelProvider2B",
196-
"GemmaModelProvider7B",
197174
"Gemma2ModelProvider",
198-
"Gemma2ModelProvider2B",
199-
"Gemma2ModelProvider9B",
200-
"Gemma2ModelProvider27B",
201175
"GLM45Bridge",
202176
"GLM47FlashBridge",
203177
"GLM5Bridge",
@@ -214,14 +188,10 @@
214188
"LlamaNemotronHeterogeneousProvider",
215189
"LlamaNemotronBridge",
216190
"MistralModelProvider",
217-
"MistralSmall3ModelProvider24B",
218191
# Ministral 3 Models
219192
"Ministral3Bridge",
220193
"Ministral3Model",
221194
"Ministral3ModelProvider",
222-
"Ministral3ModelProvider3B",
223-
"Ministral3ModelProvider8B",
224-
"Ministral3ModelProvider14B",
225195
"MiniMaxM2Bridge",
226196
"OlMoEBridge",
227197
"OlMoEModelProvider",
@@ -255,7 +225,7 @@
255225
"Gemma4VLModelProvider",
256226
"NemotronVLModel",
257227
"NemotronVLBridge",
258-
"NemotronNano12Bv2VLModelProvider",
228+
"NemotronVLModelProvider",
259229
"NemotronOmniBridge",
260230
"NemotronOmniModel",
261231
# ASR Models

0 commit comments

Comments
 (0)