昇腾平台融合算子 dequant_swiglu_quant 的设计与实现
​作者​昇腾实战派​知识地图​https://blog.csdn.net/Lumos_Lovegood/article/details/161601003背景概述在深度学习推理场景中模型量化与激活函数的组合操作频繁出现通常需要依次执行反量化Dequant、激活函数如 SwiGLU和量化Quant三个步骤。传统分步执行方式会产生大量中间张量的显存读写导致推理延迟增加。为解决这一问题本文设计并实现了一个融合算子dequant_swiglu_quant将上述三个操作合并为一次 kernel 调用显著减少显存访问开销提升推理性能。该算子基于 Triton-Ascend DSL 开发运行于 Ascend NPU 平台。1. 算子功能概述dequant_swiglu_quant是一个融合算子将反量化Dequant、SwiGLU 激活、量化Quant三个操作融合为一次 kernel 调用减少中间结果的显存读写开销提升推理性能。该算子对标torch_npu.npu_dequant_swiglu_quantNPU 原生算子使用 Triton-Ascend DSL 实现在 Ascend NPU 上运行。1.1 计算流程输入 x [TokensNum, 2H] │ ├─ Dequant反量化 │ ├─ x x * weight_scale 权重反量化INT32 输入时 │ ├─ x x * activation_scale 激活反量化INT32 输入时 │ └─ x x bias 可选偏置 │ ├─ SwiGLU激活 │ ├─ 将 x 沿最后一维拆分为 A[:, 0:H] 和 B[:, H:2H] │ ├─ 标准 SwiGLU: swish(A) * B activate_leftTrue │ └─ 变种 SwiGLU: clamp swish(z, α) * (z_linear bias) │ ├─ Smooth Quant平滑量化可选 │ └─ out out * quant_scale │ └─ Quant量化 ├─ 静态量化: out clamp(round(out / quant_scale quant_offset), -max, max) └─ 动态量化: scale max(|out|); out clamp(round(out / scale), -max, max) │ 输出 output [TokensNum, H], scale [TokensNum]1.2 分组量化支持 count 模式的分组量化通过group_index参数指定每个分组的 token 数量。每组使用不同的 scale 参数weight_scale、activation_scale、quant_scale。示例x.shape [128, 2H],group_index [2, 1, 3]表示 3 个分组group0 x[0:2, :]使用 scale[0, :]group1 x[2:3, :]使用 scale[1, :]group2 x[3:6, :]使用 scale[2, :]2. 算子接口2.1 函数签名defdequant_swiglu_quant(x,*,weight_scaleNone,activation_scaleNone,biasNone,quant_scaleNone,quant_offsetNone,group_indexNone,activate_leftFalse,quant_mode0,swiglu_mode0,clamp_limit7.0,glu_alpha1.702,glu_bias1.0,dst_typetorch.int8,round_moderint,)-(Tensor,Tensor)2.2 参数说明必选参数参数类型形状说明xTensor[TokensNum, 2H]输入张量支持 int32 / bfloat16最后一维必须为偶数可选参数参数类型形状默认值说明weight_scaleTensor[groupNum, 2H]None权重反量化系数float32。int32 输入时必选activation_scaleTensor[TokensNum, 1]None激活反量化系数float32。int32 输入时必选biasTensor-None偏置int32。group_index 非 None 时必须为 Nonequant_scaleTensor[groupNum, H]None平滑量化系数float32quant_offsetTensor-None量化偏移float32。group_index 非 None 时必须为 Nonegroup_indexTensor[groupNum]None分组索引count 模式int64activate_leftbool-FalseTrue: swish(A) * BFalse: A * swish(B)quant_modeint-00静态量化1动态量化swiglu_modeint-00标准 SwiGLU1变种 SwiGLUclamp_limitfloat-7.0变种 SwiGLU 的 clamp 限制glu_alphafloat-1.702变种 SwiGLU 的 alpha 参数glu_biasfloat-1.0变种 SwiGLU 的 bias 参数dst_typetorch.dtype-torch.int8输出类型int8 / float8_e4m3fn / float8_e5m2round_modestr-“rint”舍入模式rint银行家舍入/ floor向下取整2.3 返回值输出类型形状说明outputTensor[TokensNum, H]量化输出dtype 由 dst_type 决定scaleTensor[TokensNum]量化 scalefloat323. 计算公式3.1 反量化DequantINT32 输入x_float x * weight_scale * activation_scale biasBF16 输入x_float x # 无需反量化直接使用3.2 SwiGLU 激活将 x_float 沿最后一维拆分为 A x_float[:, 0:H] 和 B x_float[:, H:2H]。标准 SwiGLUswiglu_mode0左激活activate_leftTrueoutput swish(A) * B右激活activate_leftFalseoutput A * swish(B)其中 swish(z) z * sigmoid(z)sigmoid(z) 1 / (1 exp(-z))变种 SwiGLUswiglu_mode1按奇偶交错拆分x_glu clamp(x_even, maxclamp_limit) x_linear clamp(x_odd, -clamp_limit, clamp_limit) output swish(x_glu, α) * (x_linear glu_bias)其中 swish(z, α) z * sigmoid(α * z)3.3 平滑量化Smooth Quant可选output output * quant_scale3.4 量化Quant静态量化quant_mode0output clamp(round(output / quant_scale quant_offset), -max_val, max_val) scale quant_scale # 静态量化时 scale 为输入参数动态量化quant_mode1scale max(|output|) / max_val # 逐行求最大绝对值 output clamp(round(output / scale), -max_val, max_val)max_val 取值INT8: 127.0FP8 E4M3FN: 448.0FP8 E5M2: 57344.04. 约束条件4.1 输入类型约束输入类型weight_scaleactivation_scalebias说明int32必选必选可选需要反量化bfloat16必须为 None必须为 None必须为 None无需反量化4.2 分组量化约束group_index仅支持动态量化quant_mode1group_index非 None 时bias 和 quant_offset 必须为 Nonegroup_index求和不超过 TokensNumgroup_index为 count 模式每个元素表示该分组的 token 数量4.3 形状约束x 必须为 2D 张量最后一维为偶数2Hweight_scale 形状[groupNum, 2H]单组时 groupNum1activation_scale 形状[TokensNum, 1]quant_scale 形状[groupNum, H]group_index 形状[groupNum]4.4 其他约束clamp_limit、glu_alpha、glu_bias 仅在 swiglu_mode1 时生效输出 out 和 scale 超过 group_index 总和的部分为未定义数据5. 实现架构5.1 文件结构src/ ├── dequant_swiglu_quant.py # 算子入口参数验证、分组 scale 展开、kernel 调度 ├── dequant_swiglu_quant_static_base.py # 静态量化 kernel └── dequant_swiglu_quant_dynamic_base.py # 动态量化 kernel5.2 Kernel 设计静态量化 Kernel单阶段处理反量化 → SwiGLU → 平滑量化 → 静态量化数据在寄存器中流转无中间缓冲区所有计算在寄存器中完成减少显存访问支持 quant_offset静态量化特有的偏移参数动态量化 Kernel两阶段处理第一阶段反量化 → SwiGLU → 平滑量化 → 求行级 ReduceMax第二阶段使用 ReduceMax 结果计算 scale → 量化输出需要中间缓冲区swiglu_tmp暂存 SwiGLU 结果供第二阶段使用5.3 辅助 Kernel函数功能说明sigmoid_kernel计算 sigmoid1.0 / (1.0 exp(-x))swish_kernel计算 swishx * sigmoid(x)rint_kernel银行家舍入round half to even匹配 NPU 的 CAST_RINT5.4 分组 Scale 展开入口函数中通过_expand_group_scale将分组 scale 展开为逐行 scale根据group_index计算row_to_group映射使用 advanced indexing 展开scale[row_to_group]单组groupNum1时 squeeze 为 1D5.5 BLOCK_SIZE 配置BLOCK_M 和 BLOCK_N 通过 triton.autotune 自动寻优不在此处固定配置。优化目标确保不超出 NPU UB 容量限制约 196 KB。6. 舍入模式6.1 rint银行家舍入round half to even默认舍入模式匹配 NPU 的 CAST_RINT 操作非 x.5 值标准四舍五入x.5 值舍入到最近的偶数如 2.5 → 2.03.5 → 4.0实现逻辑floor_xfloor(x)fracx-floor_x is_half(frac0.5)is_even(int(floor_x)1)0resultwhere(is_halfis_even,floor_x,floor_x1.0)resultwhere(is_half,result,where(frac0.5,floor_x1.0,floor_x))6.2 floor向下取整直接使用tl.floor(x)实现。7. 精度说明7.1 INT8 输出精度由于 Triton 和 NPU 的 SwiGLU 中间浮点计算存在 ULPUnit in the Last Place级别的差异经 x.5 边界舍入放大后可能导致极少数 INT8 输出元素差 ±1。这是浮点运算的固有特性不是实现 bug。在精度测试中允许极少量 INT8 ±1 差异比例 ≤ 1e-5。7.2 Scale 精度动态量化时scale 输出与 NPU 参考实现完全一致float32 精度范围内。静态量化时NPU 的 scale 输出语义不明确精度测试中不检查 scale。8. 性能特征8.1 融合优势相比分步执行反量化 → SwiGLU → 量化融合算子减少中间结果的显存读写2 次完整读写 → 0 次减少 kernel launch 开销3 次 → 1 次提高数据局部性更好地利用 NPU UB 缓存8.2 静态 vs 动态量化特性静态量化动态量化Kernel 阶段单阶段两阶段中间缓冲区不需要需要 swiglu_tmp量化 scale输入参数运行时计算延迟更低稍高精度依赖 quant_scale 质量自适应精度更稳定8.3 典型性能数据INT32 动态量化单组NPU: Atlas 800I A2ShapeTriton (ms)NPU (ms)加速比(64, 512)0.0120.0060.50(1024, 2048)0.1250.0310.25(4096, 8192)1.6180.5000.31BF16 动态量化单组ShapeTriton (ms)NPU (ms)加速比(64, 512)0.0100.0070.70(1024, 2048)0.0930.0210.23(4096, 8192)1.1690.2880.25注当前 Triton 实现与 NPU 原生算子仍有性能差距后续可通过优化 BLOCK_SIZE、向量化策略等提升性能。9. 测试9.1 精度测试cdtests pytest test_accuracy_dequant_swiglu_quant.py-v-knot TestFP8Output9.2 性能测试cdtests python test_benchmark_dequant_swiglu_quant.py性能测试结果保存到../perf_time/和../perf_throughput/目录。

