news 2026/5/9 12:25:35

CANN/cann-bench反量化SwiGLU量化算子

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/cann-bench反量化SwiGLU量化算子

DequantSwigluQuant 算子 API 描述

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

1. 算子简介

反量化、SwiGLU和量化的融合。

主要应用场景

  • 大语言模型推理中 FFN 层的量化加速
  • 低精度推理流水线中 SwiGLU 激活函数的融合计算
  • INT8 量化模型中的反量化-激活-重量化一体化操作

算子特征

  • 难度等级:L3(FusedComposite)
  • 单输入单输出,融合反量化、SwiGLU 激活和量化三个操作
  • 输入最后一维 H 必须为偶数(SwiGLU 将其等分为两半)

2. 算子定义

数学公式

$$ y = \text{quantize}(\text{SwiGLU}(\text{dequantize}(x))) $$

具体步骤:

  1. 反量化:将 int32 输入转换为浮点数
  2. SwiGLU 激活:将最后一维等分为两半,当 activate_left=False 时 $y = \text{SiLU}(x_{left}) \times x_{right}$,当 activate_left=True 时 $y = x_{left} \times \text{SiLU}(x_{right})$
  3. 量化:将结果量化为 INT8

3. 接口规范

算子原型

cann_bench.dequant_swiglu_quant(Tensor x, bool activate_left, str quant_mode, int dst_type) -> Tensor y

输入参数说明

参数类型默认值描述
xTensor必选输入张量,任意维度,最后一维 H 必须为偶数
activate_leftboolFalse是否激活左侧
quant_modestr"static"量化模式
dst_typeint0目标数据类型 (0:DT_INT8)

输出

参数Shapedtype描述
y除最后一维减半外与输入相同int8输出张量

数据类型

输入 dtype输出 dtype
float16int8
bfloat16int8
int32int8

规则与约束

  • 输入张量的最后一维 H 必须为偶数,SwiGLU 将其等分为两半分别处理
  • activate_left 控制 SwiGLU 的激活方向:False 时对左半部分应用 SiLU,True 时对右半部分应用 SiLU
  • quant_mode 指定量化模式,默认 "static"
  • dst_type 取值:0 表示 DT_INT8
  • 当输入为 int32 类型时,先以 scale=0.1 进行反量化转浮点

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 """ DequantSwigluQuant算子Torch Golden参考实现 反量化、SwiGLU和量化的融合 公式: y = quantize(SwiGLU(dequantize(x))) """ def dequant_swiglu_quant( x: torch.Tensor, activate_left: bool = False, quant_mode: str = 'static', dst_type: int = 0 ) -> torch.Tensor: """ 反量化、SwiGLU和量化的融合 公式: y = quantize(SwiGLU(dequantize(x))) Args: x: 输入张量 activate_left: 是否激活左侧 quant_mode: 量化模式' dst_type: 目标数据类型 (0:DT_INT8) Returns: 输出张量 """ def swiglu(x, activate_left=False): # 截断到偶数维以支持非对齐输入 last_dim = x.shape[-1] - (x.shape[-1] % 2) x = x[..., :last_dim] half = x.shape[-1] // 2 if activate_left: x_left = x[..., :half] x_right = x[..., half:] return x_left * torch.nn.functional.silu(x_right) else: x_left = x[..., :half] x_right = x[..., half:] return torch.nn.functional.silu(x_left) * x_right if x.dtype == torch.int32: scale = 0.1 x_float = x.float() * scale else: x_float = x result = swiglu(x_float, activate_left) # INT8 量化 max_val = result.abs().max() if max_val == 0: # 处理全零情况,避免 scale=inf y = torch.zeros_like(result, dtype=torch.int8) else: scale = (127.0 / max_val).to(torch.float32) y = torch.clamp((result.float() * scale.item()).round(), -128, 127).to(torch.int8) return y

6. 额外信息

算子调用示例

import torch import cann_bench x = torch.randn(2, 4096, dtype=torch.float16, device="npu") y = cann_bench.dequant_swiglu_quant(x, activate_left=False, quant_mode='static', dst_type=0) # INT8 量化 x_int32 = torch.randint(-128, 127, (2, 4096), dtype=torch.int32, device="npu") y = cann_bench.dequant_swiglu_quant(x_int32, activate_left=True, quant_mode='static', dst_type=0) # 反量化后 SwiGLU 再量化

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

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

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

CANN/ops-cv双线性上采样梯度算子

UpsampleBilinear2dGrad 【免费下载链接】ops-cv 本项目是CANN提供的图像处理、目标检测相关的算子库&#xff0c;实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-cv 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/At…

作者头像 李华
网站建设 2026/5/9 12:25:25

AI模型不确定性量化:从贝叶斯推理到科学计算实践

1. 不确定性量化&#xff1a;为什么你的AI模型需要“自知之明”&#xff1f;在科学计算和工程决策中&#xff0c;我们常常面临一个尴尬的局面&#xff1a;一个深度学习模型对某个分子的毒性给出了高达0.95的预测置信度&#xff0c;但实验验证却发现它完全错了。或者&#xff0c…

作者头像 李华
网站建设 2026/5/9 12:24:38

训练2万亿参数大模型的实现

1. 万亿参数llm训练的挑战2. 内存与算力约束3. 数据并行与通信优化4. ZeRO零冗余优化器5. 梯度检查点6. FlashAttention7. Ring Attention8. 混合专家模型&#xff08;MoE&#xff09;9. 并行策略组合10. 集群故障恢复机制11. 完整训练系统架构12. 趋势与训练成本估算 1. 万亿参…

作者头像 李华
网站建设 2026/5/9 12:22:30

独立开发者如何借助Taotoken多模型能力快速验证产品创意

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 独立开发者如何借助Taotoken多模型能力快速验证产品创意 对于独立开发者或小型工作室而言&#xff0c;验证一个AI产品创意的核心在…

作者头像 李华
网站建设 2026/5/9 12:22:00

Hello-Agents 写给想造 Agent 但又怕搞不明白的人

说真的&#xff0c;Agent 这个概念刚出来的时候&#xff0c;我是拒绝的。感觉又是那种“人人都要学大模型”的焦虑营销。直到我真的去翻了 Hello-Agents​ 这个项目。GitHub&#xff1a;44.4k Star / 5.4k Fork​这不是水星&#xff0c;这是真有人在认真写教程。它解决了什么问…

作者头像 李华