Skip to content

Commit ef50ab0

Browse files
committed
Per-layer expert count + MoE aux-loss tracker sizing (the NCCL-deadlock fix)
1 parent bf07e56 commit ef50ab0

2 files changed

Lines changed: 8 additions & 8 deletions

File tree

src/megatron/bridge/models/conversion/model_bridge.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,8 +290,7 @@ def _megatron_local_name_to_global(
290290
is_expert_param = (is_grouped_expert_param or is_local_expert_param) and ".adapter." not in param_name
291291
ep_group = _get_ep_group(models) if is_expert_param else None
292292
if is_expert_param and ep_group is not None and get_pg_size(ep_group) > 1:
293-
num_experts = config.num_moe_experts
294-
num_experts_per_rank = num_experts // ep_group.size()
293+
num_experts_per_rank = layer_module.mlp.num_local_experts # per-layer, heterogeneous-safe
295294

296295
def _update_grouped_expert_number(param_name: str, param_type: str) -> str:
297296
"""Update expert number from local to global for weight or bias parameters."""

src/megatron/bridge/training/utils/train_utils.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,10 +1041,11 @@ def training_log(
10411041
if getattr(config.model, "moe_z_loss_coeff", None) is not None:
10421042
track_names.append("z_loss")
10431043

1044-
if getattr(config.model, "is_hybrid_model", False):
1045-
layers = getattr(config.model, "hybrid_layer_pattern", "").count("E")
1046-
else:
1047-
layers = getattr(config.model, "num_layers", None)
1044+
num_layers = getattr(config.model, "num_layers", None)
1045+
moe_layer_freq = getattr(config.model, "moe_layer_freq", None)
1046+
pattern = getattr(config.model, "hybrid_layer_pattern", "") or ""
1047+
if moe_layer_freq is None and pattern: # per-layer averaging denominator
1048+
moe_layer_freq = [1 if c == "E" else 0 for c in pattern]
10481049

10491050
# Wrap the TB writer so MoE/MTP metrics also reach MLFlow / Comet (issue #2989).
10501051
# No-op when neither logger is configured: the original writer is returned as-is.
@@ -1058,8 +1059,8 @@ def training_log(
10581059
per_layer_logging=getattr(config.model, "moe_per_layer_logging", False),
10591060
force_initialize=True,
10601061
track_names=track_names,
1061-
num_layers=layers,
1062-
moe_layer_freq=getattr(config.model, "moe_layer_freq", None),
1062+
num_layers=num_layers,
1063+
moe_layer_freq=moe_layer_freq,
10631064
mtp_num_layers=getattr(config.model, "mtp_num_layers", None),
10641065
pg_collection=pg_collection,
10651066
)

0 commit comments

Comments
 (0)