|
13 | 13 | # limitations under the License. |
14 | 14 |
|
15 | 15 | from functools import partial |
| 16 | +from typing import Any |
16 | 17 |
|
17 | 18 | import torch |
18 | 19 | from megatron.core.models.gpt.gpt_layer_specs import get_gpt_decoder_block_spec |
19 | 20 | from megatron.core.models.gpt.gpt_model import GPTModel |
| 21 | +from transformers import PretrainedConfig |
20 | 22 |
|
21 | 23 | from megatron.bridge.models.conversion.mapping_registry import MegatronMappingRegistry |
22 | 24 | from megatron.bridge.models.conversion.model_bridge import MegatronModelBridge |
|
25 | 27 | GatedMLPMapping, |
26 | 28 | QKVMapping, |
27 | 29 | ) |
| 30 | +from megatron.bridge.models.gpt.model_config import BridgeGPTModelConfig |
28 | 31 | from megatron.bridge.models.gpt_provider import GPTModelProvider |
29 | | -from megatron.bridge.models.hf_pretrained.causal_lm import PreTrainedCausalLM |
30 | 32 |
|
31 | 33 |
|
32 | 34 | try: |
@@ -57,49 +59,62 @@ class HYV3Bridge(MegatronModelBridge): |
57 | 59 | Example: |
58 | 60 | >>> from megatron.bridge import AutoBridge |
59 | 61 | >>> bridge = AutoBridge.from_hf_pretrained("tencent/Hy3-preview-Base") |
60 | | - >>> provider = bridge.to_megatron_provider() |
| 62 | + >>> model_config = bridge.get_model_config() |
61 | 63 | """ |
62 | 64 |
|
63 | | - def provider_bridge(self, hf_pretrained: PreTrainedCausalLM) -> GPTModelProvider: |
64 | | - """Convert HuggingFace Hy V3 config to GPTModelProvider.""" |
65 | | - provider = super().provider_bridge(hf_pretrained) |
66 | | - hf_config = hf_pretrained.config |
| 65 | + MODEL_CONFIG_CLASS = BridgeGPTModelConfig |
| 66 | + USE_MODEL_CONFIG_FOR_CONVERSION = True |
67 | 67 |
|
68 | | - provider.transformer_layer_spec = partial(get_gpt_decoder_block_spec, use_transformer_engine=HAVE_TE) |
| 68 | + def hf_config_to_model_config_kwargs(self, hf_config: PretrainedConfig) -> dict[str, Any]: |
| 69 | + """Convert a Hugging Face Hy V3 config to builder config kwargs. |
69 | 70 |
|
70 | | - provider.normalization = "RMSNorm" |
71 | | - provider.gated_linear_unit = True |
72 | | - provider.add_bias_linear = False |
73 | | - provider.add_qkv_bias = False # Hy V3 does NOT have QKV bias |
74 | | - provider.hidden_dropout = 0.0 |
75 | | - provider.qk_layernorm = True # Hy V3 uses QK layernorm |
76 | | - provider.attention_softmax_in_fp32 = False |
77 | | - provider.autocast_dtype = torch.bfloat16 |
78 | | - provider.fp16 = False |
79 | | - provider.bf16 = True |
80 | | - provider.params_dtype = torch.bfloat16 |
81 | | - provider.moe_grouped_gemm = True |
82 | | - provider.moe_token_dispatcher_type = "alltoall" |
83 | | - provider.moe_router_load_balancing_type = "none" |
84 | | - provider.moe_router_pre_softmax = False |
85 | | - provider.moe_router_score_function = "sigmoid" |
86 | | - provider.moe_router_enable_expert_bias = True |
87 | | - provider.moe_router_bias_update_rate = 0 |
88 | | - provider.moe_router_dtype = "fp32" |
89 | | - provider.moe_permute_fusion = True |
90 | | - provider.moe_shared_expert_overlap = False |
91 | | - provider.moe_aux_loss_coeff = 0.0 |
92 | | - provider.moe_router_topk_scaling_factor = float(hf_config.router_scaling_factor) |
93 | | - |
94 | | - # Shared experts hidden dim = moe_intermediate_size * num_shared_experts. |
95 | | - provider.moe_shared_expert_intermediate_size = hf_config.moe_intermediate_size * hf_config.num_shared_experts |
96 | | - |
97 | | - # Dense-first layer pattern. |
98 | | - provider.moe_layer_freq = [0] * hf_config.first_k_dense_replace + [1] * ( |
99 | | - hf_config.num_hidden_layers - hf_config.first_k_dense_replace |
| 71 | + The builder's default MoE layer spec already uses the GPT decoder block |
| 72 | + spec, which honors the dense-first ``moe_layer_freq``. |
| 73 | + """ |
| 74 | + config_kwargs = super().hf_config_to_model_config_kwargs(hf_config) |
| 75 | + config_kwargs.update( |
| 76 | + normalization="RMSNorm", |
| 77 | + gated_linear_unit=True, |
| 78 | + add_bias_linear=False, |
| 79 | + add_qkv_bias=False, # Hy V3 does NOT have QKV bias |
| 80 | + hidden_dropout=0.0, |
| 81 | + qk_layernorm=True, # Hy V3 uses QK layernorm |
| 82 | + attention_softmax_in_fp32=False, |
| 83 | + autocast_dtype=torch.bfloat16, |
| 84 | + fp16=False, |
| 85 | + bf16=True, |
| 86 | + params_dtype=torch.bfloat16, |
| 87 | + masked_softmax_fusion=True, |
| 88 | + rope_scaling=False, |
| 89 | + rope_scaling_factor=1.0, |
| 90 | + moe_grouped_gemm=True, |
| 91 | + moe_token_dispatcher_type="alltoall", |
| 92 | + moe_router_load_balancing_type="none", |
| 93 | + moe_router_pre_softmax=False, |
| 94 | + moe_router_score_function="sigmoid", |
| 95 | + moe_router_enable_expert_bias=True, |
| 96 | + moe_router_bias_update_rate=0, |
| 97 | + moe_router_dtype="fp32", |
| 98 | + moe_permute_fusion=True, |
| 99 | + moe_shared_expert_overlap=False, |
| 100 | + moe_aux_loss_coeff=0.0, |
| 101 | + moe_router_topk_scaling_factor=float(hf_config.router_scaling_factor), |
| 102 | + # Shared experts hidden dim = moe_intermediate_size * num_shared_experts. |
| 103 | + moe_shared_expert_intermediate_size=hf_config.moe_intermediate_size * hf_config.num_shared_experts, |
| 104 | + # Dense-first layer pattern. |
| 105 | + moe_layer_freq=[0] * hf_config.first_k_dense_replace |
| 106 | + + [1] * (hf_config.num_hidden_layers - hf_config.first_k_dense_replace), |
100 | 107 | ) |
| 108 | + config_kwargs.setdefault("position_embedding_type", "rope") |
| 109 | + return config_kwargs |
101 | 110 |
|
102 | | - return provider |
| 111 | + def hf_config_to_provider_kwargs(self, hf_config: PretrainedConfig) -> dict[str, Any]: |
| 112 | + """Adapt the canonical builder mapping to the deprecated provider path.""" |
| 113 | + provider_kwargs = self.hf_config_to_model_config_kwargs(hf_config) |
| 114 | + # The provider's default layer spec builds homogeneous layers; the decoder |
| 115 | + # block spec is needed for the dense-first MoE layer pattern. |
| 116 | + provider_kwargs["transformer_layer_spec"] = partial(get_gpt_decoder_block_spec, use_transformer_engine=HAVE_TE) |
| 117 | + return provider_kwargs |
103 | 118 |
|
104 | 119 | @classmethod |
105 | 120 | def megatron_to_hf_config(cls, provider: GPTModelProvider) -> dict: |
|
0 commit comments