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

CANN/cann-recipes-infer MoE路由分组量化算子

custom-npu_moe_init_routing_group_quant

【免费下载链接】cann-recipes-infer本项目针对LLM与多模态模型推理业务中的典型模型、加速算法,提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-infer

产品支持情况

产品是否支持
Ascend 950PR/Ascend 950DT

功能说明

  • 算子功能:MoE的routing计算,根据MoE Gating TopK的计算结果做routing处理,支持不量化和动态量化模式。

  • 计算公式:

    1.对输入expertIdx做排序,得出排序后的结果sortedExpertIdx和对应的序号sortedRowIdx:

    $$ sortedExpertIdx, sortedRowIdx=keyValueSort(expertIdx,rowIdx) $$

    2.以sortedRowIdx做位置映射得出expandedRowIdx:

    $$ expandedRowIdx[sortedRowIdx[i]]=i $$

    3.在drop模式下,对sortedExpertIdx的每个专家统计直方图结果,得出expertTokensCountOrCumsum:

    $$ expertTokensCountOrCumsum[i]=Histogram(sortedExpertIdx) $$

    4.计算quant结果:

    • 动态quant:
      • 若不输入scale: $$ dynamicQuantScaleOut = row_max(abs(x)) / 127 $$

        $$ quantResult = round(x / dynamicQuantScaleOut) $$

      • 若输入scale: $$ dynamicQuantScaleOut = row_max(abs(x * scale)) / 127 $$

        $$ quantResult = round(x / dynamicQuantScaleOut) $$

    5.对quantResult取前NUM_ROWS个sortedRowIdx的对应位置的值,得出expandedXOut:

    $$ expandedX[i]=quantResult[sortedRowIdx[i]%NUM_ROWS] $$

    6.expandedRowIdx的有效元素数量availableIdxNum计算方式为,expertIdx中activeExpertRange范围内的元素的个数 $$ availableIdxNum = |{x\in expertIdx| expert_start \le x<expert_end \ }| $$

函数原型

custom.npu_moe_init_routing_group_quant(Tensor x, Tensor expert_idx, Tensor? scale=None, Tensor? offset=None, int active_num=-1, int expert_capacity=-1, int expert_num=-1, int drop_pad_mode=-1, int expert_tokens_num_type=-1, bool expert_tokens_num_flag=False, int quant_mode=-1, SymInt[] active_expert_range, int row_idx_type=-1, int group_size=128) ->(Tensor, Tensor, Tensor, Tensor)

参数说明

参数名输入/输出/属性描述数据类型数据格式
x输入MOE的输入,即token特征输入,对应公式中x。FLOAT32、FLOAT16、BFLOAT16、INT8ND
expert_idx输入每一行特征对应的K个处理专家,里面元素专家id不能超过专家数。对应公式中 expertIdx。INT32ND
scale可选输入表示用于计算quant结果的参数。如果不输入表示计算时不使用scale,对应公式中scale。FLOAT32ND
offset可选输入表示用于计算quant结果的偏移值。在非量化场景下和动态quant场景下不输入,对应公式中offset。FLOAT32ND
active_num属性表示总的最大处理row数,输出expanded_x只有这么多行是有效的。INT-
expert_capacity属性表示每个专家能够处理的tokens数,取值范围大于等于0。INT-
expert_num属性表示专家数,expert_tokens_num_type为key\_value模式时,取值范围为[0, 5120], 其它模式取值范围[0, 10240]。INT-
drop_pad_mode属性表示是否为 DropPad 场景,取值为 0 和 1。
  • 0:表示 Dropless 场景,该场景下不校验 expert_capacity。
  • 1:表示 DropPad 场景。
INT-
expert_tokens_num_type属性取值为0、1和2 。
  • 0:表示 comsum 模式。
  • 1:表示 count 模式,即输出的值为各个专家处理的 token 数量的累计值。
  • 2:表示 key\_value 模式,即输出的值为专家和对应专家处理 token 数量的累计值。
INT-
expert_tokens_num_flag属性取值为false和true。
  • false:表示不输出 expert_tokens_count_or_cumsum。
  • true:表示输出 expert_tokens_count_or_cumsum。
Bool-
quant_mode属性取值为-1、0、1、2、3、4、5。
  • -1:表示不量化场景。
  • 0:表示静态 quant 场景。
  • 1:表示动态 quant 场景。
  • 2:表示MXFP8量化场景,expanded_x量化到FLOAT8_E5M2。
  • 3:表示MXFP8量化场景,expanded_x量化到FLOAT8_E4M3FN。
  • 4:表示PerGroup量化,group_size固定为128,expanded_x量化到FLOAT8_E5M2,scale的dtype为float。
  • 5:表示PerGroup量化,group_size固定为128,expanded_x量化到FLOAT8_E4M3FN,scale的dtype为float。
INT-
active_expert_range可选属性长度为2,数组内的值为[expertStart, expertEnd], 表示活跃的expert范围在expertStart和expertEnd之间,左闭右开。要求值大于等于0,并且expertEnd不大于expertNum。不输入则不使能专家筛选功能。ListInt-
row_idx_type属性表示expanded_row_idx使用的索引类型,取值为0、1。(性能模板仅支持1)
  • 0:表示gather类型的索引。
  • 1:表示scatter类型的索引。
