当前位置: 首页 > news >正文

CANN/cann-bench MoE门控算子

MoeGatingTopKSoftmax 算子 API 描述

【免费下载链接】cann-bench评测AI在处理CANN领域代码任务的能力,涵盖算子生成、算子优化等领域,支撑模型选型、训练效果评估,统一量化评估标准,识别Agent能力短板,构建CANN领域评测平台,推动AI能力在CANN领域的持续演进。项目地址: https://gitcode.com/cann/cann-bench

1. 算子简介

MoE 门控网络中 Softmax 和 TopK 的融合算子,先对输入执行 Softmax 归一化,再取 TopK 个最大值,同时输出专家索引和行位置索引。

主要应用场景

  • Mixture of Experts (MoE) 模型中的门控路由选择
  • 稀疏激活 Transformer 中的专家选择策略
  • MoE 层中 token 到专家的路由分配

算子特征

  • 难度等级:L3(LayoutTransform)
  • 支持 2D 或 3D 输入,输出 TopK 结果、专家索引、行索引三个输出

2. 算子定义

数学公式

$$ softmaxOut = softmax(x, axis=-1) $$

$$ yOut, expertIdxOut = topK(softmaxOut, k) $$

$$ rowIdxRange = arange(expertIdxOut.shape[0] \times expertIdxOut.shape[1]) $$

$$ rowIdxOut = rowIdxRange.reshape([expertIdxOut.shape[1], expertIdxOut.shape[0]]).transpose(1, 0) $$

处理流程

  1. 对输入 $x$ 沿最后一维执行 Softmax:$\text{softmaxOut}[i] = \frac{e^{x_i}}{\sum_j e^{x_j}}$
  2. 从 Softmax 结果中选取前 $k$ 个最大值作为输出 $yOut$,对应索引为 $expertIdxOut$
  3. 计算 $rowIdxOut$,表示展平后的全局位置索引(用于指示每个输出位置在展平数组中的位置)
  4. 如果finished中对应行为 True,则 $expertIdxOut$ 中填入 $num_expert$(即 $x$ 的最后一维大小)

3. 接口规范

算子原型

cann_bench.moe_gating_top_k_softmax(Tensor x, Tensor? finished=None, int k=1) -> (Tensor y, Tensor expert_idx, Tensor row_idx)

输入参数说明

参数类型默认值描述
xTensor必选输入张量,支持 2D 或 3D,shape 为 (..., E),E 为专家数
finishedTensor?None可选,标记哪些行参与计算,dtype 为 bool,shape 为 x_shape[:-1]
kint1topK 数量,要求 0 < k <= x最后一维大小,且 k <= 1024

输出

参数Shapedtype描述
y(..., k)与输入 x 相同输出张量,topK 结果值
expert_idx(..., k)int32topK 对应的专家索引
row_idx(..., k)int32展平后的全局位置索引

数据类型

输入 x dtype输出 y dtype输出 expert_idx dtype输出 row_idx dtype
float16float16int32int32
bfloat16bfloat16int32int32
float32float32int32int32

规则与约束

  • 输入x支持 2D 或 3D 张量
  • k必须为正整数,且满足 0 < k <= x最后一维大小,k <= 1024
  • finished为可选参数,若提供则 shape 必须为 x_shape[:-1],dtype 必须为 bool
  • Softmax 和 TopK 均沿最后一维(dim=-1)计算
  • finished中某行为 True 时,该行对应的expert_idx值会被设为num_expert

4. 精度要求

采用生态算子精度标准进行验证。

误差指标

  1. 平均相对误差(MERE):采样点中相对误差平均值

    $$ \text{MERE} = \text{avg}(\frac{\text{abs}(actual - golden)}{\text{abs}(golden)+\text{1e-7}}) $$

  2. 最大相对误差(MARE):采样点中相对误差最大值

    $$ \text{MARE} = \max(\frac{\text{abs}(actual - golden)}{\text{abs}(golden)+\text{1e-7}}) $$

通过标准

数据类型FLOAT16BFLOAT16FLOAT32HiFLOAT32FLOAT8 E4M3FLOAT8 E5M2
通过阈值(Threshold)2^-102^-72^-132^-112^-32^-2

当平均相对误差 MERE < Threshold,最大相对误差 MARE < 10 * Threshold 时判定为通过。

5. 标准 Golden 代码

