@@ -259,14 +259,6 @@ def _split_tp(self, meg_sd):
259259 vis_head_dim = vis_h // vis_heads
260260 vis_qg = vis_heads
261261
262- num_qg = cfg .num_query_groups
263- kv_ch = cfg .kv_channels
264- heads_per_group = cfg .num_attention_heads // num_qg
265- if cfg .attention_output_gate :
266- total_hpg = 2 * heads_per_group + 2
267- else :
268- total_hpg = heads_per_group + 2
269-
270262 for k , v in meg_sd .items ():
271263 if not isinstance (v , torch .Tensor ):
272264 for r in range (tp ):
@@ -367,10 +359,11 @@ def _split_tp(self, meg_sd):
367359 for r in range (tp ):
368360 shards [r ][k ] = chunks [r ]
369361 elif "linear_qkv.weight" in k :
370- viewed = v .view (num_qg , total_hpg , kv_ch , cfg .hidden_size )
371- chunks = viewed .chunk (tp , dim = 0 )
362+ # Simple dim-0 chunk / cat for TP sharding of the fused QKV weight.
363+ # This is valid for any TP size, including cases where num_query_groups < tp.
364+ chunks = v .chunk (tp , dim = 0 )
372365 for r in range (tp ):
373- shards [r ][k ] = chunks [r ]. reshape ( - 1 , cfg . hidden_size )
366+ shards [r ][k ] = chunks [r ]
374367 elif "linear_proj.weight" in k :
375368 chunks = v .chunk (tp , dim = 1 )
376369 for r in range (tp ):
@@ -483,13 +476,9 @@ def _merge_tp(self, shards):
483476 elif "out_proj.weight" in k :
484477 merged [k ] = torch .cat (vals , dim = 1 )
485478 elif "linear_qkv.weight" in k :
486- heads_per_group = cfg .num_attention_heads // cfg .num_query_groups
487- if cfg .attention_output_gate :
488- total_hpg = 2 * heads_per_group + 2
489- else :
490- total_hpg = heads_per_group + 2
491- viewed = [x .view (- 1 , total_hpg , cfg .kv_channels , cfg .hidden_size ) for x in vals ]
492- merged [k ] = torch .cat (viewed , dim = 0 ).view (- 1 , cfg .hidden_size )
479+ # TP split is a simple contiguous dim-0 chunk, so merge is
480+ # just concatenation along dim 0.
481+ merged [k ] = torch .cat (vals , dim = 0 )
493482 elif "linear_proj.weight" in k :
494483 merged [k ] = torch .cat (vals , dim = 1 )
495484 elif "q_layernorm" in k or "k_layernorm" in k :
@@ -566,7 +555,7 @@ def _adjust_embedding(self, meg_sd, ref_dir):
566555 # -------------------------------------------------------------------------
567556 # Public run methods
568557 # -------------------------------------------------------------------------
569- def run_hf2meg (self , hf_dir , save_dir , ref_dir = None ):
558+ def run_hf2meg (self , hf_dir , save_dir , ref_dir = None , skip_value = False ):
570559 """Run HF -> Megatron conversion and save release checkpoint."""
571560 cfg = self .cfg
572561 hf_dir = ensure_hf_path (hf_dir )
@@ -596,11 +585,11 @@ def run_hf2meg(self, hf_dir, save_dir, ref_dir=None):
596585 print (f"Saved release checkpoint to { os .path .join (save_dir , 'release' )} " )
597586
598587 if ref_dir :
599- success = validate_hf2meg_against_ref (shards_dict , cfg , ref_dir )
588+ success = validate_hf2meg_against_ref (shards_dict , cfg , ref_dir , skip_value = skip_value )
600589 return success
601590 return True
602591
603- def run_meg2hf (self , meg_dir , save_dir , ref_dir = None ):
592+ def run_meg2hf (self , meg_dir , save_dir , ref_dir = None , skip_value = False ):
604593 """Run Megatron -> HF conversion and save safetensors."""
605594 cfg = self .cfg
606595 pp_merged = {}
@@ -631,7 +620,7 @@ def run_meg2hf(self, meg_dir, save_dir, ref_dir=None):
631620 print (f"Saved HF checkpoint to { save_dir } " )
632621
633622 if ref_dir :
634- success = validate_meg2hf_against_ref (hf_sd , cfg , ref_dir )
623+ success = validate_meg2hf_against_ref (hf_sd , cfg , ref_dir , skip_value = skip_value )
635624 return success
636625 return True
637626
@@ -655,7 +644,7 @@ class MoEConverter(BaseConverter):
655644 def __init__ (self , cfg : Config , adjust_embedding = False ):
656645 super ().__init__ (cfg , adjust_embedding = adjust_embedding )
657646
658- def run_hf2meg (self , hf_dir , save_dir , ref_dir = None ):
647+ def run_hf2meg (self , hf_dir , save_dir , ref_dir = None , skip_value = False ):
659648 cfg = self .cfg
660649 print (f"Loading HF weights from { hf_dir } ..." )
661650 hf_sd = load_hf_weights (hf_dir )
@@ -685,14 +674,14 @@ def run_hf2meg(self, hf_dir, save_dir, ref_dir=None):
685674 save_megatron_release_checkpoint (shards_dict , save_dir , cfg )
686675 print (f"Saved release checkpoint to { os .path .join (save_dir , 'release' )} " )
687676
688- if ref_dir and cfg .ep == 1 :
689- success = validate_hf2meg_against_ref (shards_dict , cfg , ref_dir , use_ep = True )
677+ if ref_dir :
678+ success = validate_hf2meg_against_ref (
679+ shards_dict , cfg , ref_dir , use_ep = True , skip_value = skip_value
680+ )
690681 return success
691- elif ref_dir :
692- print ("Validation against reference checkpoint is only supported for EP=1; skipping." )
693682 return True
694683
695- def run_meg2hf (self , meg_dir , save_dir , ref_dir = None ):
684+ def run_meg2hf (self , meg_dir , save_dir , ref_dir = None , skip_value = False ):
696685 cfg = self .cfg
697686 pp_merged = {}
698687 for pp_rank in range (cfg .pp ):
@@ -726,6 +715,6 @@ def run_meg2hf(self, meg_dir, save_dir, ref_dir=None):
726715 print (f"Saved HF checkpoint to { save_dir } " )
727716
728717 if ref_dir :
729- success = validate_meg2hf_against_ref (hf_sd , cfg , ref_dir )
718+ success = validate_meg2hf_against_ref (hf_sd , cfg , ref_dir , skip_value = skip_value )
730719 return success
731720 return True
0 commit comments