dense_rank_list: tuple[int, ...] | None,
) -> None:
"""Build the expert-parallel FSDP mesh when expert parallelism is enabled."""
self.fsdp_moe_mesh = None
if self.ep_size <= 1:
return
expert_domain_size = math.prod(self.device_mesh.mesh_shape)
if expert_domain_size % self.ep_size != 0:
raise ValueError(
f"expert domain size ({expert_domain_size}) must be divisible by "
f"ep_size ({self.ep_size})"
)
edp_size = expert_domain_size // self.ep_size
if edp_size % self.edp_shard_size != 0:
raise ValueError(
f"expert data-parallel size ({edp_size}) must be divisible by "
f"edp_shard_size ({self.edp_shard_size})"
)
edp_replicate_size = edp_size // self.edp_shard_size
expert_mesh_shape = (
(edp_replicate_size, self.edp_shard_size, self.ep_size)
if edp_replicate_size > 1
else (self.edp_shard_size, self.ep_size)
)
expert_mesh_names = (
("edp_replicate", "edp_shard", "ep")
if edp_replicate_size > 1
else ("edp_shard", "ep")
)
expert_mesh_kwargs = {
"device_type": device_type,
"mesh_shape": expert_mesh_shape,
"mesh_dim_names": expert_mesh_names,
"init_backend": init_backend,