news 2026/6/23 19:42:12

CANN/cann-bench:DequantSwigluQuant算子

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/cann-bench:DequantSwigluQuant算子

DequantSwigluQuant 算子 API 描述

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

1. 算子简介

对输入张量 x 进行反量化(Dequant)→ SwiGLU 激活 → 动态量化(per-token Quant)三步融合,输出量化后的结果 y 和 per-token scale。精简版仅保留生产推理常用的 5 个参数,仅动态量化;不暴露 group_index(MoE 分组路由)、swiglu_mode 变种、 bias、quant_offset、quant_mode(固定为 dynamic per-token)等。

主要应用场景

  • 大语言模型推理 FFN 层 W8A8 量化加速(int32 + per-token dequant + SwiGLU + 重量化)
  • BF16 → INT8 一体化加速(去掉中间 dequant/quant 显存开销)

算子特征

  • 难度等级:L3(FusedComposite)
  • 主输入x,可选 3 个 Tensor(weight_scale,activation_scale,quant_scale
  • 双输出(y, scale):量化结果 + per-token scale
  • 仅支持动态量化(per-token max → scale)
  • 输入最后一维2H必须为偶数

2. 算子定义

数学公式

设 x ∈ ℝ^[TokensNum, 2H],按最后一维等分两半:

$$ A = x[,..., : H],\qquad B = x[,..., H:,] $$

Step 1 — 反量化

$$ \text{dequantOut} = \begin{cases} \bigl(x \cdot \text{weight_scale}\bigr) \cdot \text{activation_scale.unsqueeze(-1)} & x \in \text{int32} \ x.\text{float}() & x \in \text{bfloat16} \cup \text{float16} \end{cases} $$

Step 2 — SwiGLU 激活(与官方 API 对齐):

activate_left公式
False(默认)swiglu_out = SiLU(B) * A
Trueswiglu_out = SiLU(A) * B

Step 3 — smooth quant 系数(可选)

$$ \text{swiglu_out} = \text{swiglu_out} \cdot \text{quant_scale} $$

quant_scale形状[1, H],broadcast 到[TokensNum, H]。当其为 None 时跳过。

Step 4 — 动态量化(per-token)

$$ s_i = \max_j |\text{swiglu_out}{i,j}|, /, 127,\qquad y{i,j} = \text{clamp}\bigl(,\text{round}(\text{swiglu_out}_{i,j} / s_i),\ -128,\ 127,\bigr) \in \text{int8} $$

scale输出每个 token 的 $s_i$(float32)。

3. 接口规范

算子原型

cann_bench.dequant_swiglu_quant( Tensor x, Tensor? weight_scale=None, Tensor? activation_scale=None, Tensor? quant_scale=None, bool activate_left=False, ) -> (Tensor y, Tensor scale)

Shape 变量

变量含义
TokensNumtoken 数(≥ 0)
H输出最后一维大小(x最后一维的一半,> 0)

输入参数

参数类型shapedtype必选描述
xTensor[TokensNum, 2H]int32 / bfloat16 / float16主输入;尾轴必须为偶数
weight_scaleTensor[1, 2H]float32x=int32 时必选权重量化的反量化系数
activation_scaleTensor[TokensNum]float32x=int32 时必选per-token 激活反量化系数
quant_scaleTensor[1, H]float32可选smooth 量化系数(仅 float32)
activate_leftbool可选(默认 False)False =SiLU(B)*A;True =SiLU(A)*B

输出

参数shapedtype描述
y[TokensNum, H]int8量化后输出
scale[TokensNum]float32每 token 的量化 scale(max abs / 127)

数据类型支持

x输入 dtypeweight_scale/activation_scalequant_scaleyscale
int32必须提供(float32 / float32)可选 float32int8float32
bfloat16必须为 None可选 float32int8float32
float16必须为 None可选 float32int8float32

规则与约束

  • x.shape[-1]必须为偶数x必须是 2D。
  • x为 int32 时,weight_scaleactivation_scale必须非 None。
  • x为 bfloat16 / float16 时,weight_scaleactivation_scale必须为 None。
  • quant_scale仅支持 float32 dtype;fp16 / bf16 在 CANN 850 上调用会运行时报错。
  • 输出y仅 int8,scale仅 float32。
  • 该接口仅支持推理场景图模式调用。
  • 支持芯片:Atlas A2 / Atlas 800I A2 / A200I A2 / Atlas A3 系列。

不支持的参数(相对官方 API)

下列参数tasks精简版不暴露,调用底层算子时取默认值:

参数默认值用途 / 不暴露原因
quant_mode1(pinned dynamic)静态模式在 CANN 850 实测中表现为 identity scale 且 scale 返回未初始化内存,不具备生产可用性
biasNonex 的偏置;可在算子外做
quant_offsetNone量化偏移;生产部署中几乎都为 0
group_indexNoneMoE 分组路由
swiglu_mode00=传统 SwiGLU;1=变种(带 clamp + alpha + bias)
clamp_limit7.0仅变种 SwiGLU 生效
glu_alpha1.702仅变种 SwiGLU 生效
glu_bias1.0仅变种 SwiGLU 生效

支持范围

输入 tensor 各维度与参数的支持范围:

维度 / 参数范围备注
TokensNumx第 0 维)1 ~ 65536cases.csv 实测 127 ~ 32768;activation_scale长度须等于 TokensNum
2Hx最后一维)2 ~ 16384cases.csv 实测 64 ~ 8194;必须为偶数weight_scale形状须为[1, 2H]
H(输出最后一维)1 ~ 81922H/2派生;quant_scale形状须为[1, H]
activate_left{false, true}cases.csv 实测两值;false=SiLU(B)*A,true=SiLU(A)*B