INT-
expanded_x输出根据expert_idx进行扩展过的特征。非量化场景下数据类型同x,量化场景quant_mode为0、1时数据类型支持INT8,quant_mode为2、3时数据类型分别支持FLOAT8_E5M2、FLOAT8_E4M3FN。FLOAT32、FLOAT16、BFLOAT16、INT8、FLOAT8_E5M2、FLOAT8_E4M3FNND
expanded_row_idx输出expanded_x和x的索引映射关系,前available_idx_num\*H个元素为有效数据,其余无效数据,当row_idx_type为0时,无效数据由-1填充;当row_idx_type为1时,无效数据未初始化。INT32ND
expert_tokens_count_or_cumsum输出
  • 在expert_tokens_num_type为1的场景下,表示active_expert_range范围内expert对应的处理token的总数。
  • 在expert_tokens_num_type为2的场景下,表示active_expert_range范围内token总数为非0的expert,以及对应expert处理token的总数。
INT64ND
expanded_scale输出输出量化计算过程中scale的中间值。FLOAT32ND

约束说明

  • 输入值域限制:

    • active_num 当前未使用,校验需等于NUM_ROWS*K。
    • expert_capacity 当前未使用,仅校验非空。
    • offset 当前未使用。
    • drop_pad_mode 当前只支持0,代表 Dropless 场景。
    • expert_tokens_num_type 当前只支持 1 和 2,分别代表 count 模式和 key_value 模式。
    • expert_tokens_num_flag 只支持 true,代表输出 expert_tokens_count_or_cumsum。
    • quant_mode: 支持-1、0、1、2、3、4、5,其中-1表示不量化,0表示静态量化(输出INT8),1表示动态量化(输出INT8),2表示MXFP8量化到FLOAT8_E5M2,3表示MXFP8量化到FLOAT8_E4M3FN。4模式是groupSize固定为128的PerGroup量化,expand_x量化到float8_e5m2类型,scale为float类型。5模式是groupSize固定为128的PerGroup量化,expand_x量化到float8_e4m3类型,scale为float类型。
  • 输入shape约束:

    • x : shape为 (N, H)
    • expert_id : shape为(N, topK)
    • scale : shape为(N, )或者(expert, H)
  • 输出shape约束:

    • expanded_x : shape为 (N*K, H)
    • expanded_row_idx : shape为 (N*K)
    • expert_tokens_count_cumsum : expert_tokens_num_type为1时,shape为 (expert, ) expert_tokens_num_type为2时,shape为 (expert, 2)
    • expanded_scale : quant_mode = 4或者quant_mode = 5时,shape为 (N*K, M),其中M=Ceil(H, 128)
  • 该接口支持推理场景下使用。

  • 该接口支持图模式。

  • 该接口与PyTorch配合使用时,需要保证CANN相关包与PyTorch相关包的版本匹配。

调用示例

  • 详见 test_npu_moe_init_routing_group_quant.py

【免费下载链接】cann-recipes-infer本项目针对LLM与多模态模型推理业务中的典型模型、加速算法,提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-infer

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

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

相关文章:

  • STRAIGHT_JOIN 用法
  • 区块链+AI+DAO构建反性勒索平台:技术架构与实战解析
  • 从clevercli看AI命令行工具的设计哲学与工程实践
  • 通过curl命令直接测试Taotoken多模型聚合接口的响应
  • 2026知名CRM系统测评:12款客户管理系统价值解析 - Blue_dou
  • CANN PTO Tile-Scalar汇编操作
  • LIME实战避坑指南:从医疗影像到金融风控的可解释性落地
  • Phi-2小模型深度解析:27亿参数如何实现强推理与高效部署
  • GEE实战:用MOD17A3HGF和MYD17A2H数据,手把手教你生成8天和月度NPP数据集(附完整代码)
  • 基于辩证唯物主义认识论的大语言模型架构设计与机理分析
  • AIGC检测是什么?论文查AI率和论文查重有什么不同?
  • ChatGPT推理能力深度测试:从假设演绎到因果推理的AGI试金石
  • CANN/pypto矩阵乘法API文档
  • 2026年德州沥青加温设备、沥青储存罐与筑路设备源头厂家选购指南 - 企业名录优选推荐
  • Python字典底层原理与工程实践全解
  • CANN/ops-cv ResizeBilinearV2反向传播算子
  • 论文改到崩溃?Paperxie 把查重降重的坑都给你填平了
  • 在 RTOS 里使用 UART——信号量 + DMA 回调框架
  • AdvancedTCA架构:电信与超算融合的技术解析
  • 基于主题建模的教育多模态与生成式AI研究全景分析
  • 初创公司如何借助 Taotoken 的按 token 计费模式控制 AI 实验成本
  • 范进人生轨迹
  • AI预测抗生素耐药性:从数据清洗到可解释模型的全流程实战
  • iOS 开发 事件响应链与手势识别原理
  • CANNOpsTransformer融合因果一维卷积
  • CANN/asc-devkit Asinh函数
  • 2026年山东沥青加温设备、沥青储存罐及筑路设备源头厂家完全选购指南 - 企业名录优选推荐
  • Excel AVERAGE函数底层逻辑与四大均值函数实战指南
  • 哔哩下载姬Downkyi完整指南:从入门到精通的高效B站视频管理方案
  • AArch64系统寄存器架构与Neoverse V3AE核心解析