[DEV] fix(megatron-fsdp): reduce padding for grouped expert weights - #4980
[DEV] fix(megatron-fsdp): reduce padding for grouped expert weights#4980xuwchen wants to merge 2 commits into
Conversation
|
This PR has been automatically converted to draft because all PRs must start as drafts. When you are ready for review, click Ready for Review to begin the review process. This will:
See the contribution guide for more details. |
wujingyue
left a comment
There was a problem hiding this comment.
Could you add a unit test? These algorithmic changes are easy to regress without test coverage guarding them. The unit test can be something like https://github.com/NVIDIA/Megatron-LM/pull/4835/changes#diff-f1aaffa52ab9eab0c69292e44285ebb8c9387f1c3ebd62191d82920b5817cccbR110 and doesn't have to run FSDP end-to-end.
|
|
||
| is_expert_parameter = lambda n, p: ".experts." in n | ||
|
|
||
| def _get_csf_base(group: ParameterGroup, param: torch.nn.Parameter) -> int: |
There was a problem hiding this comment.
| def _get_csf_base(group: ParameterGroup, param: torch.nn.Parameter) -> int: | |
| def _get_chunk_size_factor_base(group: ParameterGroup, param: torch.nn.Parameter) -> int: |
Also, you only need an is_expert_param boolean instead of the entire ParameterGroup.
There was a problem hiding this comment.
Addressed in #5013 (the continuation PR). Variable naming uses the full param_chunk_size_factor. _get_csf_base is also removed and replaced by _should_split_from_grouped_expert_bucket, which takes is_expert_param: bool.
59f7018 to
be381b6
Compare
be381b6 to
4091ee6
Compare
4091ee6 to
e52d7dd
Compare
|
Continued in #5013. The original PR couldn't be reopened due to a force-push lock. The review feedback has been addressed in the new PR. |
main PR: #4979
What does this PR do ?
MFSDP computes a chunk size factor (CSF) for each bucket as
shape[1:].numel(), which flattens all dimensions except the first one.For per-expert 2D expert weights:
linear_fc1: (2 * moe_ffn_hidden_size, hidden_size)linear_fc2: (hidden_size, moe_ffn_hidden_size)shape[1:].numel()is just the last dimension, so the CSF stays small.For grouped 3D expert weights:
linear_fc1: (num_local_experts, 2 * moe_ffn_hidden_size, hidden_size)linear_fc2: (num_local_experts, hidden_size, moe_ffn_hidden_size)shape[1:].numel()becomes the full per-expert matrix size. This can make the CSF much larger than the equivalent per-expert 2D layout. When multiple expert weights share a bucket, MFSDP uses divisibility/LCM logic to choose a common CSF. The oversized CSF can force the bucket size to be padded to a much larger alignment unit, increasing AllGather traffic. In the reported configuration this matched the observed ~33% communication increase, corresponding to ~25% bucket padding.This PR routes grouped expert weights with heterogeneous CSFs into separate buckets via a new
_should_split_from_grouped_expert_buckethelper, while keeping the 2D / non-expert paths unchanged.Issue tracking
For PRs from open-source community contributors:
Linked issue:
Contribution process
Pre-checks
Code review
Feel free to message or comment @NVIDIA/mcore-oncall to help accelerate your merge into main. The less complex your PR is, the faster it will be approved and merged!
All PRs start as draft. If you open a non-draft PR, it will be automatically converted to draft.
Step 1: Mark PR as "Ready for Review"
.github/CODEOWNERS.Final Review might get declined if these requirements are not fulfilled.
Step 2: Final Review
For PRs that change
megatron/core, once all expert reviewers have approved, theFinal Reviewlabel is applied automatically and final reviewers are assigned.For PRs outside
megatron/core, this step is skipped.Step 3: Approved
Once all required reviewers have approved, the
Approvedlabel is applied automatically.Merge
Any member of mcore-engineers will be able to merge your PR.