news 2026/9/1 5:04:22

QAT伪量化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
QAT伪量化

QAT伪量化

QAT伪量化为什么可行?你的理解和QAT真实逻辑差异

你的直觉:真实硬件推理流程

  1. 输入浮点 → 量化转 int8

  2. 权重浮点 → 量化转 int8

  3. int8 × int8 整数卷积/矩阵乘,得到int32中间结果

  4. 反量化/偏移缩放 → 输出int8

全程算子内部全部整数运算,没有浮点数

QAT训练里伪量化(FakeQuant):全程张量都是float,只是模拟量化舍入截断,没有真正转int。

你疑惑点:明明硬件跑整数,训练却用浮点数模拟,为什么能收敛、PTQ/QAT之后导出onnx给NPU还能跑对?

1. 先把量化公式写清楚

对称量化公式:

xint=round(xfloatscale),xq=clip(xint,−128,127)x_{int}=round\left(\frac{x_{float}}{scale}\right),\quad x_{q}=clip(x_{int},-128,127)xint=round(scalexfloat),xq=clip(xint,128,127)

反量化:

x^float=xq⋅scale\hat{x}_{float}=x_q \cdot scalex^float=xqscale

伪量化 = quant + dequant 的组合:x^=Dequant(Quant(x))\hat x = Dequant(Quant(x))x^=Dequant(Quant(x))

输入是float,输出还是float。相当于:把数值压到离散的量化格点上,但数据类型不变。

硬件真实推理(int8)

float_in → quant → int8 → conv(int8*int8) → int32 → requant → int8_out → dequant → float_out

QAT伪量化前向(PyTorch)

float_in → FakeQuant(quant+dequant) → float(已经落在量化格点)→ conv(float * float) → FakeQuant → float_out

👉 前向传播:数值行为尽量贴近硬件;但数据类型依旧float,没有真正int8。

2. 反向传播梯度怎么处理?round是不可导!

这是伪量化存在的最核心原因。

round()函数导数处处为0,直接求导梯度直接死掉,网络无法训练。

QAT用直通估计器 STE(Straight‑Through Estimator)

  • 前向:执行round+clip,模拟量化噪声

  • 反向:绕过round,直接把梯度原样回传,相当于梯度穿过FakeQuant节点

∂x^∂x≈1\frac{\partial \hat x}{\partial x} \approx 1xx^1

如果训练时真的把张量转成int8类型:

PyTorch整数张量无法计算梯度,autograd直接失效,网络完全不能更新权重。

这就是训练阶段不能真转整数的根本约束。

所以QAT不能真正做int8计算,只能用浮点数模拟量化效果。

3. 那为什么伪量化训练完,导出给NPU跑真实int8可以对齐?

关键点:QAT学习的是scale/zero_point,以及权重在量化格点上的最优浮点位置

  1. QAT训练阶段,FakeQuant强制:权重、激活只能取k * scale的离散浮点值;

  2. 训练结束后,把权重直接round到对应整数格点:

Wint8=round(Wfloat/scalew)W_{int8}=round(W_{float}/scale_w)Wint8=round(Wfloat/scalew)

保存int8权重和scale;

  1. NPU推理时:硬件复现完全一样的scale,做真正int8整数乘加。

只要训练时的scale、clip范围、round行为和硬件推理严格对齐,伪量化训练得到的浮点权重,round之后得到的int8权重就是最优的那一组整数权重

简单比喻:

伪量化训练:在浮点数世界,强迫参数只能站在整数格子对应的坐标点上训练;

训练结束:直接把每个点取格子编号,就是硬件要用的int8。

4. 你的设想:训练就全部用int8计算,有没有这种东西?

有,叫完全整数训练(Integer‑only training),但工程上很难落地:

  1. 整数的梯度、优化器(Adam)都需要浮点数;优化器状态是float,无法全部int;

  2. 整数动态范围窄,梯度很容易溢出饱和;

  3. 目前NPU/地平线工具链主流只支持QAT伪量化流程。

