Skip to content

Commit ae086ba

Browse files
committed
[model] fix: preserve Step3.7 projector bias
Signed-off-by: Yu Yao <yaoyu.094@gmail.com>
1 parent ffa5b7b commit ae086ba

2 files changed

Lines changed: 28 additions & 0 deletions

File tree

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ def megatron_to_hf_config(cls, provider: Step37ModelProvider) -> dict:
119119
mtp_num_layers = hf_config.pop("num_nextn_predict_layers", None)
120120
if mtp_num_layers is not None:
121121
hf_config["text_config"] = {"num_nextn_predict_layers": mtp_num_layers}
122+
projector_bias = getattr(provider, "projector_bias", None)
123+
if projector_bias is not None:
124+
hf_config["projector_bias"] = projector_bias
122125
return hf_config
123126

124127
def provider_bridge(self, hf_pretrained: PreTrainedCausalLM) -> Step37ModelProvider:
@@ -535,6 +538,7 @@ def mapping_registry(self) -> MegatronMappingRegistry:
535538
# inside ``image_insert_embedding.align_projector``; on the HF side
536539
# it is the top-level ``vit_large_projector`` linear.
537540
"image_insert_embedding.align_projector.weight": "vit_large_projector.weight",
541+
"image_insert_embedding.align_projector.bias": "vit_large_projector.bias",
538542
}
539543
for megatron_param, hf_param in vision_replicated_param_mappings.items():
540544
mapping_list.append(ReplicatedMapping(megatron_param=megatron_param, hf_param=hf_param))

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

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

20+
from torch import nn
21+
2022
from megatron.bridge.models.conversion.utils import conform_config_to_reference
2123
from megatron.bridge.models.stepfun import step37_bridge as _step37_bridge_mod
2224
from megatron.bridge.models.stepfun.configuration_step37 import Step37Config
2325
from megatron.bridge.models.stepfun.modelling_step37 import transformer_block as _step37_block_mod
26+
from megatron.bridge.models.stepfun.modelling_step37.image_insert_embedding import ImageInsertEmbedding
2427
from megatron.bridge.models.stepfun.modelling_step37.transformer_block import get_step37_text_layer_spec
2528
from megatron.bridge.models.stepfun.step35_bridge import build_step35_layer_spec
2629
from megatron.bridge.models.stepfun.step37_bridge import Step37Bridge
@@ -96,6 +99,27 @@ def test_checkpoint_mtp_override_is_nested_in_exported_config(self):
9699

97100
assert synthesized_config.text_config.num_nextn_predict_layers == 0
98101

102+
def test_projector_bias_schema_roundtrips(self):
103+
reference_config = Step37Config(projector_bias=False)
104+
provider = SimpleNamespace(projector_bias=True)
105+
106+
biased_projector = ImageInsertEmbedding(nn.Identity(), 4, 2, projector_bias=provider.projector_bias)
107+
unbiased_projector = ImageInsertEmbedding(nn.Identity(), 4, 2, projector_bias=False)
108+
assert biased_projector.align_projector.bias is not None
109+
assert unbiased_projector.align_projector.bias is None
110+
111+
mapping = (
112+
Step37Bridge().mapping_registry().megatron_to_hf_lookup("image_insert_embedding.align_projector.bias")
113+
)
114+
checkpoint_config = Step37Bridge.megatron_to_hf_config(provider)
115+
exported_config = conform_config_to_reference(checkpoint_config, reference_config.to_dict())
116+
synthesized_config = Step37Config(**exported_config)
117+
118+
assert (
119+
mapping.hf_param if mapping is not None else None,
120+
synthesized_config.projector_bias,
121+
) == ("vit_large_projector.bias", True)
122+
99123

100124
class TestGetStep37TextLayerSpec:
101125
def test_delegates_to_step35_builder(self):

0 commit comments

Comments
 (0)