@@ -450,6 +450,38 @@ def test_explicit_dropless_load_preserves_hybridep(
450450 assert built_config .moe_router_force_load_balancing is (not dropless )
451451 assert built_config .moe_router_force_biased == (None if dropless else forced_bias )
452452
453+ @pytest .mark .parametrize (
454+ ("expert_parallel_size" , "expected_dispatcher" , "expected_overlap" ),
455+ [(1 , "allgather" , False ), (2 , "flex" , True )],
456+ )
457+ def test_single_rank_flex_fallback_disables_shared_expert_overlap (
458+ self , expert_parallel_size , expected_dispatcher , expected_overlap
459+ ):
460+ """Single-rank loads replace flex with allgather, which does not support shared-expert overlap."""
461+ provider = GPTModelProvider (
462+ num_layers = 2 ,
463+ hidden_size = 16 ,
464+ num_attention_heads = 2 ,
465+ num_moe_experts = 2 ,
466+ moe_shared_expert_intermediate_size = 16 ,
467+ moe_shared_expert_overlap = True ,
468+ moe_token_dispatcher_type = "flex" ,
469+ moe_flex_dispatcher_backend = "hybridep" ,
470+ )
471+
472+ def finalize_before_build (checkpoint_path , model_cfg , * args , ** build_kwargs ):
473+ model_cfg .finalize ()
474+ return []
475+
476+ with (
477+ patch .object (model_load_save , "load_model_config" , return_value = (provider , None )),
478+ patch .object (model_load_save , "build_and_load_model" , side_effect = finalize_before_build ),
479+ ):
480+ load_megatron_model ("/checkpoint" , mp_overrides = {"expert_model_parallel_size" : expert_parallel_size })
481+
482+ assert provider .moe_token_dispatcher_type == expected_dispatcher
483+ assert provider .moe_shared_expert_overlap is expected_overlap
484+
453485 def test_load_model_config_preserves_finalized_pipeline_layout (self , tmp_path ):
454486 """Verify native checkpoints retain a finalized custom pipeline layout."""
455487 provider = GPTModelProvider (num_layers = 2 , hidden_size = 16 , num_attention_heads = 2 )
0 commit comments