import torch import numpy as np """ MoeGatingTopKSoftmax算子Torch Golden参考实现 公式: softmaxOut = softmax(x, axis=-1) yOut, expertIdxOut = topK(softmaxOut, k) rowIdxRange = arange(expertIdxOut.shape[0] * expertIdxOut.shape[1]) rowIdxOut = rowIdxRange.reshape([expertIdxOut.shape[1], expertIdxOut.shape[0]]).transpose(1, 0) 注意: row_idx是展平后的全局位置索引,而非行号 """ def moe_gating_top_k_softmax( x: torch.Tensor, finished: torch.Tensor = None, k: int = 1 ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]: """ MoE门控网络中Softmax和TopK的融合 Args: x: 输入张量,shape (..., E) finished: 可选,标记哪些行参与计算,bool类型,shape x_shape[:-1] k: topK数量 Returns: y: topK值,shape (..., k) expert_idx: topK索引(专家序号),shape (..., k),int32 row_idx: 展平后的全局位置索引,shape (..., k),int32 """ # Softmax沿最后一维 softmax_out = torch.nn.functional.softmax(x, dim=-1) # TopK沿最后一维 values, indices = torch.topk(softmax_out, k, dim=-1) # 计算row_idx,严格对标op-plugin测试代码 # 公式: rowIdxRange = arange(shape[0] * shape[1]) # rowIdxOut = rowIdxRange.reshape([shape[1], shape[0]]).transpose(1, 0) # 注意: row_idx是展平后的全局位置索引 output_shape = indices.shape if len(output_shape) == 2: # 2D: (N, k) # row_idx = arange(N*k).reshape(k, N).transpose(1, 0) -> (N, k) row_idx_range = torch.arange(output_shape[0] * output_shape[1], dtype=torch.int32) row_idx = row_idx_range.reshape(output_shape[1], output_shape[0]).transpose(0, 1) else: # 3D: (B, N, k) # 先把(B, N)看作整体,计算展平后的索引 # row_idx_range = arange(B*N*k) # reshape成(k, B*N),transpose成(B*N, k) # 再reshape成(B, N, k) row_idx_range = torch.arange(output_shape[0] * output_shape[1] * output_shape[2], dtype=torch.int32) row_idx = row_idx_range.reshape(output_shape[2], output_shape[0] * output_shape[1]).transpose(0, 1) row_idx = row_idx.reshape(output_shape) # 处理finished参数 if finished is not None: num_expert = x.shape[-1] finished_expanded = finished.unsqueeze(-1).expand_as(indices) indices = torch.where(finished_expanded, num_expert, indices) return values, indices.to(torch.int32), row_idx.to(torch.int32)

6. 额外信息

算子调用示例

import torch import cann_bench # 2D 输入 x = torch.randn(1024, 64, dtype=torch.float16, device="npu") y, expert_idx, row_idx = cann_bench.moe_gating_top_k_softmax(x, k=8) # 带 finished 参数 finished = torch.randint(0, 2, (1024,), dtype=torch.bool, device="npu") y, expert_idx, row_idx = cann_bench.moe_gating_top_k_softmax(x, finished=finished, k=8) # 3D 输入 x_3d = torch.randn(4, 1024, 64, dtype=torch.float32, device="npu") y, expert_idx, row_idx = cann_bench.moe_gating_top_k_softmax(x_3d, k=4)

【免费下载链接】cann-bench评测AI在处理CANN领域代码任务的能力,涵盖算子生成、算子优化等领域,支撑模型选型、训练效果评估,统一量化评估标准,识别Agent能力短板,构建CANN领域评测平台,推动AI能力在CANN领域的持续演进。项目地址: https://gitcode.com/cann/cann-bench

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/783002/

相关文章:

  • 需求感知AI:从理解人类深层需求到构建可持续智能系统
  • 数学专业书籍推荐1:数学分析的两本经典习题书
  • SpringBootApplication注解说明
  • CANN/AMCT创建量化感知训练模型
  • 解决claude code访问不稳定问题通过taotoken配置anthropic兼容通道
  • CANN电力预测ReduceAll算子操作手册
  • CANN/ascend-transformer-boost多潜在注意力算子演示
  • 怎样高效使用网盘直链下载助手:实用技巧完整指南
  • CANN/pto-isa轴归约与扩展操作
  • 2026年4月水蜡实力厂家如何选,高压洗车机/全自动智能洗车设备/全自动高压洗车机/无接触洗车机,水蜡制造企业推荐 - 品牌推荐师
  • “9秒删库”事件刷屏!AI是凶手,但枪是你自己递的
  • HarmonyOS 6 ArkUI 粒子动画(Particle)动态发射器控制使用文档
  • MRAM技术解析:非易失性存储器的原理与应用
  • CANN/asc-devkit内存分配API文档
  • CANN/AMCT Quantile量化
  • Hermes Agent工具链接入Taotoken聚合API的配置指南
  • GE图引擎资源变更通知API
  • 美团大模型二面:你的RAG知识库更新策略是怎样的?
  • CANN/ops-cv一维上采样反向算子
  • CANN电力仿真张量求和优化
  • 2026年4月市面上靠谱的铁氟龙排线厂商推荐,柔软度好,方便施工操作 - 品牌推荐师
  • 电液控制装置控制器4K型护套连接器
  • 企业如何利用Taotoken统一管理多个AI模型API密钥与用量
  • CANN框架适配SIG
  • 自贡智能家居装修预算怎么控制?悦阳装饰全案整装透明报价体系解析 - 优质企业观察收录
  • cann/catlass Ascend950全解量化矩阵乘
  • 电子元器件焊接调试实战经验总结
  • Switch大气层系统深度配置:从零构建你的个性化游戏环境
  • 求推荐芜湖靠谱的装修公司?来看我的真实体验
  • CANN/metadef获取算子属性值接口