文件最后提交记录最后更新时间
gmmalltoallv增加通信引擎说明 Co-authored-by: huangshuai<huangshuai59@huawei.com> # message auto-generated for no-merge-commit merge: !5075 merge dts into master gmmalltoallv增加通信引擎说明 Created-by: huangshuai59 Commit-by: huangshuai Merged-by: cann-robot Description: ## 描述 gmmalltoallv增加通信引擎说明 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2315 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 https://gitcode.com/cann/ops-transformer/blob/master/mc2/quant_grouped_mat_mul_allto_allv/README.md https://gitcode.com/cann/ops-transformer/blob/master/mc2/quant_grouped_mat_mul_allto_allv/docs/aclnnQuantGroupedMatMulAlltoAllv.md https://gitcode.com/cann/ops-transformer/blob/master/mc2/grouped_mat_mul_allto_allv/README.md https://gitcode.com/cann/ops-transformer/blob/master/mc2/grouped_mat_mul_allto_allv/docs/aclnnGroupedMatMulAlltoAllv.md ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!507517 天前
tiling增加命名空间&examples增加执行成功日志 Co-authored-by: huangshuai<huangshuai59@huawei.com> # message auto-generated for no-merge-commit merge: !3076 merge master into master tiling增加命名空间&examples增加执行成功日志 Created-by: huangshuai59 Commit-by: huangshuai Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!30761 个月前
quantgroupedmatmulalltoallv算子性能优化 Co-authored-by: huangshuai<huangshuai59@huawei.com> # message auto-generated for no-merge-commit merge: !4688 merge master into master quantgroupedmatmulalltoallv算子性能优化 Created-by: huangshuai59 Commit-by: huangshuai Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: # PR 4688 代码检视报告 **PR链接**: https://gitcode.com/cann/ops-transformer/pull/4688 **PR描述**: quantgroupedmatmulalltoallv算子性能优化 **检视日期**: 2026-04-27 **检视工具**: ascendc-code-review --- ## 一、变更概述 本PR是一个merge commit,包含以下两个文件的修改: | 文件路径 | 变行数 | 变类型 | |---------|--------|--------| | mc2/allto_allv_quant_grouped_mat_mul/op_kernel/mc2_templates/scheduler/gmm_a2av_scheduler.h | -1行 | 删除冗余同步调用 | | mc2/quant_grouped_mat_mul_allto_allv/op_api/aclnn_quant_grouped_mat_mul_allto_allv.cpp | +41行 | 新增TT量化转置处理 | --- ## 二、详细检视意见 ### 2.1 gmm_a2av_scheduler.h **变更内容**:删除了 Process() 函数中循环结束后多余的 SyncAll<false>() 调用。 ```cpp // 变前(master): for (uint32_t expertIdx = 0U; expertIdx < expertNumInOneRank; expertIdx++) { computeOp_.Process(expertIdx); SyncAll<false>(); hcclOp_.Launch(expertIdx, 1); // 每次专家数量设置为1 } SyncAll<false>(); // <-- 删除这行 if (IsNeedMM) { shareComputeOp_.Process(0); SyncAll<false>(); } ``` **检视结论**: ✅ **通过** **分析**: - 循环内每次迭代都调用了 SyncAll<false>(),确保computeOp和hcclOp之间的同步 - 循环结束后紧接 if (IsNeedMM) 分支,该分支内有自己的 SyncAll<false>() - 当 IsNeedMM=false 时,循环后的 SyncAll<false>() 是多余的,因为最后一次迭代已完成同步 - 删除冗余调用可减少不必要的同步开销,提升性能 --- ### 2.2 aclnn_quant_grouped_mat_mul_allto_allv.cpp #### 2.2.1 缺少入口调试日志 【一般】 **问题描述**: 新增的TT量化转置处理函数缺少入口调试日志,与对应MX版本函数风格不一致。 **对比分析**: | 函数 | 量化类型 | 入口日志 | |------|----------|----------| | HandleGmmMxTranspose(weight, scale, transWeight) | MX | ✅ 有 OP_LOGD("gmmWeight notContiguous=%d...") | | HandleGmmTtTranspose(weight, transWeight) | TT | ❌ **缺少** | | HandleMmMxTranspose(weight, scale, transWeight) | MX | ✅ 有 OP_LOGD("mmWeight notContiguous=%d...") | | HandleMmTtTranspose(weight, transWeight) | TT | ❌ **缺少** | ```cpp // MX版本有入口日志: static aclnnStatus HandleGmmMxTranspose(...) { bool notContiguous = IsTransposeLastTwoDims(weight); OP_LOGD("gmmWeight notContiguous=%d, transWeight(before)=%d", notContiguous, transWeight); // ✓ ... } // TT版本缺少入口日志: static aclnnStatus HandleGmmTtTranspose(const aclTensor *&weight, bool &transWeight) { bool notContiguous = IsTransposeLastTwoDims(weight); // ❌ 缺少 OP_LOGD 入口日志 if (notContiguous && transWeight) { ... } ``` **建议修改**: 在TT量化函数入口处添加调试日志,保持与MX版本的一致性,便于问题排查。 ```cpp static aclnnStatus HandleGmmTtTranspose(const aclTensor *&weight, bool &transWeight) { bool notContiguous = IsTransposeLastTwoDims(weight); OP_LOGD("gmmWeight notContiguous=%d, transWeight(before)=%d", notContiguous, transWeight); // 建议添加 ... } static aclnnStatus HandleMmTtTranspose(const aclTensor *&weight, bool &transWeight) { bool notContiguous = IsTransposeLastTwoDims(weight); OP_LOGD("mmWeight notContiguous=%d, transWeight(before)=%d", notContiguous, transWeight); // 建议添加 ... } ``` --- #### 2.2.2 TT量化分支缺少最终状态日志 【建议】 **问题描述**: MX量化分支在处理结束后打印了最终的 transGmmWeight/transMmWeight 值,但TT量化分支缺少类似的日志。 ```cpp // MX量化分支有最终日志: if (isMxQuant) { OP_LOGD("MX quant mode: transGmmWeight(input)=%d, transMmWeight(input)=%d", ...); // ... 处理逻辑 OP_LOGD("Final: transGmmWeight=%d, transMmWeight=%d", transGmmWeight, transMmWeight); // ✓ } // TT量化分支缺少最终日志: bool isTtQuant = (gmmXQuantMode == static_cast<int64_t>(QuantModeType::PERTENSOR_QUANT)); if (isTtQuant) { auto transRet = HandleGmmTtTranspose(gmmWeight, transGmmWeight); CHECK_RET(transRet == ACLNN_SUCCESS, transRet); if (mmWeightOptional != nullptr) { transRet = HandleMmTtTranspose(mmWeightOptional, transMmWeight); CHECK_RET(transRet == ACLNN_SUCCESS, transRet); } // ❌ 缺少最终日志 } ``` **建议修改**: 在TT量化分支结束后添加类似的日志输出。 ```cpp if (isTtQuant) { OP_LOGD("TT quant mode: transGmmWeight(input)=%d, transMmWeight(input)=%d", transGmmWeight, transMmWeight); auto transRet = HandleGmmTtTranspose(gmmWeight, transGmmWeight); CHECK_RET(transRet == ACLNN_SUCCESS, transRet); if (mmWeightOptional != nullptr) { transRet = HandleMmTtTranspose(mmWeightOptional, transMmWeight); CHECK_RET(transRet == ACLNN_SUCCESS, transRet); } OP_LOGD("TT quant: Final transGmmWeight=%d, transMmWeight=%d", transGmmWeight, transMmWeight); // 建议添加 } ``` --- #### 2.2.3 函数实现逻辑正确性检查 ✅ **通过** **新增函数分析**: ```cpp static aclnnStatus HandleGmmTtTranspose(const aclTensor *&weight, bool &transWeight) { bool notContiguous = IsTransposeLastTwoDims(weight); if (notContiguous && transWeight) { OP_LOGE(ACLNN_ERR_PARAM_INVALID, "gmmWeight not contiguous and transGmmWeight is already set!"); return ACLNN_ERR_PARAM_INVALID; } if (notContiguous && op::GetCurrentPlatformInfo().GetCurNpuArch() == NpuArch::DAV_3510) { weight = SwapTensorDims(weight, 1, 2); // gmmWeight swap dim[1]/dim[2] CHECK_RET(weight != nullptr, ACLNN_ERR_INNER_NULLPTR); transWeight = !transWeight; OP_LOGD("gmmWeight transposed detected: transWeight flipped to %d", transWeight); } return ACLNN_SUCCESS; } static aclnnStatus HandleMmTtTranspose(const aclTensor *&weight, bool &transWeight) { bool notContiguous = IsTransposeLastTwoDims(weight); if (notContiguous && transWeight) { OP_LOGE(ACLNN_ERR_PARAM_INVALID, "mmWeight not contiguous and transMmWeight is already set!"); return ACLNN_ERR_PARAM_INVALID; } if (notContiguous && op::GetCurrentPlatformInfo().GetCurNpuArch() == NpuArch::DAV_3510) { weight = SwapTensorDims(weight, 0, 1); // mmWeight swap dim[0]/dim[1] CHECK_RET(weight != nullptr, ACLNN_ERR_INNER_NULLPTR); transWeight = !transWeight; OP_LOGD("mmWeight transposed detected: transWeight flipped to %d", transWeight); } return ACLNN_SUCCESS; } ``` **逻辑验证**: - ✅ 正确检测stride不连续的转置tensor - ✅ 正确校验参数冲突(已设置transWeight时禁止再次处理) - ✅ 正确限制平台(仅DAV_3510/A5平台处理) - ✅ gmmWeight正确交换dim[1]/dim[2],与MX版本一致 - ✅ mmWeight正确交换dim[0]/dim[1],与MX版本一致 - ✅ TT量化不需要scale参数,函数签名合理 --- #### 2.2.4 代码风格检查 ✅ **通过** - ✅ 函数命名遵循驼峰命名法(HandleXxxTranspose) - ✅ 错误处理使用 CHECK_RET 宏 - ✅ 日志使用 OP_LOGE/OP_LOGD 系列函数 - ✅ 参数校验逻辑清晰 --- ## 三、问题汇总 | 序号 | 文件 | 问题 | 严重程度 | 状态 | |------|------|------|----------|------| | 1 | gmm_a2av_scheduler.h | 删除冗余SyncAll | - | ✅ 通过 | | 2 | aclnn_...cpp | TT函数缺少入口日志 | 一般 | ⚠️ 建议修改 | | 3 | aclnn_...cpp | TT分支缺少最终日志 | 建议 | ⚠️ 可选修改 | | 4 | aclnn_...cpp | 函数实现逻辑 | - | ✅ 通过 | | 5 | aclnn_...cpp | 代码风格 | - | ✅ 通过 | --- ## 四、总体评价 ### 变目的 1. **性能优化**:删除scheduler中冗余的同步调用,减少不必要的SyncAll开销 2. **功能扩展**:新增TT量化(PERTENSOR_QUANT)场景的转置处理支持,与现有MX量化处理保持对称 ### 代码质量 - ✅ 核心逻辑正确,实现合理 - ⚠️ 日志风格与MX版本不一致,建议补充 --- See merge request: cann/ops-transformer!46881 个月前
gmmalltoallv mxquant graph Co-authored-by: wangkechen<wangkechen3@huawei.com> # message auto-generated for no-merge-commit merge: !4510 merge gmmalltoallv_mxquant into master gmmalltoallv mxquant graph Created-by: Kiana1216 Commit-by: wangkechen Merged-by: cann-robot Description: ## 描述 gmmalltoallv支持mx量化图模式通路,图模式原型proto.h需要增加mx量化的数据类型。 同时算子原型内的gmm_weight、gmm_weight_scale、mm_weight、mm_weight_scale已经在aclnn侧进行非连续处理,原型内不需要AutoContiguous。 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2105 ## 测试 本地出包验证,线上ci出包验证,本地验证用例精度,线上rdv。 ## 文档更新 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: # PR #4510 代码检视报告 ## 1. PR 基本信息 **PR 编号**: 4510 **标题**: merge 'gmmalltoallv_mxquant' into 'master' **变更文件**: mc2/quant_grouped_mat_mul_allto_allv/op_graph/quant_grouped_mat_mul_allto_allv_proto.h **变更类型**: 算子原型定义扩展(新增量化数据类型支持) **检视模式**: PR 检视 **检视时间**: 2026-04-27 --- ## 2. 变更内容摘要 本次变更在 QuantGroupedMatMulAlltoAllv 算子原型定义中扩展了以下数据类型支持: | 变更输入 | 原支持类型 | 新增类型 | |---------|-----------|---------| | gmm_x, gmm_weight | DT_FLOAT16, DT_BF16, DT_HIFLOAT8 | DT_FLOAT8_E4M3FN, DT_FLOAT8_E5M2, DT_FLOAT4_E2M1 | | gmm_x_scale, gmm_weight_scale | DT_FLOAT | DT_FLOAT8_E8M0 | | mm_x, mm_weight (可选) | DT_FLOAT16, DT_BF16, DT_HIFLOAT8 | DT_FLOAT8_E4M3FN, DT_FLOAT8_E5M2, DT_FLOAT4_E2M1 | | mm_x_scale, mm_weight_scale (可选) | DT_FLOAT | DT_FLOAT8_E8M0 | --- ## 3. 检视维度与范围 ### 检视依据 - C++ 安全编码规范(cpp-secure.md)- 47条 - TOPK 高频问题清单(ascendc-topk.md)- 13条 ### 适用条款(代码侧别:接口定义) 由于本次变更仅为算子原型定义文件(接口层),不涉及实现代码,适用条款较少: | 维度 | 适用条款 | 说明 | |------|---------|------| | 输入验证 | 4.1 外部输入合法性校验 | 检查实现层是否校验新增 dtype | | 接口兼容性 | 10.12 接口变更兼容性 | 新增类型不破坏现有接口 | | TOPK-7 | 外部输入校验 | Tiling 层 dtype 检查逻辑 | --- ## 4. 检视执行过程 ### 4.1 红线问题检查 ✅ **检查结果**: 未发现红线问题 | 检查项 | 结果 | 说明 | |--------|------|------| | 除法/求余除零保护 | ✅ 不适用 | 接口定义无算术运算 | | 数组越界保护 | ✅ 不适用 | 接口定义无数组访问 | | 加法/乘法溢出保护 | ✅ 不适用 | 接口定义无数值运算 | | 指针判空保护 | ✅ 不适用 | 接口定义无指针操作 | | 变量初始化 | ✅ 不适用 | 接口定义无变量声明 | | 资源申请释放匹配 | ✅ 不适用 | 接口定义无资源管理 | ### 4.2 TOPK 问题检查 ✅ **TOPK-7: 外部输入校验** 检查 Tiling 层是否对新增数据类型进行合法性校验: ```cpp // mx_quant_grouped_mat_mul_allto_allv_tiling.cpp (Line 31-46) const std::vector<uint32_t> MX_QUANT_GMM_X_DTYPE_LIST = { ge::DT_FLOAT8_E5M2, ge::DT_FLOAT8_E4M3FN, ge::DT_FLOAT4_E2M1, // ✅ 新增类型已包含 }; const std::vector<uint32_t> MX_QUANT_GMM_X_SCALE_DTYPE_LIST = { ge::DT_FLOAT8_E8M0, // ✅ 新增类型已包含 }; // Line 82-88: dtype 检查逻辑 OP_TILING_CHECK( !IsContains(MX_QUANT_GMM_X_DTYPE_LIST, localParams_.gmmXDtype), OP_LOGE(opName_, "The Input gmmX Dtype should be in ..."), return ge::GRAPH_FAILED); ``` **检查结果**: ✅ 通过 - Tiling 层已定义 dtype 白名单,包含新增类型 - 使用 OP_TILING_CHECK 进行合法性校验 - 错误处理完善,返回 GRAPH_FAILED ### 4.3 实现层一致性检查 ✅ **检查点**: proto 文件与实现层定义是否一致 | 文件层 | 检查内容 | 结果 | |--------|---------|------| | *_proto.h | 扩展 dtype 列表 | ✅ 新增 DT_FLOAT4_E2M1, DT_FLOAT8_E8M0 | | *_def.cpp | Input/Output dtype 定义 | ✅ 已包含新类型(Line 37, 73) | | mx_*_tiling.cpp | dtype 白名单定义 | ✅ 已包含新类型(Line 34, 42) | | *_kernel.cpp | 模板化 Kernel | ✅ 通过宏定义支持多 dtype | **检查结果**: ✅ 实现层已同步支持新增数据类型,接口定义与实现一致 ### 4.4 数据类型合理性检查 ✅ **新增类型说明**: | 数据类型 | 说明 | 应用场景 | |---------|------|---------| | DT_FLOAT8_E4M3FN | 8位浮点(4位指数+3位尾数) | MX量化格式,低精度矩阵乘法 | | DT_FLOAT8_E5M2 | 8位浮点(5位指数+2位尾数) | MX量化格式,范围更大 | | DT_FLOAT4_E2M1 | 4位浮点(2位指数+1位尾数) | 超低精度量化,极致压缩 | | DT_FLOAT8_E8M0 | 8位浮点(仅8位指数) | Scale因子,无尾数位 | **合理性分析**: - 这些类型符合 MX量化标准(Microscaling Format) - 适用于量化矩阵乘法算子(QuantGroupedMatMulAlltoAllv) - 与算子命名和功能定位一致 - 实现层已有相应处理逻辑 **检查结果**: ✅ 新增数据类型定义合理,符合量化算子设计规范 --- ## 5. 检视发现汇总 ### 5.1 关键问题列表 **未发现严重问题**(红线问题、TOPK高风险问题均通过) ### 5.2 建议关注点 | 关注点 | 说明 | 建议处理 | |--------|------|---------| | 低精度类型溢出风险 | DT_FLOAT4_E2M1 范围极小,易溢出 | Kernel 层需实现特殊值/边界值检查(TOPK-6) | | 接口文档同步 | proto 文件扩展后需更新算子文档 | 建议同步更新 README/API 文档 | | 测试覆盖 | 新增 dtype 需补充 ST/UT 测试用例 | 建议在后续测试计划中覆盖 DT_FLOAT4_E2M1/E8M0 | --- ## 6. 假设检验过程(示例) ### TOPK-7 外部输入校验 **假设建立**: - H0: Tiling 屄未校验新增数据类型 - H1: Tiling 层已实现 dtype 检查逻辑 **证据收集**: 1. ✅ 发现 MX_QUANT_GMM_X_DTYPE_LIST 包含 DT_FLOAT4_E2M1(+40%) 2. ✅ 发现 OP_TILING_CHECK 检查逻辑(+40%) 3. ✅ 错误处理返回 GRAPH_FAILED(+25%) **自信值计算**: 40% + 40% + 25% = **105%**(超过阈值) **决策**: H1 成立,Tiling 层已正确实现输入校验 --- ## 7. 检视结论 ### 总体评价 ✅ **通过检视,建议合并** ### 评价理由 1. **红线问题**: 未发现,接口定义变更无安全风险 2. **TOPK问题**: TOPK-7 已正确实现,外部输入校验完善 3. **一致性**: proto、def、tiling 三层定义一致,实现层已同步 4. **合理性**: 新增量化数据类型符合算子设计定位,类型定义规范 ### 建议事项 1. **Kernel 层检视**: 建议后续对 Kernel 实现层进行专项检视,重点关注: - TOPK-6: 低精度类型的特殊值/边界值处理 - TOPK-8: GM 内存偏移使用 int64_t - PREC-*: 量化精度保护措施 2. **测试覆盖**: 建议补充新增 dtype 的测试用例: - UT 测试:DT_FLOAT4_E2M1, DT_FLOAT8_E8M0 基础功能 - ST 测试:量化精度验证、溢出边界测试 --- ## 8. 附录 ### 变更代码片段 ```cpp // quant_grouped_mat_mul_allto_allv_proto.h REG_OP(QuantGroupedMatMulAlltoAllv) .INPUT(gmm_x, TensorType({DT_FLOAT16, DT_BF16, DT_HIFLOAT8, DT_FLOAT8_E4M3FN, DT_FLOAT8_E5M2, DT_FLOAT4_E2M1})) // 新增 .INPUT(gmm_x_scale, TensorType({DT_FLOAT, DT_FLOAT8_E8M0})) // 新增 ... ``` ### 检视规范来源 - cpp-secure.md: 条款 4.1, 10.12 - ascendc-topk.md: TOPK-7 --- **报告生成时间**: 2026-04-27 **检视工具**: Ascend C 代码检视 Agent **检视方法**: 条款级精确检视(假设检验驱动) See merge request: cann/ops-transformer!45101 个月前
common目录整改 Co-authored-by: hello_simida<wangyi206@huawei.com> # message auto-generated for no-merge-commit merge: !4870 merge feature/common_dir_fix_v2 into master common目录整改 Created-by: hello_simida Commit-by: hello_simida Merged-by: cann-robot Description: ## 描述 本次修改对 common/ 目录进行整理,分为两个阶段: - **Phase 1**: 将 common/include/kernel/ 重命名为 common/include/op_kernel/ - **Phase 2**: 将 common/include/tiling_base/common/src/tiling_base/ 合并到 common/include/op_host/common/src/op_host/ 相应的 CMake 配置和所有 #include 路径引用已同步更新。 影响范围: - 351 个文件修改(include 路径更新) - 8 个文件重命名(tiling_base → op_host) - 2 个 CMakeLists.txt 修改 + 多个 tests 目录 CMakeLists.txt 更新 ## 关联的Issue Closes #2246 ## 测试 - 编译验证通过:bash build.sh --pkg --soc=ascend910b --ops=all_gather_matmul_v2 -j16 - 编译产物成功生成 .run 包 ## 文档更新 无 ## 类型标签 - [x] ♻️ 重构 - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!487022 天前
quantgmmalltoallv算子原型调整 Co-authored-by: huangshuai<huangshuai59@huawei.com> # message auto-generated for no-merge-commit merge: !4326 merge master into master quantgmmalltoallv算子原型调整 Created-by: huangshuai59 Commit-by: huangshuai Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: # PR 4326 代码审查报告 > **审查时间**: 2026-04-21 > **审查方式**: ascendc-code-review skill > **Diff来源**: get_gitcode_pr_diff.py脚本获取 --- ## 一、PR基本信息 | 项目 | 内容 | |------|------| | **PR链接** | https://gitcode.com/cann/ops-transformer/pull/4326 | | **标题** | 算子原型调整 | | **作者** | huangshuai59 (huangshuai59@huawei.com) | | **提交日期** | 2026-04-20 | | **变更统计** | 15 files changed, +195 insertions, -180 deletions | | **变更类型** | 算子原型参数/属性顺序调整 + 类名重构 | --- ## 二、变更文件列表 | 文件路径 | 变更类型 | 说明 | |----------|----------|------| | op_api/aclnn_quant_grouped_mat_mul_allto_allv.cpp | 参数顺序调整 | API接口参数顺序同步更新 | | op_graph/fallback_quant_grouped_mat_mul_allto_allv.cpp | 参数/属性索引调整 | fallback实现索引同步更新 | | op_graph/quant_grouped_mat_mul_allto_allv_proto.h | 算子原型定义调整 | 核心原型定义变更 | | op_host/op_tiling/arch35/mx_quant_grouped_mat_mul_allto_allv_tiling.h | 头文件引用修改 | 父类引用更新 | | op_host/op_tiling/arch35/quant_grouped_mat_mul_allto_allv_tiling_adapter.h | 头文件引用修改 | 头文件引用更新 | | op_host/op_tiling/arch35/quant_grouped_mat_mul_allto_allv_tiling_base.cpp_common.cpp | 文件重命名+类名修改 | 类名重构 | | op_host/op_tiling/arch35/quant_grouped_mat_mul_allto_allv_tiling_base.h_common.h | 文件重命名+类名修改 | 类名重构 | | op_host/op_tiling/arch35/tt_quant_grouped_mat_mul_allto_allv_tiling.h | 父类修改 | 继承关系更新 | | op_host/op_tiling/quant_grouped_mat_mul_allto_allv_tiling.cpp | 文档注释修改 | 注释同步 | | op_host/op_tiling/quant_grouped_mat_mul_allto_allv_tiling_base.cpp | 类名修改 | 类名统一 | | op_host/op_tiling/quant_grouped_mat_mul_allto_allv_tiling_base.h | 参数索引+类名修改 | 核心tiling基类更新 | | op_host/quant_grouped_mat_mul_allto_allv_def.cpp | 输入参数定义调整 | def文件同步 | | op_host/quant_grouped_mat_mul_allto_allv_infershape.cpp | 参数索引调整 | infershape同步 | | op_kernel/quant_grouped_mat_mul_allto_allv.cpp | 参数顺序调整 | kernel层同步 | | tests/ut/op_host/arch35/test_quant_gmm_alltoallv_tiling.cpp | 测试用例调整 | 测试同步 | --- ## 三、主要变更内容 ### 3.1 输入参数顺序调整 **原顺序:** ``` gmm_x, gmm_weight, send_counts_tensor, recv_counts_tensor, mm_x, mm_weight, gmm_x_scale, gmm_weight_scale, mm_x_scale, mm_weight_scale, comm_quant_scale ``` **新顺序:** ``` gmm_x, gmm_weight, gmm_x_scale, gmm_weight_scale, send_counts_tensor, recv_counts_tensor, mm_x, mm_weight, mm_x_scale, mm_weight_scale, comm_quant_scale ``` **变化说明:** - gmm_x_scale 从索引 6 移动到索引 2(从可选变为必选) - gmm_weight_scale 从索引 7 移动到索引 3(从可选变为必选) **调整原因(推测):** 量化scale参数作为核心参数,更适合放在靠前位置,提高API的清晰度和易用性。 ### 3.2 属性顺序调整 | 属性名 | 原索引 | 新索引 | 变化说明 | |--------|--------|--------|----------| | gmm_x_quant_mode | 6 | 4 | 移前,变为REQUIRED | | gmm_weight_quant_mode | 7 | 5 | 移前,变为REQUIRED | | trans_gmm_weight | 4 | 6 | 移后 | | trans_mm_weight | 5 | 7 | 移后 | | y_dtype | 13 | 12 | 移前 | | mm_dtype | 14 | 13 | 移前 | | comm_quant_dtype | 12 | 14 | 移后 | ### 3.3 属性类型变更 ```cpp // 原定义 .ATTR(gmm_x_quant_mode, Int, 0) // OPTIONAL,默认值0 .ATTR(gmm_weight_quant_mode, Int, 0) // OPTIONAL,默认值0 // 新定义 .REQUIRED_ATTR(gmm_x_quant_mode, Int) // REQUIRED .REQUIRED_ATTR(gmm_weight_quant_mode, Int) // REQUIRED ``` **影响:** 调用方必须显式传递这两个参数,不再允许默认值。 ### 3.4 类名和文件名变更 | 原名 | 新名 | 说明 | |------|------|------| | QuantGmmAlltoAllvTilingBase | QuantGroupedMatmulAllToAllvTilingBase | 基类重命名,更符合命名规范 | | arch35/quant_grouped_mat_mul_allto_allv_tiling_base.h/cpp | arch35/quant_grouped_mat_mul_allto_allv_tiling_common.h/cpp | arch35目录下的文件重命名 | | 无 | QuantGroupedMatmulAllToAllvTilingCommon | 新增中间层类,继承自Base | **继承关系变更:** ``` 原结构: QuantGmmAlltoAllvTilingBase ├── MxQuantGroupedMatmulAllToAllvTiling ├── TtQuantGroupedMatmulAllToAllvTiling └── ... 新结构: QuantGroupedMatmulAllToAllvTilingBase └── QuantGroupedMatmulAllToAllvTilingCommon (arch35新增中间层) ├── MxQuantGroupedMatmulAllToAllvTiling ├── TtQuantGroupedMatmulAllToAllvTiling └── ... ``` --- ## 四、代码质量分析 ### 4.1 参数顺序调整同步检查 ✅ | 文件 | 输入参数索引 | 属性索引 | 状态 | |------|-------------|---------|------| | quant_grouped_mat_mul_allto_allv_proto.h | ✅ 已更新 | ✅ 已更新 | 正确 | | quant_grouped_mat_mul_allto_allv_tiling_base.h | ✅ 已更新 | ✅ 已更新 | 正确 | | fallback_quant_grouped_mat_mul_allto_allv.cpp | ✅ 已更新 | ✅ 已更新 | 正确 | | quant_grouped_mat_mul_allto_allv_infershape.cpp | ✅ 已更新 | ✅ 已更新 | 正确 | | quant_grouped_mat_mul_allto_allv_def.cpp | ✅ 已更新 | ✅ 已更新 | 正确 | | test_quant_gmm_alltoallv_tiling.cpp | ✅ 已更新 | ✅ 已更新 | 正确 | ### 4.2 命名一致性检查 ✅ | 检查项 | 状态 | 说明 | |--------|------|------| | 类名重命名一致性 | ✅ 正确 | 所有引用文件已同步更新 | | 文件重命名一致性 | ✅ 正确 | 所有引用已更新为新文件名 | | 头文件引用更新 | ✅ 正确 | 所有include已更新 | ### 4.3 关键代码片段检查 **proto定义变更(核心):** ```cpp // quant_grouped_mat_mul_allto_allv_proto.h:69-83 REG_OP(QuantGroupedMatMulAlltoAllv) .INPUT(gmm_x, TensorType({DT_FLOAT16, DT_BF16, DT_HIFLOAT8})) .INPUT(gmm_weight, TensorType({DT_FLOAT16, DT_BF16, DT_HIFLOAT8})) .INPUT(gmm_x_scale, TensorType({DT_FLOAT})) // 新:必选输入,索引2 .INPUT(gmm_weight_scale, TensorType({DT_FLOAT})) // 新:必选输入,索引3 .OPTIONAL_INPUT(send_counts_tensor, ...) // 索引4 ... .REQUIRED_ATTR(gmm_x_quant_mode, Int) // 新:必选属性 .REQUIRED_ATTR(gmm_weight_quant_mode, Int) // 新:必选属性 .ATTR(trans_gmm_weight, Bool, false) // 索引6 .ATTR(trans_mm_weight, Bool, false) // 索引7 ... ``` **API接口变更:** ```cpp // aclnn_quant_grouped_mat_mul_allto_allv.cpp:203-210 static bool CheckQuantParams(int64_t gmmXQuantMode, int64_t gmmWeightQuantMode, const aclTensor *gmmX, const aclTensor *gmmWeight, const aclTensor *gmmXScale, // 新:非Optional const aclTensor *gmmWeightScale, // 新:非Optional const aclTensor *y, ... ``` --- ## 五、发现的问题 ### 5.1 严重问题 ❌ #### 问题1: 继承链方法调用需确认 **位置**: arch35/quant_grouped_mat_mul_allto_allv_tiling_common.cpp:60-68 ```cpp ge::graphStatus QuantGroupedMatmulAllToAllvTilingCommon::GetShapeAttrsInfo() { auto status = QuantGroupedMatmulAllToAllvTilingBase::GetShapeAttrsInfo(); if (status != ge::GRAPH_SUCCESS) { return ge::GRAPH_FAILED; } ... } ``` **风险**: - 若 Base 类未实现 GetShapeAttrsInfo(),编译将失败 - 若实现不正确,可能导致参数校验缺失 **建议**: - 检查 Base 类的完整实现 - 确认虚函数重写关系正确 --- ### 5.2 中等问题 ⚠️ #### 问题2: API命名风格不一致 **位置**: 多个文件 | 层级 | 命名风格 | 示例 | |------|----------|------| | proto定义 | 下划线式 | gmm_x_scale, gmm_weight_scale | | def文件 | 下划线式 | gmm_x_scale, mm_x_scale | | kernel文件 | 下划线式 | gmmxScaleGM (参数名混合) | | API接口 | 驼峰式 | gmmXScale, gmmWeightScale | | 类型定义 | 下划线式 | DTYPE_GMM_X_SCALE | **风险**: API调用者可能混淆参数命名 **建议**: - 统一使用下划线命名风格(符合CANN规范) - 或在文档中明确区分内部命名与API命名 --- #### 问题3: 属性命名不一致 **位置**: quant_grouped_mat_mul_allto_allv_tiling_base.h ```cpp enum GmmA2AvAttrIndex : uint32_t { ... ATTR_MM_Y_DTYPE, // 内部枚举名 ... }; ``` **proto定义**: mm_dtype (而非 mm_y_dtype) **风险**: 内部枚举名与外部API名不一致,可能导致理解混淆 --- #### 问题4: Breaking Change未充分说明 **变更内容**: - gmm_x_scalegmm_weight_scale 从可选变为必选 - gmm_x_quant_modegmm_weight_quant_mode 从可选变为必选 **影响**: - 所有调用方必须修改调用代码 - 未传递参数将产生错误 **建议**: - 添加API变更文档或迁移指南 - 确认下游依赖方并通知 --- ### 5.3 轻微问题 ℹ️ #### 问题5: 文件注释需检查 **位置**: arch35/quant_grouped_mat_mul_allto_allv_tiling_common.h:93-96 ```cpp /*! * \file tt_quant_grouped_mat_mul_allto_allv_gmm_tiling.h // 旧注释 * \brief */ ``` **问题**: 文件重命名后注释应更新为 quant_grouped_mat_mul_allto_allv_tiling_common.h --- #### 问题6: License注释格式 **位置**: 多个重命名文件 ```cpp - * See LICENSE in the root of the software repository for the full text of the License. - */ +*/ ``` **说明**: License注释块末尾格式略有变化,不影响功能 --- ## 六、代码同步性检查 ### 6.1 输入参数索引同步检查 | 文件 | 索引定义方式 | 同步状态 | |------|-------------|---------| | proto.h | 顺序定义 | ✅ | | fallback.cpp | 常量定义 | ✅ | | tiling_base.h | 枚举定义 | ✅ | | infershape.cpp | 常量定义 | ✅ | | test_*.cpp | 顺序传递 | ✅ | ### 6.2 属性索引同步检查 | 文件 | 索引定义方式 | 同步状态 | |------|-------------|---------| | proto.h | 顺序定义 | ✅ | | fallback.cpp | 常量定义 | ✅ | | tiling_base.h | 枚举定义 | ⚠️ (显式赋值) | | def.cpp | 顺序定义 | ✅ | | test_*.cpp | 顺序传递 | ✅ | ### 6.3 类名引用同步检查 | 检查项 | 文件数 | 同步状态 | |--------|--------|---------| | QuantGmmAlltoAllvTilingBaseQuantGroupedMatmulAllToAllvTilingBase | 4 | ✅ | | QuantGroupedMatmulAllToAllvTilingBaseQuantGroupedMatmulAllToAllvTilingCommon | 2 | ✅ | | 头文件include更新 | 3 | ✅ | --- ## 七、改进建议 ### 7.1 必须修复 🔴 | 优先级 | 问题 | 建议 | |--------|------|------| | P0 | 继承链方法调用 | 确认 Base::GetShapeAttrsInfo() 实现正确 | | P0 | 文件注释更新 | 修正 common.h 文件注释 | ### 7.2 建议修复 🟡 | 优先级 | 问题 | 建议 | |--------|------|------| | P1 | API命名风格不一致 | 统一使用下划线命名风格 | | P1 | Breaking Change说明 | 添加迁移指南文档 | | P2 | 属性命名不一致 | 统一 mm_dtype vs mm_y_dtype | ### 7.3 优化建议 🟢 | 优先级 | 问题 | 建议 | |--------|------|------| | P2 | 测试覆盖 | 增加必选参数缺失的测试用例 | | P3 | 向后兼容 | 考虑添加兼容层或过渡期警告 | --- ## 九、审查结论 ### 评分表 | 评价维度 | 评分 | 说明 | |---------|------|------| | **变更完整性** | ⭐⭐⭐⭐⭐ | 15个文件全部同步更新,覆盖完整 | | **参数顺序正确性** | ⭐⭐⭐⭐⭐ | 所有文件索引/顺序完全同步 | | **命名规范性** | ⭐⭐⭐☆☆ | 存在驼峰/下划线风格混用 | | **继承关系正确性** | ⭐⭐⭐⭐☆ | 结构正确,需确认方法实现 | | **文档一致性** | ⭐⭐☆☆☆ | 文件注释未同步,API变更文档缺失 | | **测试覆盖** | ⭐⭐⭐⭐☆ | 测试已同步,但缺少兼容性测试 | | **Breaking Change评估** | ⭐⭐☆☆☆ | 未提供迁移指南 | ### 总体评分 **⭐⭐⭐⭐☆ (4/5) - 建议修复后合并** ### 结论 | 结论项 | 状态 | |--------|------| | 变更覆盖 | ✅ 完整 | | 参数同步 | ✅ 正确 | | 继承重构 | ⚠️ 需确认方法实现 | | 命名风格 | ⚠️ 需统一 | | API兼容性 | ⚠️ 需补充迁移文档 | **建议操作**: 1. 确认 Base::GetShapeAttrsInfo() 实现正确后可合并 2. 后续版本统一命名风格 3. 补充API变更迁移指南 --- **审查完成** **审查人**: ascendc-code-review AI Agent **日期**: 2026-04-21 See merge request: cann/ops-transformer!43261 个月前
修复ut失败用例 Co-authored-by: chenyifan<chenyifan66@h-partners.com> # message auto-generated for no-merge-commit merge: !4954 merge fix_ut_case into master 修复ut失败用例 Created-by: mutex_lock Commit-by: chenyifan Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 修复全量ut中失败用例 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> https://gitcode.com/cann/ops-transformer/issues/2206 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!495422 天前
新增AlltoAllvQuantGroupedMatmul、QuantGroupedMatmulAlltoAllv算子 Co-authored-by: libohao6<libohao3@huawei.com> Co-authored-by: huangshuai<huangshuai59@huawei.com> # message auto-generated for no-merge-commit merge: !2548 merge alltoallv_v2 into master 新增AlltoAllvQuantGroupedMatmul、QuantGroupedMatmulAlltoAllv算子 Created-by: libohao6 Commit-by: huangshuai;libohao6 Merged-by: cann-robot Description: ## 描述 新增AlltoAllvQuantGroupedMatmul、QuantGroupedMatmulAlltoAllv算子 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 二级冒烟 ## 文档更新 更新了AlltoAllvQuantGroupedMatmul、QuantGroupedMatmulAlltoAllv的aclnn文档。 ## 类型标签 <!-- [x] 表示选中 --> - [X] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!25482 个月前
gmmalltoallv增加通信引擎说明 Co-authored-by: huangshuai<huangshuai59@huawei.com> # message auto-generated for no-merge-commit merge: !5075 merge dts into master gmmalltoallv增加通信引擎说明 Created-by: huangshuai59 Commit-by: huangshuai Merged-by: cann-robot Description: ## 描述 gmmalltoallv增加通信引擎说明 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2315 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 https://gitcode.com/cann/ops-transformer/blob/master/mc2/quant_grouped_mat_mul_allto_allv/README.md https://gitcode.com/cann/ops-transformer/blob/master/mc2/quant_grouped_mat_mul_allto_allv/docs/aclnnQuantGroupedMatMulAlltoAllv.md https://gitcode.com/cann/ops-transformer/blob/master/mc2/grouped_mat_mul_allto_allv/README.md https://gitcode.com/cann/ops-transformer/blob/master/mc2/grouped_mat_mul_allto_allv/docs/aclnnGroupedMatMulAlltoAllv.md ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!507517 天前
README.md

