Skip to content

Commit 3206435

Browse files
authored
[model] fix: preserve Step3.7 MTP export config (#5528)
Signed-off-by: Yu Yao <yaoyu.094@gmail.com>
1 parent 1dd9a73 commit 3206435

2 files changed

Lines changed: 23 additions & 0 deletions

File tree

‎src/megatron/bridge/models/stepfun/step37_bridge.py‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,15 @@ class Step37Bridge(MegatronModelBridge):
112112
# uses the identical HF schema.
113113
CONFIG_MAPPING = Step35Bridge.CONFIG_MAPPING
114114

115+
@classmethod
116+
def megatron_to_hf_config(cls, provider: Step37ModelProvider) -> dict:
117+
"""Convert a Step3.7 provider into its nested Hugging Face config."""
118+
hf_config = super().megatron_to_hf_config(provider)
119+
mtp_num_layers = hf_config.pop("num_nextn_predict_layers", None)
120+
if mtp_num_layers is not None:
121+
hf_config["text_config"] = {"num_nextn_predict_layers": mtp_num_layers}
122+
return hf_config
123+
115124
def provider_bridge(self, hf_pretrained: PreTrainedCausalLM) -> Step37ModelProvider:
116125
"""Convert a HuggingFace Step3.7 config into a :class:`Step37ModelProvider`.
117126

‎tests/unit_tests/models/stepfun/test_step37_bridge.py‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
from types import SimpleNamespace
1818
from unittest.mock import patch
1919

20+
from megatron.bridge.models.conversion.utils import conform_config_to_reference
2021
from megatron.bridge.models.stepfun import step37_bridge as _step37_bridge_mod
22+
from megatron.bridge.models.stepfun.configuration_step37 import Step37Config
2123
from megatron.bridge.models.stepfun.modelling_step37 import transformer_block as _step37_block_mod
2224
from megatron.bridge.models.stepfun.modelling_step37.transformer_block import get_step37_text_layer_spec
2325
from megatron.bridge.models.stepfun.step35_bridge import build_step35_layer_spec
@@ -83,6 +85,18 @@ def test_layer_spec_target_passes_checkpoint_load_validation(self):
8385
_validate_target_prefix(target=target, full_key="transformer_layer_spec")
8486

8587

88+
class TestStep37BridgeReverseConfig:
89+
def test_checkpoint_mtp_override_is_nested_in_exported_config(self):
90+
reference_config = Step37Config(text_config={"num_nextn_predict_layers": 3})
91+
provider = SimpleNamespace(mtp_num_layers=0)
92+
93+
checkpoint_config = Step37Bridge.megatron_to_hf_config(provider)
94+
exported_config = conform_config_to_reference(checkpoint_config, reference_config.to_dict())
95+
synthesized_config = Step37Config(**exported_config)
96+
97+
assert synthesized_config.text_config.num_nextn_predict_layers == 0
98+
99+
86100
class TestGetStep37TextLayerSpec:
87101
def test_delegates_to_step35_builder(self):
88102
"""Step3.7's text decoder spec is Step-3.5's hybrid layer spec, passed through verbatim."""

0 commit comments

Comments
 (0)