| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
[Feature] Support fused moe Co-authored-by: betta18<jiangmengyu1@huawei.com> # message auto-generated for no-merge-commit merge: !310 merge support_fused_moe_new into dev [Feature] Support fused moe Created-by: betta18 Commit-by: betta18 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251224 --> # Which issue(s) this PR fixes or accomplishes Fix part of #ISSUE ID # Purpose 本 PR 新增 MindIE-SD 的 fused_moe 融合算子接口,用于支持开源框架在 NPU 上执行 MoE 前向计算。当前 PR 接入的是 fused_moe 的 fallback 路径,已基于 vllm-omni 中 HunyuanImage-3.0 模型的 MindIE-SD MoE 组网路径完成适配验证。 当前 fused_moe 对外提供统一入口,并区分两条执行路径: - **融合算子路径**:预留融合 MoE 算子入口,当前版本暂不支持。 - **fallback 路径**:本 PR 接入的执行路径,用于完成 MoE 路由、专家计算和结果合并流程。 fallback 路径将 MoE 前向过程拆分为多个阶段: - prepare:整理输入激活和 router logits,并根据输入 layout 准备后续计算所需的数据。 - select_experts:根据 router 输出,为每个 token 选择对应的 top-k experts,并生成 routing weights。 - dispatch:根据专家选择结果,将 token 按 expert 路由并重排,生成专家计算所需的输入。 - mlp:执行专家侧 grouped MLP 计算,完成 routed experts 的前馈计算。 - combine:将专家输出按原 token 顺序合并,恢复 routed MoE 的输出结果。 - finalize:完成输出恢复和通信后的收尾处理。 通过 fallback 路径的阶段化封装,外部调用方只需要使用 fused_moe 统一入口,即可完成当前版本支持的 MoE 前向计算流程。 主要修改包括: - 新增并导出 fused_moe 融合算子接口。 - 预留融合 MoE 算子路径,并接入 fallback 路径作为当前执行实现。 - 新增 mindiesd.layers.moe 阶段化 MoE fallback 实现。 - 新增 runtime context 处理逻辑,用于集中校验外部入参、生成通信上下文并封装各阶段输入对象。 - 新增专家选择逻辑,支持 top-k routing、routing weight 归一化和自定义 routing function。 - 新增 static dispatcher,用于完成静态 token 分发、expert token 统计和结果恢复。 - 新增 dynamic dispatcher,用于完成动态 token 分发、all-to-all token 交换和结果恢复。 - 新增 grouped expert MLP 计算逻辑,基于 torch_npu.npu_grouped_matmul 完成专家前馈计算。 - 新增 MoE 通信上下文和基础通信算子封装。 - 扩展 NPU 平台识别,新增 A3 平台,并使相关 MoE/attention 路径能够识别 A3。 - 新增 fused_moe 中文特性文档,补充接口说明、参数约束、融合算子路径、fallback 路径、通信配置和使用示例。 后续计划: - 性能优化。 - 支持量化。 # Test Plan 测试重点包括: - fused_moe 入口: - 融合算子路径当前版本暂不支持时回退到 fallback 路径。 - fallback 路径调用阶段化 MoE 实现。 - fallback moe 主流程: - static dispatcher 路径。 - dynamic dispatcher 路径。 - 无通信组、TP 通信组、EP 通信组场景。 - runtime context: - 外部输入参数校验。 - prepare、routing、dispatch、MLP compute 阶段输入对象封装。 - MoE 通信上下文选择。 - 专家选择: - top-k expert 选择。 - top-k weight 归一化。 - 自定义 routing function。 - token dispatch/combine: - static dispatch 的 token 排序、expert token 统计和结果恢复。 - dynamic dispatch 的 all-to-all token 交换和顺序恢复。 - grouped expert MLP: - w13 / w2 两阶段 grouped matmul。 - bias 路径。 - swiglu activation。 - 通信算子: - all-gather。 - reduce-scatter。 - all-reduce。 - all-to-all single。 - 精度测试: - 对比 static MoE 输出与参考实现结果的一致性。 - 对比 grouped expert MLP 输出与参考实现结果的一致性。 - 验证 HunyuanImage-3.0 MindIE-SD MoE 组网路径下的推理结果正确性。 # Test Report 在 MindIE-SD 中新增 MoE 相关单元测试,主要覆盖 fallback 路径中的通信算子、专家选择、runtime context、主流程、专家 MLP 计算和 token dispatch/combine 等核心逻辑: - tests/layers/moe/test_comm_ops.py - tests/layers/moe/test_experts_selector.py - tests/layers/moe/test_runtime_context.py - tests/layers/moe/test_moe.py - tests/layers/moe/test_moe_mlp.py - tests/layers/moe/test_token_dispatcher.py 在 vllm-omni 框架中,基于 HunyuanImage-3.0 的 MindIE-SD MoE 组网路径完成端到端推理验证,结果正确。验证覆盖: - EP / TP 通信场景。 - static / dynamic dispatcher 路径。 - tokens_full 不同输入 layout。 - reduce_results 不同结果规约配置。 See merge request: Ascend/MindIE-SD!310 | 2 个月前 | |
[Feature][moe]Support W8A8 MXFP8 MoE inference Co-authored-by: betta18<jiangmengyu1@huawei.com> # message auto-generated for no-merge-commit merge: !354 merge support_fused_moe_mxfp8 into dev [Feature][moe]Support W8A8 MXFP8 MoE inference Created-by: betta18 Commit-by: betta18 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251224 --> # Purpose 本 PR 为 MindIE-SD MoE 接入 W8A8 MXFP8 量化推理能力,用于支持 A5 设备上的 MoE 前向计算。 主要修改包括: - 扩展 MoE 量化上下文,新增 W8A8 MXFP8 量化算法识别、设备约束校验和动态量化入口。 - 在 MoE MLP 阶段新增 W8A8 MXFP8 grouped MLP 计算路径,使用 npu_grouped_matmul_swiglu_quant_v2 和 MXFP scale 完成专家侧计算。 - 调整 static / dynamic dispatcher 的量化处理逻辑: - static MoE 支持 MXFP8 init routing 量化模式; - dynamic MoE 中 MXFP8 延后到 MLP 阶段量化,避免通信阶段处理不适配的 scale layout。 - 补充 A2/A3 INT8 与 A5 MXFP8 的设备区分校验,避免不支持设备误走量化路径。 - 更新 fused_moe 中文特性文档,补充 W8A8 dynamic quant 和 W8A8 MXFP8 quant 的支持范围、参数说明和使用示例。 # Test Plan 测试重点包括: - MoE 量化上下文: - W8A8 dynamic quant / W8A8 MXFP8 quant / 非量化配置解析。 - A2/A3/A5 设备支持范围校验。 - init routing quant mode 选择逻辑。 - MoE MLP: - 非量化 grouped MLP 路径。 - W8A8 dynamic quant grouped MLP 路径。 - W8A8 MXFP8 grouped MLP 路径。 - 内部动态量化输入与外部预量化输入结果一致性。 - Token dispatcher: - static dispatcher 下 INT8 / MXFP8 量化 dispatch 行为。 - dynamic dispatcher 下 INT8 提前量化、MXFP8 延后到 MLP 量化的行为。 - prequantized input 与 internal quant input 的 dispatch 结果一致性。 - 主流程: - W8A8 dynamic quant MoE 输出 shape / dtype。 - W8A8 MXFP8 quant MoE 输出 shape / dtype。 # Test Report 在 MindIE-SD 中新增和更新 MoE 相关单元测试,覆盖量化上下文、MLP 计算、token dispatch 和主流程: - tests/layers/moe/test_moe_context.py - tests/layers/moe/test_moe_mlp.py - tests/layers/moe/test_token_dispatcher.py - tests/layers/moe/test_moe.py - tests/layers/moe/common.py 测试覆盖设备区分: - 非量化路径:CPU / NPU 兼容测试。 - W8A8 dynamic quant:A2 / A3 设备测试。 - W8A8 MXFP8 quant:A5 设备测试。 已补充 docs/zh/features/fused_moe.md,说明当前支持非量化、W8A8 dynamic quant 和 W8A8 MXFP8 quant MoE 路径。 See merge request: Ascend/MindIE-SD!354 | 1 个月前 | |
[Feature][moe]Support NPU moe_gating_top_k and moe_gating_top_k_softmax in fused MoE module Co-authored-by: betta18<jiangmengyu1@huawei.com> # message auto-generated for no-merge-commit merge: !318 merge support_fused_softmax_topk into dev [Feature][moe]Support NPU moe_gating_top_k and moe_gating_top_k_softmax in fused MoE module Created-by: betta18 Commit-by: betta18 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251224 --> # Which issue(s) this PR fixes or accomplishes N/A - 内部特性开发,无对应 Issue。 # Purpose 在 fused_moe 模块中接入 torch_npu.npu_moe_gating_top_k 和 torch_npu.npu_moe_gating_top_k_softmax 两个 CANN 算子, 替代原先 Python 端 softmax/sigmoid + topk 组合实现, 将专家选择阶段下沉到 NPU,提升路由效率。 算子选择策略: - **npu_moe_gating_top_k_softmax**:应用于 softmax 非分组路由 (routing_method="softmax" 且分组路由参数为默认值),接口更轻量; - **npu_moe_gating_top_k**:应用于 sigmoid 路由或分组路由场景, 完整支持分组路由等高级功能。 性能对比(softmax + topk 组合,num_tokens=256, num_experts=64, top_k=8): - 小算子实现(softmax + topk 分步执行):114 us - 融合算子实现(npu_moe_gating_top_k_softmax):61 us - 加速比:**约 1.87x** 同时新增以下能力: - **分组路由**:通过 k_group、group_count、group_select_mode 参数支持 先选 expert group、再从选中 group 选 top-k experts 的路由策略; - **路由方法**:routing_method 参数支持 softmax 和 sigmoid 两种打分方式; - **参数校验**:validate_moe_inputs 中新增分组路由相关边界校验; - **测试覆盖**:新增 NPU gating top-k 算子与 PyTorch 参考实现的一致性测试, 覆盖 softmax/sigmoid、分组/非分组、group_select_mode 0/1 共 4 种路由组合, 并新增 test_gating_topk_softmax_matches_torch_reference 专门验证 softmax 非分组路径在各种输入形状下的正确性。 此外,将 MoE 测试环境按 CPU 兼容和 NPU 依赖拆分: - CPU 兼容测试(MINDIE_TEST_MODE=CPU 跳过)仅验证 custom_routing_function 路径和参数校验逻辑; - NPU 依赖测试(MINDIE_TEST_MODE=NPU 跳过)验证算子与参考实现的一致性, 使 CI 可在无 NPU 环境下运行部分测试。 # Test Plan 1. **CPU 兼容测试**(MINDIE_TEST_MODE=CPU):验证 custom_routing_function 路径 和参数校验逻辑; 2. **NPU 依赖测试**(MINDIE_TEST_MODE=NPU):验证 NPU gating top-k 算子输出与 torch_grouped_topk_reference 参考实现的一致性,包括两种算子的各条路径; 3. **E2E 前向测试**:test_moe.py 中静态 MoE NPU 全流程前向测试; 4. **参数校验测试**:test_moe_context.py 中新增 routing_method、k_group、 group_count、group_select_mode 非法值校验。 # Test Report 已在 NPU 环境执行测试,结果如下: - TestExpertsSelectorNPU.test_gating_topk_matches_torch_reference:PASS (softmax、grouped_softmax、sigmoid、grouped_sigmoid 4 个子 case 全部通过) - TestExpertsSelectorNPU.test_gating_topk_softmax_matches_torch_reference:PASS (B=2/4/1/3, num_experts=8/16/32/64, top_k=2/4/1/8 共 4 种形状组合全部通过) - TestMoeFunction.test_static_moe_matches_torch_reference:PASS (top_k=1 和 top_k=2 两个子 case 全部通过,atol=5e-2, rtol=5e-2) - TestMoEContext 参数校验测试:PASS - TestExpertsSelector.test_custom_router_output_is_forwarded:PASS(CPU 通路) See merge request: Ascend/MindIE-SD!318 | 2 个月前 | |
[Refactor][moe] Clarify dispatcher token-sharding semantics Co-authored-by: betta18<jiangmengyu1@huawei.com> # message auto-generated for no-merge-commit merge: !490 merge refactor_moe_dispatcher_api into dev [Refactor][moe] Clarify dispatcher token-sharding semantics Created-by: betta18 Commit-by: betta18 Merged-by: ascend-robot Description: # Which issue(s) this PR fixes or accomplishes https://gitcode.com/Ascend/MindIE-SD/issues/284 # Purpose Refactor the MoE dispatcher API to make token-sharding and routed-output reduction semantics explicit. - Require top_k when resolving the default MoE dispatcher. - Rename tokens_full to inputs_sharded. - Rename reduce_results to reduce_routed_out. - Add return_dispatcher_type to fused_moe and moe so callers can obtain the resolved static or dynamic dispatcher type together with the output. - Update static and dynamic dispatcher comments and fused-MoE documentation. - Include the MoE communication-group size in the one-time configuration log. - Simplify and align MoE unit tests with the updated API. This PR does not retain the old tokens_full and reduce_results parameter names. # Test Plan A3: .png') 950PR: .png') See merge request: Ascend/MindIE-SD!490 | 2 天前 | |
[Refactor][moe] Clarify dispatcher token-sharding semantics Co-authored-by: betta18<jiangmengyu1@huawei.com> # message auto-generated for no-merge-commit merge: !490 merge refactor_moe_dispatcher_api into dev [Refactor][moe] Clarify dispatcher token-sharding semantics Created-by: betta18 Commit-by: betta18 Merged-by: ascend-robot Description: # Which issue(s) this PR fixes or accomplishes https://gitcode.com/Ascend/MindIE-SD/issues/284 # Purpose Refactor the MoE dispatcher API to make token-sharding and routed-output reduction semantics explicit. - Require top_k when resolving the default MoE dispatcher. - Rename tokens_full to inputs_sharded. - Rename reduce_results to reduce_routed_out. - Add return_dispatcher_type to fused_moe and moe so callers can obtain the resolved static or dynamic dispatcher type together with the output. - Update static and dynamic dispatcher comments and fused-MoE documentation. - Include the MoE communication-group size in the one-time configuration log. - Simplify and align MoE unit tests with the updated API. This PR does not retain the old tokens_full and reduce_results parameter names. # Test Plan A3: .png') 950PR: .png') See merge request: Ascend/MindIE-SD!490 | 2 天前 | |
[Refactor][moe] Clarify dispatcher token-sharding semantics Co-authored-by: betta18<jiangmengyu1@huawei.com> # message auto-generated for no-merge-commit merge: !490 merge refactor_moe_dispatcher_api into dev [Refactor][moe] Clarify dispatcher token-sharding semantics Created-by: betta18 Commit-by: betta18 Merged-by: ascend-robot Description: # Which issue(s) this PR fixes or accomplishes https://gitcode.com/Ascend/MindIE-SD/issues/284 # Purpose Refactor the MoE dispatcher API to make token-sharding and routed-output reduction semantics explicit. - Require top_k when resolving the default MoE dispatcher. - Rename tokens_full to inputs_sharded. - Rename reduce_results to reduce_routed_out. - Add return_dispatcher_type to fused_moe and moe so callers can obtain the resolved static or dynamic dispatcher type together with the output. - Update static and dynamic dispatcher comments and fused-MoE documentation. - Include the MoE communication-group size in the one-time configuration log. - Simplify and align MoE unit tests with the updated API. This PR does not retain the old tokens_full and reduce_results parameter names. # Test Plan A3: .png') 950PR: .png') See merge request: Ascend/MindIE-SD!490 | 2 天前 | |
[Bugfix][moe]Fix MoE dispatcher routing and W8A8 precision alignment Co-authored-by: betta18<jiangmengyu1@huawei.com> # message auto-generated for no-merge-commit merge: !382 merge fix_dispatcher_default_routing into dev [Bugfix][moe]Fix MoE dispatcher routing and W8A8 precision alignment Created-by: betta18 Commit-by: betta18 Merged-by: ascend-robot Description: # Which issue(s) this PR fixes or accomplishes Fix part of #ISSUE ID # Purpose 本 PR 修复 MindIE-SD MoE 默认 dispatcher 选择和 W8A8 dynamic quant 路径中的精度问题。 主要修改包括: - 调整 MoE 默认 dispatcher 选择逻辑: - 原默认路由参考 vllm-ascend 的机型选择策略:A2 默认 static dispatcher,A3/A5 默认 dynamic dispatcher。 - 该策略主要适配大 EP 场景,通常满足 top_k < ep_size,dynamic dispatcher 更容易发挥通信优势。 - 同时,由于 A2 跨机 all-to-all 通信劣化较明显,因此 vllm-ascend 中 A2 默认使用 static dispatcher。 - MindIE-SD 作为通用 MoE 接口,不再直接按机型选择 dispatcher,而是根据 top_k 与 ep_size 的关系选择默认路径。 - 在 tokens_full=False 场景下,static dispatcher 需要先通过 all-gather 将各 rank 的 local tokens 拼成 full tokens,再在 finalize 阶段通过 reduce-scatter 返回 rank-local 结果。设全局 token 数为 T,hidden size 为 H,EP size 为 P,每个 token 选择 K 个 experts,则 static dispatcher 单 rank 通信量近似为 2 * T * H。 - dynamic dispatcher 不需要提前聚合 full tokens,而是在 dispatch/combine 两个阶段按 expert 所属 rank 交换被路由命中的 token。平均分布下,单 rank 通信量近似为 2 * T * K / P * H,约为 static dispatcher 的 K / P。 - 因此,当 top_k < ep_size 时,dynamic dispatcher 通常具有更低通信量;当 top_k >= ep_size 时,dynamic dispatcher 的通信优势下降,默认选择 static dispatcher 更稳妥。 - 非 EP 场景默认走 static dispatcher。 - 修复专家路由权重 dtype 导致的精度问题: - select_experts 输出的 topk_weights 转为 hidden_states.dtype。 - 避免 routing weight dtype 与后续 dispatch/combine 计算 dtype 不一致导致的 MoE 输出精度偏差。 - 对齐 W8A8 dynamic quant 行为: - W8A8 dynamic quant 显式指定 dst_type=torch.int8。 - 覆盖 prepare、dynamic dispatch 和 MLP 内部量化兜底路径,避免默认量化 dtype 带来的精度差异。 - 同步更新 MoE 相关测试: - 更新默认 dispatcher 选择测试,覆盖 top_k < ep_size 走 dynamic、top_k >= ep_size 走 static。 - 增加 W8A8 dynamic quant 显式 dst_type=torch.int8 的测试断言。 - 更新 W8A8 dynamic MLP 预量化路径精度对齐测试。 # Test Plan 测试重点包括: - MoE dispatcher 默认选择逻辑: - 非 EP 场景默认 static。 - EP 场景下 top_k < ep_size 默认 dynamic。 - EP 场景下 top_k >= ep_size 默认 static。 - 显式 dispatcher_type 可覆盖默认选择。 - MoE routing: - topk_weights dtype 与输入激活 dtype 对齐。 - 验证 routing weight dtype 对 MoE 输出精度的影响已修复。 - W8A8 dynamic quant: - dynamic dispatcher 在 all-to-all 前显式执行 INT8 dynamic quant。 - static prepare 在 all-gather 前显式执行 INT8 dynamic quant。 - MLP 内部量化路径与外部预量化路径保持一致。 # Test Report 在 MindIE-SD 中更新 MoE 相关单元测试,覆盖 dispatcher 路由选择、W8A8 dynamic quant 参数传递和 MLP 预量化精度对齐等场景。 涉及测试文件: - tests/layers/moe/test_moe.py - tests/layers/moe/test_moe_mlp.py - tests/layers/moe/test_token_dispatcher.py See merge request: Ascend/MindIE-SD!382 | 1 个月前 | |
[Refactor][moe] Clarify dispatcher token-sharding semantics Co-authored-by: betta18<jiangmengyu1@huawei.com> # message auto-generated for no-merge-commit merge: !490 merge refactor_moe_dispatcher_api into dev [Refactor][moe] Clarify dispatcher token-sharding semantics Created-by: betta18 Commit-by: betta18 Merged-by: ascend-robot Description: # Which issue(s) this PR fixes or accomplishes https://gitcode.com/Ascend/MindIE-SD/issues/284 # Purpose Refactor the MoE dispatcher API to make token-sharding and routed-output reduction semantics explicit. - Require top_k when resolving the default MoE dispatcher. - Rename tokens_full to inputs_sharded. - Rename reduce_results to reduce_routed_out. - Add return_dispatcher_type to fused_moe and moe so callers can obtain the resolved static or dynamic dispatcher type together with the output. - Update static and dynamic dispatcher comments and fused-MoE documentation. - Include the MoE communication-group size in the one-time configuration log. - Simplify and align MoE unit tests with the updated API. This PR does not retain the old tokens_full and reduce_results parameter names. # Test Plan A3: .png') 950PR: .png') See merge request: Ascend/MindIE-SD!490 | 2 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 天前 | ||
| 2 天前 | ||
| 2 天前 | ||
| 1 个月前 | ||
| 2 天前 |