所以工业界不做训练时int8计算,只做前向模拟量化噪声,反向STE梯度近似

5. 容易踩坑:伪量化与硬件不一致导致精度掉点

很多人QAT做完精度崩,就是FakeQuant和硬件行为对不上:

  1. FakeQuant的clip范围、对称/非对称模式,和NPU硬件的量化模式不一致;

  2. requant重量化逻辑(卷积输出int32如何缩放到int8),QAT仿真和硬件算子实现有差异;

  3. round模式:PyTorch round是银行家舍入,部分硬件是四舍五入;

  4. 激活的scale是逐tensor / per‑channel,两边配置必须一模一样。

地平线J6的QAT插件,本质就是重写FakeQuant节点,仿真J6硬件真实的量化舍入、截断、重量化行为,保证导出ONNX之后,NPU真实int8推理数值尽可能贴近QAT仿真输出。

简短总结

  1. 硬件推理:确实是输入、权重转int8,整数运算。

  2. QAT训练不能真转int8:整数张量无法求导,round不可导。

  3. 伪量化FakeQuant:quant(round+clip)+dequant,float模拟量化离散效应,反向用STE直通估计器传梯度。

  4. 训练收敛后,权重/激活用训练得到scale做round,得到真正int8,交给硬件执行整数运算。

  5. QAT的全部价值:让网络适应量化噪声,学到在离散整数格点上最优的参数,而不是训练阶段就跑整数计算。

如果你需要,我可以写一小段极简PyTorch伪量化+STE的示例代码,直观看到前向round、反向直通的行为。

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

Windows下部署OpenClaw:从WSL2到本地大模型的AI代理实战指南

简介:面向 Windows 开发者的 OpenClaw 部署指南,以 WSL2Ubuntu 源码编译和 Git Bash 直接运行两条路径为主线,覆盖环境准备、依赖安装、源码编译、配置向导,以及 SSH 权限异常、国内镜像加速等常见排错场景,适合需要在…

作者头像 李华
网站建设 2026/9/1 5:01:29

2025阿里云研发岗春招笔试全解析:考察逻辑与备战策略

2025年阿里云研发岗第二批春招笔试,刚结束的那批题目和往年比确实有一些新变化。我结合身边同学的面经反馈和近三年阿里云笔试的题型演化,把这轮笔试的考察逻辑、核心考点和备战路线完整拆一遍。这篇文章不押题,只讲考察逻辑和应对框架&#…

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

【原创】基于AI大模型+SpringBoot+Vue的健身房私教预约及会员办理系统(设计与实现)

摘要:随着行业信息化建设持续推进,健身房私教套餐系统相关业务对线上协同与数据沉淀的要求不断提高。传统线下或分散式办理方式存在流程繁琐、信息滞后、协作成本高、过程难追溯等弊端,难以适应便捷化、可管理的业务服务需求。同类课题亦多见…

作者头像 李华
网站建设 2026/9/1 4:57:46

MKVToolNix:无损封装音视频与字幕的终极工具指南

你有没有遇到过这样的场景:辛辛苦苦下载了一部高清电影,却发现视频和字幕是分开的两个文件;或者从不同来源获取了一段视频和一段高品质音频,想把它们完美地合成一个文件。这时候,你需要的不是一个功能繁杂、操作复杂的…

作者头像 李华
网站建设 2026/9/1 4:57:31

【单片机毕业设计】基于 STM32 或 51 单片机的激光测距参数设置与移动端监控系统设计 基于 STM32 或 51 单片机的 TOF 传感器距离采集预警设备设计与实现(023305)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华
网站建设 2026/9/1 4:56:54

国防科大操作系统公开课:从进程内存到文件I/O的体系化学习指南

1. 这门课到底解决什么问题,适合谁看?如果你正在为计算机专业课、408考研复习,或者想系统补上操作系统这块硬骨头,那国防科技大学的这门公开课,值得你花时间。它不是零散的讲座合集,而是一套从进程、内存、…

作者头像 李华