约束:x必须为 2D 张量;x.dtype=int32weight_scaleactivation_scale必须同时非 None,否则两者必须同时为 None;quant_scale仅支持 float32。

4. 精度要求

由于输出y是 int8(容易出现 ±1 舍入抖动),采用经典量化算子的判定:

输出验证方式通过阈值
y(int8)与 golden 逐元素比较,允许\|diff\| ≤ 1元素占比 < 1e-3
scale(float32)浮点相对误差rtol = 1e-3, atol = 1e-5

参考生态算子精度标准。

5. 标准 Golden 代码

详见同目录golden.py。核心逻辑:

def dequant_swiglu_quant(x, weight_scale=None, activation_scale=None, quant_scale=None, activate_left=False): # Step 1: dequant if x.dtype == torch.int32: d = x.float() * weight_scale.float() d = d * activation_scale.float().unsqueeze(-1) else: # bfloat16 d = x.float() # Step 2: swiglu A, B = d[..., :d.shape[-1]//2], d[..., d.shape[-1]//2:] silu = torch.nn.functional.silu out = silu(A)*B if activate_left else silu(B)*A # Step 3: smooth quant if quant_scale is not None: out = out * quant_scale.float() # Step 4: dynamic per-token int8 quantize s = (out.abs().amax(-1) / 127.0).clamp_min(1e-12) # [TokensNum] y = torch.clamp((out / s.unsqueeze(-1)).round(), -128, 127).to(torch.int8) return y, s.to(torch.float32)

6. 额外信息

算子调用示例

import torch, torch_npu # 路径 A:x = bfloat16,无 weight_scale,纯 SwiGLU + 动态量化 x = torch.randn(2048, 4096, dtype=torch.bfloat16, device="npu") y, scale = torch_npu.npu_dequant_swiglu_quant(x, quant_mode=1) # y: [2048, 2048] int8, scale: [2048] float32 # 路径 B:x = int32(W8A8 反量化路径)+ smooth quant x = torch.randint(-128, 127, (1024, 4096), dtype=torch.int32, device="npu") ws = torch.randn(1, 4096, dtype=torch.float32, device="npu") # weight_scale as_ = torch.randn(1024, dtype=torch.float32, device="npu") # activation_scale qs = torch.randn(1, 2048, dtype=torch.float32, device="npu") # quant_scale y, scale = torch_npu.npu_dequant_swiglu_quant( x, weight_scale=ws, activation_scale=as_, quant_scale=qs, quant_mode=1)

注:tasks暴露的接口不接受quant_mode参数;调用底层 torch_npu 时 由 ref 函数固定传quant_mode=1

参考文档

  • 官方 CANN 算子文档:aclnnDequantSwigluQuant
  • torch_npu 绑定:python -c "import torch_npu; print(torch_npu.npu_dequant_swiglu_quant.__doc__)"

相关算子

  • torch_npu.npu_swiglu_quant—— 不带反量化的 SwiGLU + 量化
  • torch_npu.npu_grouped_matmul_swiglu_quant_v2—— 包含 GEMM 的更上层融合算子

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 19:18:20

qb-web实用技巧10则:提升你的BT下载管理效率

qb-web实用技巧10则&#xff1a;提升你的BT下载管理效率 【免费下载链接】qb-web A qBittorrent Web UI, write in TypeScriptVue. 项目地址: https://gitcode.com/gh_mirrors/qb/qb-web qb-web是一款基于TypeScriptVue开发的qBittorrent Web UI工具&#xff0c;通过它可…

作者头像 李华
网站建设 2026/6/23 19:18:23

CANN/asc-devkit: Conv3DBackpropInput Tiling使用说明

Conv3DBackpropInput Tiling使用说明 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地…

作者头像 李华
网站建设 2026/6/23 19:18:21

SNMP Exporter实战指南:构建企业级网络监控架构的深度解析

SNMP Exporter实战指南&#xff1a;构建企业级网络监控架构的深度解析 【免费下载链接】snmp_exporter SNMP Exporter for Prometheus 项目地址: https://gitcode.com/gh_mirrors/sn/snmp_exporter SNMP Exporter作为Prometheus生态中的关键组件&#xff0c;专为网络设备…

作者头像 李华
网站建设 2026/6/23 19:18:49

别再只用MSE了!PyTorch中SmoothL1Loss的保姆级使用指南(附代码对比)

深度学习回归任务中SmoothL1Loss的实战应用与MSE对比解析 在目标检测、房价预测等回归任务中&#xff0c;选择合适的损失函数往往决定了模型的收敛速度和最终性能。许多初学者会习惯性选择最熟悉的均方误差(MSE)损失函数&#xff0c;但当数据中存在离群点时&#xff0c;MSE的二…

作者头像 李华
网站建设 2026/6/23 19:41:56

STL文件预览工具:重构3D模型管理流程的轻量级自动化解决方案

STL文件预览工具&#xff1a;重构3D模型管理流程的轻量级自动化解决方案 【免费下载链接】STL-thumbnail Shellextension for Windows File Explorer to show STL thumbnails 项目地址: https://gitcode.com/gh_mirrors/st/STL-thumbnail 在3D设计与打印工作流中&#x…

作者头像 李华
网站建设 2026/6/23 19:18:49

Pixelle-Video全球化架构:智能AI短视频引擎的多语言解决方案

Pixelle-Video全球化架构&#xff1a;智能AI短视频引擎的多语言解决方案 【免费下载链接】Pixelle-Video &#x1f680; AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video Pixelle-Video作…

作者头像 李华