相关新闻

EMR Serverless Spark 基于 MinHash-LSH 实现 PB 级文本语义去重 4 倍加速

EMR Serverless Spark 基于 MinHash-LSH 实现 PB 级文本语义去重 4 倍加速

大模型训练,数据是燃料,质量是引擎。 在语料准备的整条链路中,文本去重是最基础也最绕不开的环节。重复语料不仅浪费算力,还会导致模型过拟合,直接影响生成质量。然而,当数据规模达到PB 级别时,…

2026/8/1 11:21:53阅读更多 →
多无人机协同作业算法在农业植保中的优化与应用

多无人机协同作业算法在农业植保中的优化与应用

1. 项目背景与核心价值多无人机系统在农业植保领域的应用已经成为精准农业的重要技术支撑。2022年发表在BE SCI二区Top期刊的这项研究,针对作物保护场景中的无人机协同作业问题,提出了创新的任务分配算法。我在实际农业无人机项目中发现,传统…

2026/8/1 11:21:53阅读更多 →
半迭代探索:平衡确定性与灵活性的工程实践

半迭代探索:平衡确定性与灵活性的工程实践

1. 项目概述:什么是半迭代探索半迭代探索(Semi-Iterative Exploration)是一种介于完全随机探索和系统化探索之间的实验方法。在我的工程实践中,这种技术特别适用于资源有限但需要快速验证假设的场景。与传统的瀑布式开发或纯敏捷开…