QuantGroupedMatMulAlltoAllv

产品支持情况

产品 是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品 ×
Atlas A2 训练系列产品/Atlas A2 推理系列产品 ×
Atlas 200I/500 A2 推理产品 ×
Atlas 推理系列产品 ×
Atlas 训练系列产品 ×

功能说明

  • 算子功能:完成路由专家GroupedMatMul、Unpermute、AlltoAllv融合并实现与共享专家MatMul并行融合,先计算后通信

  • 计算公式:

    • 路由专家:

      gmmY=(gmmX@gmmWeight)∗gmmXScale∗gmmWeightScaleunpermuteOut=Unpermute(gmmY)y=AlltoAllv(unpermuteOut)gmmY = (gmmX @ gmmWeight) * gmmXScale * gmmWeightScale \\ unpermuteOut = Unpermute(gmmY) \\ y = AlltoAllv(unpermuteOut)

    • 共享专家:

      mmY=(mmX@mmWeight)∗mmXScaleOptional∗mmWeightScaleOptionalmmY = (mmX @ mmWeight) * mmXScaleOptional * mmWeightScaleOptional

参数说明

参数名 输入/输出 描述 使用说明 数据类型 数据格式 维度(shape) 非连续Tensor
gmmX 输入 公式中的输入 gmmX。 shape (A, H1)。 HIFLOAT8、FLOAT8_E4M3FN、FLOAT8_E5M2、FLOAT4_E2M1 ND 2 x
gmmWeight 输入 公式中的输入 gmmWeight。 shape (e, H1, N1)。e 为每卡部署的专家数,H1 为 hidden size,N1 为路由专家 FFN 中间维度。 HIFLOAT8、FLOAT8_E4M3FN、FLOAT8_E5M2、FLOAT4_E2M1 ND 3 x
gmmXScale 输入 gmmX 的量化系数。
  • pertensor量化:shape (1)。
  • mx量化:shape (A, ceil(H1/64), 2)
  • FLOAT32、FLOAT8_E8M0 ND
  • pertensor量化:1
  • mx量化:3
  • x
    gmmWeightScale 输入 gmmWeight 的量化系数。
  • pertensor量化:shape (1)。
  • mx量化:shape (e, N1, ceil(H1/64), 2),weight转置时为(e, ceil(H1/64), N1, 2)
  • FLOAT32、FLOAT8_E8M0 ND
  • pertensor量化:1
  • mx量化:3
  • x
    sendCountsTensorOptional 输入 AlltoAllv 使用的 send count。 当前仅支持空。shape (e * ep, )。e 为每卡部署的专家个数,ep 为 ep 域大小。 INT64 ND 1 x
    recvCountsTensorOptional 输入 AlltoAllv 使用的 recv count。 默认为空 Tensor。shape (e * ep, )。e 为每卡部署的专家个数,ep 为 ep 域大小。 INT64 ND 1 x
    mmXOptional 输入 公式中的输入 mmX。 shape (bs, H2)。bs 为每卡部署的专家个数,H2 为 hidden size。 HIFLOAT8、FLOAT8_E4M3FN、FLOAT8_E5M2、FLOAT4_E2M1 ND 2 x
    mmWeightOptional 输入 公式中的输入 mmWeight。 shape (H2, N2)。H2 为 hidden size,N2 为共享专家 FFN 的中间层维度。 HIFLOAT8、FLOAT8_E4M3FN、FLOAT8_E5M2、FLOAT4_E2M1 ND 2 x
    mmXScaleOptional 输入 mmX 的量化系数。
  • pertensor量化:shape (1)。
  • mx量化:shape (BS, ceil(H2/64), 2)
  • FLOAT32、FLOAT8_E8M0 ND
  • pertensor量化:1
  • mx量化:3
  • x
    mmWeightScaleOptional 输入 mmWeight 的量化系数。
  • pertensor量化:shape(1)。
  • mx量化: shape (N2, ceil(H2/64), 2),weight转置时为(ceil(H2/64), N2, 2)
  • FLOAT32、FLOAT8_E8M0 ND
  • pertensor量化:1
  • mx量化:3
  • x
    commQuantScaleOptional 输入 低比特通信量化系数。 预留参数,当前仅支持空。 FLOAT32 ND 1 x
    gmmXQuantMode 输入 gmmX 的量化模式。 必须传入量化模式,当前支持 1 (pertensor量化)和 6(mx量化)。 INT64 - 1 x
    gmmWeightQuantMode 输入 gmmWeight 的量化模式。 必须传入量化模式,当前支持 1 (pertensor量化)和 6(mx量化)。 INT64 - 1 x
    mmXQuantMode 输入 mmX 的量化模式。 mmX 非空,则必须传入量化模式,当前支持 1 (pertensor量化)和 6(mx量化)。 INT64 - 1 x
    mmWeightQuantMode 输入 mmWeight 的量化模式。 mmWeight 不为空,则必须传入量化模式,当前支持 1 (pertensor量化)和 6(mx量化)。 INT64 - 1 x
    commQuantMode 输入 低比特通信量化模式。 当前低比特功能预留,必须传入 0,表示不量化。 INT64 - 1 x
    commQuantDtypeOptional 输入 低比特通信的数据类型。 当前低比特功能预留,必须传入 -1。 INT64 - 1 x
    groupSize 输入 PerGroup 量化分组大小。 用于 Matmul 计算三个方向上的量化分组大小,预留参数,仅支持配置为 0,取值不生效。groupSize 输入由 3 个方向的 groupSizeM,groupSizeN,groupSizeK 三个值拼接组成,每个值占 16 位,共占用 int64_t 类型 groupSize 的低 48 位(高 16 位无效),计算公式为:groupSize = groupSizeK | groupSizeN << 16 | groupSizeM << 32。 INT64 - - -
    group 输入 通信域标识。 字符串长度需大于 0,小于 128。 char* - - -
    epWorldSize 输入 通信域大小。 支持 2/4/8/16/32/64/128/256。 INT64 - - -
    sendCounts 输入 AlltoAllv 使用的 send count。表示其他Rank向当前rank上各expert发送的token数量。 支持的维度为 e * ep。按sendCounts[fromRank][expertId]一维展开, 例如e=3时顺序为e0,e1,e2,e0,e1,e2, ... aclIntArray*(元素类型 INT64) ND - -
    recvCounts 输入 AlltoAllv 使用的 recv count。表示AlltoAllv后本卡需要接收到的token数量。 支持的维度为 e * ep。按recvCounts[fromRank][expertId]一维展开, 例如e=3时顺序为e0,e1,e2,e0,e1,e2, ... aclIntArray*(元素类型 INT64) ND - -
    transGmmWeight 输入 gmm 的右矩阵是否转置。 必须传入,无默认值。 BOOL ND - -
    transMmWeight 输入 mm 的右矩阵是否转置。 必须传入,无默认值。 BOOL ND - -
    y 输出 grouped matmul 计算输出。 不支持空 Tensor。shape (BSK, N1)。 FLOAT16、BFLOAT16 ND 2 x
    mmYOptional 输出 matmul 计算输出。 shape (bs, N2)。 FLOAT16、BFLOAT16 ND 2 x
    workspaceSize 输出 返回需要在 Device 侧申请的 workspace 大小。 - UINT64 ND - -
    executor 输出 返回 op 执行器,包含了算子计算流程。 - aclOpExecutor* ND - -

    gmmXQuantMode、gmmWeightQuantMode、mmXQuantMode、mmWeightQuantMode、commQuantMode的枚举值跟量化模式关系如下:

    • 0: 非量化--当前不支持
    • 1: pertensor
    • 2: perchannel
    • 3: pertoken
    • 4: pergroup
    • 5: perblock
    • 6: mx量化
    • 7: pertoken动态量化

    约束说明

    • 确定性计算:

      • aclnnQuantGroupedMatMulAlltoAllv默认确定性实现。
    • 通信引擎约束:

      • Ascend 950PR/Ascend 950DT:支持CCU通信。
    • e * epWorldSize最大支持256,e表示单卡上的专家数量,最大支持到32,epWorldSize支持2/4/8/16/32/64/128/256;

    • gmmX的shape(A, H1),A为sendCounts之和,H1取值范围(0, 65536);

    • gmmWeight的shape(e, H1, N1),N1取值范围(0, 65536);

    • y的shape为(BSK, N1),第一维其中K的范围[2, 8],BSK为recvCounts之和;

    • mmX是共享专家的左矩阵,shape为(BS, H2),H2的取值范围(0, 12288];

    • mmWeight是共享专家的右矩阵,shape为(H2, N2),N2的取值范围(0, 65536);

    • sendCounts为发送到其他卡的token数,数组大小为e * epWorldSize;

    • recvCounts从其他卡的token数,数组大小为e * epWorldSize;

    • 路由专家和共享专家量化Scale、Mode等均为必选;

    • 低比特通信Mode为必选参数,DType和Scale为可选,当Mode为非0时需要提供DType和Scale;

    • 参数说明里shape使用的变量:

      • BSK:本卡接收的token数,是recvCounts参数累加之和,取值范围(0, 52428800)。
      • H1:表示路由专家hidden size隐藏层大小,取值范围(0, 65536)。
      • H2:表示共享专家hidden size隐藏层大小,取值范围(0, 12288]。
      • e:表示单卡上专家个数,0<e<=32,e * epWorldSize最大支持256。
      • N1:表示路由专家 FFN 的中间层维度,取值范围(0, 65536)。
      • N2:表示共享专家 FFN 的中间层维度,取值范围(0, 65536)。
      • BS:batch sequence size。
      • K:表示选取TopK个专家,K的范围[2, 8]。
      • A:本卡发送的token数,是sendCounts参数累加之和。
      • ep通信域内所有卡的 A 参数的累加和等于所有卡上的 BSK 参数的累加和。
      • mx量化且gmmX与gmmWeight为FLOAT4_E2M1时,H1和H2必须为偶数且不能为2,同时transGmmWeight和transMmWeight为false情况下,N1和N2必须为偶数。
      • gmmWeight和gmmWeightScale的转置状态必须保持一致:同时转置或同时不转置。mmWeight和mmWeightScale同样需要保持转置状态一致。
      • groupSize:
        • 仅当gmmXScale/gmmWeightScale/mmXScale/mmWeightScale输入都是2维及以上数据时,groupSize取值有效,其他场景需传入0。
        • groupSize值支持公式推导:传入的groupSize内部会按如下公式分解得到groupSizeM、groupSizeN、groupSizeK,当其中有1个或多个为0,会根据gmmX/gmmWeight/mmX/mmWeight/gmmXScale/gmmWeightScale/mmXScale/mmWeightScale输入shape重新设置groupSizeM、groupSizeN、groupSizeK用于计算。设置原理:如果groupSizeM=0,表示m方向量化分组值由接口推导,推导公式为groupSizeM = m / scaleM(需保证m能被scaleM整除),其中m与gmmX/mmX shape中的m一致,scaleM与gmmXScale/mmXScale shape中的m一致;如果groupSizeK=0,表示k方向量化分组值由接口推导,推导公式为groupSizeK = k / scaleK(需保证k能被scaleK整除),其中k与gmmX/mmX shape中的k一致,scaleK与gmmXScale/mmXScale shape中的k一致;如果groupSizeN=0,表示n方向量化分组值由接口推导,推导公式为groupSizeN = n / scaleN(需保证n能被scaleN整除),其中n与gmmWeight/mmWeight shape中的n一致,scaleN与gmmWeightScale/mmWeightScale shape中的n一致。

        groupSize=groupSizeK∣groupSizeN<<16∣groupSizeM<<32groupSize = groupSizeK | groupSizeN << 16 | groupSizeM << 32

        • 如果满足重新设置条件,当gmmXScale/gmmWeightScale/mmXScale/mmWeightScale输入是2维及以上时,且数据类型都为FLOAT8_E8M0时,[groupSizeM,groupSizeN,groupSizeK]取值组合会推导为[1, 1, 32],对应groupSize的值为4295032864。
    • 量化参数约束:

      • 当前版本支持pertensor量化、mx量化。
    • 类型约束

      • pertensor量化

        gmmX gmmWeight gmmXScale gmmWeightScale mmXScale mmWeightScale y
        HIFLOAT8 HIFLOAT8 FLOAT32 FLOAT32 FLOAT32 FLOAT32 FLOAT16/BFLOAT16
      • mx量化

        gmmX gmmWeight gmmXScale gmmWeightScale mmXScale mmWeightScale y
        FLOAT8_E4M3FN FLOAT8_E4M3FN FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT16/BFLOAT16
        FLOAT8_E4M3FN FLOAT8_E5M2 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT16/BFLOAT16
        FLOAT8_E5M2 FLOAT8_E4M3FN FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT16/BFLOAT16
        FLOAT8_E5M2 FLOAT8_E5M2 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT16/BFLOAT16
        FLOAT4_E2M1 FLOAT4_E2M1 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT16/BFLOAT16
      • mmX类型与gmmX类型保持一致,mmWeight类型与gmmWeight类型保持一致,mmY类型与y类型保持一致。

    调用说明

    调用方式 样例代码 说明
    aclnn接口 test_aclnn_quant_grouped_mat_mul_allto_allv.cpp 通过aclnnQuantGroupedMatMulAlltoAllv接口方式调用量化场景的quant_grouped_mat_mul_allto_allv算子。