Skip to content

Commit f46e89e

Browse files
fix(model): apply Hugging Face YaRN defaults for omitted rope_scaling keys (#6367)
Signed-off-by: Kamran Jafari <kjafarisadeg@nvidia.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 08ab678 commit f46e89e

3 files changed

Lines changed: 67 additions & 8 deletions

File tree

‎src/megatron/bridge/models/conversion/model_bridge.py‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,14 @@ def postprocess_hf_export_weights(self, path: Path) -> None:
627627
("mscale_all_dim", "yarn_mscale_all_dim"),
628628
]
629629

630+
# Hugging Face YaRN defaults (transformers' _compute_yarn_parameters) for keys a
631+
# checkpoint omits: (megatron_param, default)
632+
YARN_HF_DEFAULTS = [
633+
("yarn_beta_fast", 32.0),
634+
("yarn_beta_slow", 1.0),
635+
("yarn_correction_range_round_to_int", True),
636+
]
637+
630638
# MLA rope scaling field mapping: (hf_rope_scaling_key, megatron_mla_param)
631639
# These are applied for MLA models (DeepSeek, Kimi, etc.) which use MLATransformerConfig
632640
# Uses direct field names without yarn_ prefix (e.g., mscale, rotary_scaling_factor)
@@ -736,6 +744,10 @@ def _hf_config_to_megatron_kwargs(self, hf_config: PretrainedConfig) -> dict[str
736744
provider_kwargs[megatron_key] = value
737745
if "truncate" in rope_scaling:
738746
provider_kwargs["yarn_correction_range_round_to_int"] = rope_scaling["truncate"]
747+
# Apply Hugging Face YaRN defaults for omitted keys. Megatron Core passes these
748+
# fields to YarnRotaryEmbedding explicitly, so None would override its defaults.
749+
for megatron_key, default in self.YARN_HF_DEFAULTS:
750+
provider_kwargs.setdefault(megatron_key, default)
739751
elif is_mla_provider:
740752
if rope_type not in (None, "default"):
741753
logger.warning(

‎src/megatron/bridge/models/qwen/qwen3_bridge.py‎

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,8 @@ def hf_config_to_model_config_kwargs(self, hf_config: PretrainedConfig) -> dict[
6161
rope_scaling=False,
6262
rope_scaling_factor=1.0,
6363
)
64-
# The shared mapping already selects "yarn" for YaRN-scaled checkpoints.
64+
# The shared mapping already selects "yarn" and its Hugging Face defaults for YaRN-scaled checkpoints.
6565
config_kwargs.setdefault("position_embedding_type", "rope")
66-
if config_kwargs["position_embedding_type"] == "yarn":
67-
# Qwen3 YaRN configs usually omit these keys; apply the Hugging Face defaults
68-
# instead of passing None to Megatron Core.
69-
config_kwargs.setdefault("yarn_beta_fast", 32.0)
70-
config_kwargs.setdefault("yarn_beta_slow", 1.0)
71-
config_kwargs.setdefault("yarn_correction_range_round_to_int", True)
7266
return config_kwargs
7367

7468
def hf_config_to_provider_kwargs(self, hf_config: PretrainedConfig) -> dict[str, Any]:

‎tests/unit_tests/models/test_model_bridge.py‎

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
import pytest
2020
import torch
21-
from transformers import PretrainedConfig
21+
from transformers import PretrainedConfig, Qwen2Config
2222

2323
from megatron.bridge.models.conversion import model_bridge as model_bridge_module
2424
from megatron.bridge.models.conversion import modelopt_utils
@@ -1691,3 +1691,56 @@ def __init__(self, megatron_param, hf_param):
16911691
assert len(tasks) == 1
16921692
assert tasks[0].global_param_name == "decoder.weight"
16931693
assert tasks[0].megatron_module is None
1694+
1695+
1696+
def _yarn_qwen2_config(rope_scaling):
1697+
return Qwen2Config(
1698+
hidden_size=64,
1699+
intermediate_size=128,
1700+
num_hidden_layers=2,
1701+
num_attention_heads=4,
1702+
num_key_value_heads=2,
1703+
max_position_embeddings=16384,
1704+
vocab_size=128,
1705+
rope_scaling=rope_scaling,
1706+
)
1707+
1708+
1709+
def test_yarn_mapping_fills_hugging_face_defaults_for_omitted_keys():
1710+
"""Omitted YaRN keys must not reach Megatron Core as None."""
1711+
config = _yarn_qwen2_config({"rope_type": "yarn", "factor": 4.0, "original_max_position_embeddings": 4096})
1712+
1713+
kwargs = DummyBridge().hf_config_to_provider_kwargs(config)
1714+
1715+
assert kwargs["position_embedding_type"] == "yarn"
1716+
assert kwargs["yarn_rotary_scaling_factor"] == 4.0
1717+
assert kwargs["yarn_original_max_position_embeddings"] == 4096
1718+
assert kwargs["yarn_beta_fast"] == 32.0
1719+
assert kwargs["yarn_beta_slow"] == 1.0
1720+
assert kwargs["yarn_correction_range_round_to_int"] is True
1721+
1722+
1723+
def test_yarn_mapping_preserves_explicit_keys():
1724+
config = _yarn_qwen2_config(
1725+
{
1726+
"rope_type": "yarn",
1727+
"factor": 4.0,
1728+
"original_max_position_embeddings": 4096,
1729+
"beta_fast": 16.0,
1730+
"beta_slow": 2.0,
1731+
"truncate": False,
1732+
}
1733+
)
1734+
1735+
kwargs = DummyBridge().hf_config_to_provider_kwargs(config)
1736+
1737+
assert kwargs["yarn_beta_fast"] == 16.0
1738+
assert kwargs["yarn_beta_slow"] == 2.0
1739+
assert kwargs["yarn_correction_range_round_to_int"] is False
1740+
1741+
1742+
def test_non_yarn_mapping_adds_no_yarn_defaults():
1743+
kwargs = DummyBridge().hf_config_to_provider_kwargs(_yarn_qwen2_config(None))
1744+
1745+
assert "position_embedding_type" not in kwargs
1746+
assert not any(key.startswith("yarn_") for key in kwargs)

0 commit comments

Comments
 (0)