2026/8/1 11:21:53阅读更多 →
LangChain输出解析器:结构化AI输出的关键技术

LangChain输出解析器:结构化AI输出的关键技术

1. 为什么需要结构化AI输出? 在真实业务场景中,我们经常遇到这样的困境:当大型语言模型(LLM)生成了一段看似完美的回答,却发现程序无法直接利用这些非结构化的文本数据。比如电商客服场景中,用户…

2026/8/1 13:32:47阅读更多 →
Windows 11/10 + VS 2019 + Cocos2d-x 4.0 开发环境搭建与UI实战入门

Windows 11/10 + VS 2019 + Cocos2d-x 4.0 开发环境搭建与UI实战入门

1. 项目概述:为什么选择这套组合? 如果你是一名游戏开发者,或者对移动端、桌面端2D游戏开发感兴趣,那么“Cocos2d-x”这个名字你一定不陌生。它是一个老牌且强大的开源跨平台游戏引擎,尤其在2D领域积累了深厚的生态。而…

2026/8/1 13:32:47阅读更多 →
LeetCode 430:深度优先遍历与链表指针操作实战解析

LeetCode 430:深度优先遍历与链表指针操作实战解析

1. 项目概述:当链表有了“子节点” 如果你刷过一些链表题,对单向、双向链表的增删改查已经轻车熟路,那么Leetcode 430这道“扁平化多级双向链表”的题目,可能会给你带来一点新鲜的挑战感。它不再是简单的直线结构,而是…

2026/8/1 13:32:47阅读更多 →
金税四期数据穿透稽查:技术架构与异常检测算法分析

金税四期数据穿透稽查:技术架构与异常检测算法分析

引言:金税四期数据穿透的技术挑战 金税四期系统的核心特征之一是"以数治税"——通过138个数据源的实时交叉比对,实现对企业税务行为的全维度穿透式监管。相比金税三期"以票管税"的单维度模式,金税四期对数据的采集、清洗…

2026/8/1 13:32:47阅读更多 →
基于NVIDIA Jetson与Riva SDK的实时语音识别系统部署实战

基于NVIDIA Jetson与Riva SDK的实时语音识别系统部署实战

1. 项目概述:在边缘设备上实现实时语音转文字 最近在折腾一个挺有意思的项目,核心目标是在Nvidia Jetson这类边缘计算设备上,实现一个高效、实时的语音字幕生成系统。简单来说,就是让设备能“听懂”人说话,并立刻把内…

2026/8/1 13:32:47阅读更多 →
Box64高性能架构实现:深度解析跨平台x86_64模拟器技术原理与优化方案

Box64高性能架构实现:深度解析跨平台x86_64模拟器技术原理与优化方案

Box64高性能架构实现:深度解析跨平台x86_64模拟器技术原理与优化方案 【免费下载链接】box64 Box64 - Linux Userspace x86_64 Emulator with a twist, targeted at ARM64, RV64 and LoongArch Linux devices 项目地址: https://gitcode.com/gh_mirrors/bo/box64 …

2026/8/1 13:30:46阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/31 20:44:05阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/31 17:41:43阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/31 20:44:05阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/1 0:00:10阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/1 0:00:10阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/1 0:00:10阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/1 0:00:10阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/1 0:00:10阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/1 0:00:10阅读更多 →