@@ -858,6 +858,7 @@ def export_adapter_weights(
858858 cpu : bool = True ,
859859 show_progress : bool = True ,
860860 exclude_adapter_base_prefixes : Iterable [str ] | None = None ,
861+ expand_shared_outer : bool = False ,
861862 ) -> Iterable ["HFWeightTuple" ]:
862863 """
863864 Export only adapter weights from a Megatron model without merging them into base tensors.
@@ -871,16 +872,26 @@ def export_adapter_weights(
871872 show_progress: Display progress bar during export
872873 exclude_adapter_base_prefixes: Megatron adapter base prefixes to
873874 skip before resolving HuggingFace parameter mappings.
875+ expand_shared_outer: Replicate the shared factor across experts under per-expert
876+ names (vLLM 2D ``pack_moe``) instead of a shared ``[1, ...]`` tensor (SGLang).
877+ Default ``False``; no effect for non-shared-outer adapters.
874878
875879 Yields:
876880 HFWeightTuple: Named tuples of (param_name, weight_tensor) for adapter parameters
881+
882+ Note:
883+ With ``expand_shared_outer``, the per-expert copies of the shared factor alias one
884+ storage rather than being cloned. ``safetensors.torch.save_file`` rejects tensors
885+ that share memory, so callers serializing these tensors directly must clone them
886+ first — :meth:`save_hf_adapter` already does.
877887 """
878888 bridge = self ._model_bridge
879889 return bridge .stream_adapter_weights_megatron_to_hf (
880890 model ,
881891 cpu = cpu ,
882892 show_progress = show_progress ,
883893 exclude_adapter_base_prefixes = exclude_adapter_base_prefixes ,
894+ expand_shared_outer = expand_shared_outer ,
884895 )
885896
886897 def save_hf_adapter (
@@ -891,6 +902,7 @@ def save_hf_adapter(
891902 base_model_name_or_path : Optional [str ] = None ,
892903 show_progress : bool = True ,
893904 exclude_adapter_base_prefixes : Iterable [str ] | None = None ,
905+ expand_shared_outer : bool = False ,
894906 ) -> None :
895907 """Save LoRA adapter weights as a HuggingFace PEFT-compatible directory.
896908
@@ -909,6 +921,8 @@ def save_hf_adapter(
909921 show_progress: Display progress bar during export.
910922 exclude_adapter_base_prefixes: Megatron adapter base prefixes to
911923 skip before resolving HuggingFace parameter mappings.
924+ expand_shared_outer: Replicate the shared factor across experts under per-expert
925+ names (vLLM 2D ``pack_moe``). Default ``False`` keeps the PEFT shared ``[1, ...]`` layout.
912926
913927 Example:
914928 >>> bridge.save_hf_adapter(
@@ -949,6 +963,7 @@ def save_hf_adapter(
949963 cpu = True ,
950964 show_progress = show_progress ,
951965 exclude_adapter_base_prefixes = exclude_adapter_base_prefixes ,
966+ expand_shared_outer = expand_shared_outer ,
952967 )
953968 ]
954969 if not raw_adapter_weights :
@@ -1561,6 +1576,7 @@ def export_adapter_ckpt(
15611576 output_path : str | Path ,
15621577 show_progress : bool = True ,
15631578 exclude_adapter_base_prefixes : Iterable [str ] | None = None ,
1579+ expand_shared_outer : bool = False ,
15641580 ) -> None :
15651581 """Export LoRA adapter weights from a Megatron PEFT checkpoint to HuggingFace PEFT format.
15661582
@@ -1582,6 +1598,10 @@ def export_adapter_ckpt(
15821598 show_progress: Display progress bar during export.
15831599 exclude_adapter_base_prefixes: Megatron adapter base prefixes to
15841600 skip before resolving HuggingFace parameter mappings.
1601+ expand_shared_outer: Replicate the shared factor across experts under per-expert
1602+ names (vLLM 2D ``pack_moe``). Default ``False`` keeps the PEFT shared ``[1, ...]``
1603+ layout. Enabling it multiplies the shared factor's on-disk size by the expert
1604+ count; no effect for non-shared-outer adapters.
15851605
15861606 Example:
15871607 >>> bridge = AutoBridge.from_hf_pretrained("meta-llama/Llama-3.2-1B")
@@ -1689,6 +1709,7 @@ def _load_and_export_adapter(model):
16891709 base_model_name_or_path = base_model_name ,
16901710 show_progress = show_progress ,
16911711 exclude_adapter_base_prefixes = exclude_adapter_base_prefixes ,
1712+ expand_shared_outer = expand_shared_outer ,
16921713 )
16931714
16941715 model_context = (
0 commit comments