CANN/cann-bench:DequantSwigluQuant算子
DequantSwigluQuant 算子 API 描述【免费下载链接】cann-bench评测AI在处理CANN领域代码任务的能力涵盖算子生成、算子优化等领域支撑模型选型、训练效果评估统一量化评估标准识别Agent能力短板构建CANN领域评测平台推动AI能力在CANN领域的持续演进。项目地址: https://gitcode.com/cann/cann-bench1. 算子简介对输入张量 x 进行反量化Dequant→ SwiGLU 激活 → 动态量化per-token Quant三步融合输出量化后的结果 y 和 per-token scale。精简版仅保留生产推理常用的 5 个参数仅动态量化不暴露 group_indexMoE 分组路由、swiglu_mode 变种、 bias、quant_offset、quant_mode固定为 dynamic per-token等。主要应用场景大语言模型推理 FFN 层 W8A8 量化加速int32 per-token dequant SwiGLU 重量化BF16 → INT8 一体化加速去掉中间 dequant/quant 显存开销算子特征难度等级L3FusedComposite主输入x可选 3 个 Tensorweight_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) * ATrueswiglu_out SiLU(A) * BStep 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_scaleNone, Tensor? activation_scaleNone, Tensor? quant_scaleNone, bool activate_leftFalse, ) - (Tensor y, Tensor scale)Shape 变量变量含义TokensNumtoken 数≥ 0H输出最后一维大小x最后一维的一半 0输入参数参数类型shapedtype必选描述xTensor[TokensNum, 2H]int32 / bfloat16 / float16✓主输入尾轴必须为偶数weight_scaleTensor[1, 2H]float32xint32 时必选权重量化的反量化系数activation_scaleTensor[TokensNum]float32xint32 时必选per-token 激活反量化系数quant_scaleTensor[1, H]float32可选smooth 量化系数仅 float32activate_leftbool——可选默认 FalseFalse SiLU(B)*ATrue SiLU(A)*B输出参数shapedtype描述y[TokensNum, H]int8量化后输出scale[TokensNum]float32每 token 的量化 scalemax abs / 127数据类型支持x输入 dtypeweight_scale/activation_scalequant_scaleyscaleint32必须提供(float32 / float32)可选 float32int8float32bfloat16必须为 None可选 float32int8float32float16必须为 None可选 float32int8float32规则与约束x.shape[-1]必须为偶数x必须是 2D。x为 int32 时weight_scale与activation_scale必须非 None。x为 bfloat16 / float16 时weight_scale与activation_scale必须为 None。quant_scale仅支持 float32 dtypefp16 / bf16 在 CANN 850 上调用会运行时报错。输出y仅 int8scale仅 float32。该接口仅支持推理场景及图模式调用。支持芯片Atlas A2 / Atlas 800I A2 / A200I A2 / Atlas A3 系列。不支持的参数相对官方 API下列参数tasks精简版不暴露调用底层算子时取默认值参数默认值用途 / 不暴露原因quant_mode1pinned dynamic静态模式在 CANN 850 实测中表现为 identity scale 且 scale 返回未初始化内存不具备生产可用性biasNonex 的偏置可在算子外做quant_offsetNone量化偏移生产部署中几乎都为 0group_indexNoneMoE 分组路由swiglu_mode00传统 SwiGLU1变种带 clamp alpha biasclamp_limit7.0仅变种 SwiGLU 生效glu_alpha1.702仅变种 SwiGLU 生效glu_bias1.0仅变种 SwiGLU 生效支持范围输入 tensor 各维度与参数的支持范围维度 / 参数范围备注TokensNumx第 0 维1 ~ 65536cases.csv 实测 127 ~ 32768activation_scale长度须等于 TokensNum2Hx最后一维2 ~ 16384cases.csv 实测 64 ~ 8194必须为偶数weight_scale形状须为[1, 2H]H输出最后一维1 ~ 8192由2H/2派生quant_scale形状须为[1, H]activate_left{false, true}cases.csv 实测两值falseSiLU(B)*AtrueSiLU(A)*B约束x必须为 2D 张量x.dtypeint32时weight_scale与activation_scale必须同时非 None否则两者必须同时为 Nonequant_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_scaleNone, activation_scaleNone, quant_scaleNone, activate_leftFalse): # 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 # 路径 Ax bfloat16无 weight_scale纯 SwiGLU 动态量化 x torch.randn(2048, 4096, dtypetorch.bfloat16, devicenpu) y, scale torch_npu.npu_dequant_swiglu_quant(x, quant_mode1) # y: [2048, 2048] int8, scale: [2048] float32 # 路径 Bx int32W8A8 反量化路径 smooth quant x torch.randint(-128, 127, (1024, 4096), dtypetorch.int32, devicenpu) ws torch.randn(1, 4096, dtypetorch.float32, devicenpu) # weight_scale as_ torch.randn(1024, dtypetorch.float32, devicenpu) # activation_scale qs torch.randn(1, 2048, dtypetorch.float32, devicenpu) # quant_scale y, scale torch_npu.npu_dequant_swiglu_quant( x, weight_scalews, activation_scaleas_, quant_scaleqs, quant_mode1)注tasks暴露的接口不接受quant_mode参数调用底层 torch_npu 时 由 ref 函数固定传quant_mode1。参考文档官方 CANN 算子文档aclnnDequantSwigluQuanttorch_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),仅供参考