3535"""
3636
3737import torch
38+ import torch .nn .functional as F
3839from megatron .core .models .gpt .gpt_model import GPTModel
3940
4041from megatron .bridge .models .conversion .mapping_registry import MegatronMappingRegistry
4445 GatedMLPMapping ,
4546 QKVMapping ,
4647)
47- from megatron .bridge .models .exaone .exaone4_provider import Exaone4ModelProvider
48+ from megatron .bridge .models .exaone .exaone4_provider import exaone4_layer_spec
49+ from megatron .bridge .models .gpt_provider import GPTModelProvider
4850from megatron .bridge .models .hf_pretrained .causal_lm import PreTrainedCausalLM
4951
5052
5759@MegatronModelBridge .register_bridge (
5860 source = "Exaone4ForCausalLM" , # HF architecture string (auto_map / trust_remote_code)
5961 target = GPTModel ,
60- provider = Exaone4ModelProvider ,
6162 model_type = "exaone4" ,
6263)
6364class Exaone4Bridge (MegatronModelBridge ):
@@ -84,8 +85,8 @@ class Exaone4Bridge(MegatronModelBridge):
8485 >>> provider = bridge.to_megatron_provider()
8586 """
8687
87- def provider_bridge (self , hf_pretrained : PreTrainedCausalLM ) -> Exaone4ModelProvider :
88- """Convert HuggingFace EXAONE 4.0 config to Megatron Exaone4ModelProvider .
88+ def provider_bridge (self , hf_pretrained : PreTrainedCausalLM ) -> GPTModelProvider :
89+ """Convert HuggingFace EXAONE 4.0 config to Megatron GPTModelProvider .
8990
9091 Maps HF config fields to Megatron TransformerConfig parameters and sets
9192 EXAONE-specific options including Post-LN, QK norm, and RoPE scaling.
@@ -94,28 +95,25 @@ def provider_bridge(self, hf_pretrained: PreTrainedCausalLM) -> Exaone4ModelProv
9495 hf_pretrained: HuggingFace PreTrainedCausalLM containing the EXAONE config
9596
9697 Returns:
97- Exaone4ModelProvider configured for EXAONE 4.0 architecture
98+ GPTModelProvider configured for EXAONE 4.0 architecture
9899 """
99100 hf_config = hf_pretrained .config
100101
101- provider = Exaone4ModelProvider (
102- num_layers = hf_config .num_hidden_layers ,
103- hidden_size = hf_config .hidden_size ,
104- ffn_hidden_size = hf_config .intermediate_size ,
105- num_attention_heads = hf_config .num_attention_heads ,
106- num_query_groups = hf_config .num_key_value_heads ,
107- seq_length = hf_config .max_position_embeddings ,
108- init_method_std = hf_config .initializer_range ,
109- layernorm_epsilon = hf_config .rms_norm_eps ,
110- rotary_base = getattr (hf_config , "rope_theta" , getattr (hf_config , "rotary_base" , 1000000.0 )),
111- make_vocab_size_divisible_by = self .make_vocab_size_divisible_by (hf_config .vocab_size ),
112- share_embeddings_and_output_weights = getattr (hf_config , "tie_word_embeddings" , True ),
113- kv_channels = getattr (hf_config , "head_dim" , None ),
114- fp16 = (self .dtype_from_hf (hf_config , default = torch .float32 ) == torch .float16 ),
115- bf16 = (self .dtype_from_hf (hf_config , default = torch .float32 ) == torch .bfloat16 ),
116- params_dtype = self .dtype_from_hf (hf_config , default = torch .float32 ),
117- vocab_size = hf_config .vocab_size ,
118- )
102+ provider = super ().provider_bridge (hf_pretrained )
103+
104+ # EXAONE-specific architecture settings. Size-dependent fields are
105+ # populated by the shared HF config mapping in the base bridge.
106+ provider .normalization = "RMSNorm"
107+ provider .activation_func = F .silu
108+ provider .gated_linear_unit = True
109+ provider .position_embedding_type = "rope"
110+ provider .add_bias_linear = False
111+ provider .add_qkv_bias = False
112+ provider .qk_layernorm = True
113+ provider .hidden_dropout = 0.0
114+ provider .attention_dropout = 0.0
115+ provider .transformer_layer_spec = exaone4_layer_spec
116+ provider .autocast_dtype = torch .bfloat16
119117
120118 # RoPE scaling for EXAONE 4.0 (llama3-style)
121119 hf_rope_scaling = getattr (hf_config , "rope_scaling" , None )
@@ -131,11 +129,11 @@ def provider_bridge(self, hf_pretrained: PreTrainedCausalLM) -> Exaone4ModelProv
131129 return provider
132130
133131 @classmethod
134- def megatron_to_hf_config (cls , provider : Exaone4ModelProvider ) -> dict :
135- """Convert Megatron Exaone4ModelProvider config to HuggingFace config dict.
132+ def megatron_to_hf_config (cls , provider : GPTModelProvider ) -> dict :
133+ """Convert Megatron GPTModelProvider config to HuggingFace config dict.
136134
137135 Args:
138- provider: Exaone4ModelProvider with EXAONE configuration
136+ provider: GPTModelProvider with EXAONE configuration
139137
140138 Returns:
141139 Dictionary of HuggingFace Exaone4Config parameters
@@ -202,22 +200,20 @@ def mapping_registry(self) -> MegatronMappingRegistry:
202200 # =====================================================================
203201 # Composite Mappings (require concatenation/splitting)
204202 # =====================================================================
205- mapping_list .extend (
206- [
207- # QKV: Merge separate Q, K, V projections into single QKV matrix
208- QKVMapping (
209- megatron_param = "decoder.layers.*.self_attention.linear_qkv.weight" ,
210- q = "model.layers.*.self_attn.q_proj.weight" ,
211- k = "model.layers.*.self_attn.k_proj.weight" ,
212- v = "model.layers.*.self_attn.v_proj.weight" ,
213- ),
214- # Gated MLP: Merge gate and up projections into single FC1 matrix
215- GatedMLPMapping (
216- megatron_param = "decoder.layers.*.mlp.linear_fc1.weight" ,
217- gate = "model.layers.*.mlp.gate_proj.weight" ,
218- up = "model.layers.*.mlp.up_proj.weight" ,
219- ),
220- ]
221- )
203+ mapping_list .extend ([
204+ # QKV: Merge separate Q, K, V projections into single QKV matrix
205+ QKVMapping (
206+ megatron_param = "decoder.layers.*.self_attention.linear_qkv.weight" ,
207+ q = "model.layers.*.self_attn.q_proj.weight" ,
208+ k = "model.layers.*.self_attn.k_proj.weight" ,
209+ v = "model.layers.*.self_attn.v_proj.weight" ,
210+ ),
211+ # Gated MLP: Merge gate and up projections into single FC1 matrix
212+ GatedMLPMapping (
213+ megatron_param = "decoder.layers.*.mlp.linear_fc1.weight" ,
214+ gate = "model.layers.*.mlp.gate_proj.weight" ,
215+ up = "model.layers.*.mlp.up_proj.weight" ,
216+ ),
217+ ])
222218
223219 return MegatronMappingRegistry (* mapping_list )
0 commit comments