Skip to content

Commit 885765c

Browse files
kamran-nvidiaclaude
andcommitted
fix(model): apply Hugging Face YaRN defaults for omitted rope_scaling keys
The shared HF -> Megatron mapping copied only the YaRN keys a checkpoint sets. Standard Qwen2.5/Qwen3 YaRN configs omit beta_fast/beta_slow, which then reached Megatron Core as None and failed in YarnRotaryEmbedding at model construction. Fill the transformers defaults (beta_fast=32, beta_slow=1, truncate=True) for omitted keys on the GPT YaRN path. Explicit checkpoint values still win; MLA models and bridges that build providers by hand are unaffected. Signed-off-by: Kamran Jafari <kjafarisadeg@nvidia.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 1e8a61d commit 885765c

2 files changed

Lines changed: 66 additions & 1 deletion

File tree

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

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

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

‎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
@@ -1466,3 +1466,56 @@ def __init__(self, megatron_param, hf_param):
14661466
assert len(tasks) == 1
14671467
assert tasks[0].global_param_name == "decoder.weight"
14681468
assert tasks[0].megatron_module is None
1469+
1470+
1471+
def _yarn_qwen2_config(rope_scaling):
1472+
return Qwen2Config(
1473+
hidden_size=64,
1474+
intermediate_size=128,
1475+
num_hidden_layers=2,
1476+
num_attention_heads=4,
1477+
num_key_value_heads=2,
1478+
max_position_embeddings=16384,
1479+
vocab_size=128,
1480+
rope_scaling=rope_scaling,
1481+
)
1482+
1483+
1484+
def test_yarn_mapping_fills_hugging_face_defaults_for_omitted_keys():
1485+
"""Omitted YaRN keys must not reach Megatron Core as None."""
1486+
config = _yarn_qwen2_config({"rope_type": "yarn", "factor": 4.0, "original_max_position_embeddings": 4096})
1487+
1488+
kwargs = DummyBridge().hf_config_to_provider_kwargs(config)
1489+
1490+
assert kwargs["position_embedding_type"] == "yarn"
1491+
assert kwargs["yarn_rotary_scaling_factor"] == 4.0
1492+
assert kwargs["yarn_original_max_position_embeddings"] == 4096
1493+
assert kwargs["yarn_beta_fast"] == 32.0
1494+
assert kwargs["yarn_beta_slow"] == 1.0
1495+
assert kwargs["yarn_correction_range_round_to_int"] is True
1496+
1497+
1498+
def test_yarn_mapping_preserves_explicit_keys():
1499+
config = _yarn_qwen2_config(
1500+
{
1501+
"rope_type": "yarn",
1502+
"factor": 4.0,
1503+
"original_max_position_embeddings": 4096,
1504+
"beta_fast": 16.0,
1505+
"beta_slow": 2.0,
1506+
"truncate": False,
1507+
}
1508+
)
1509+
1510+
kwargs = DummyBridge().hf_config_to_provider_kwargs(config)
1511+
1512+
assert kwargs["yarn_beta_fast"] == 16.0
1513+
assert kwargs["yarn_beta_slow"] == 2.0
1514+
assert kwargs["yarn_correction_range_round_to_int"] is False
1515+
1516+
1517+
def test_non_yarn_mapping_adds_no_yarn_defaults():
1518+
kwargs = DummyBridge().hf_config_to_provider_kwargs(_yarn_qwen2_config(None))
1519+
1520+
assert "position_embedding_type" not in kwargs
1521+
assert not any(key.startswith("yarn_") for key in kwargs)

0 commit comments

Comments
 (0)