当前位置: 首页 > news >正文

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、反向直通的行为。

http://www.cnnetsun.cn/news/4344298.html

相关文章:

  • Windows下部署OpenClaw:从WSL2到本地大模型的AI代理实战指南
  • 2025阿里云研发岗春招笔试全解析:考察逻辑与备战策略
  • 【原创】基于AI大模型+SpringBoot+Vue的健身房私教预约及会员办理系统(设计与实现)
  • MKVToolNix:无损封装音视频与字幕的终极工具指南
  • 【单片机毕业设计】基于 STM32 或 51 单片机的激光测距参数设置与移动端监控系统设计 基于 STM32 或 51 单片机的 TOF 传感器距离采集预警设备设计与实现(023305)
  • 国防科大操作系统公开课:从进程内存到文件I/O的体系化学习指南
  • 【设计模式精讲】8.原型模式(Prototype)
  • 安卓4老电视没有输入法?从APK安装到ADB的完整解决指南
  • Cesium三维淹没分析:热力图可视化水深分布实践
  • 27届大模型面试准备(七十):大模型推理服务的负载均衡与智能请求路由
  • 0x28通信控制服务测试用例设计:从需求拆解到落地实践
  • 武汉国家开放大学怎么报名?靠谱教育机构怎么选?华祺教育优势详解
  • 基于微信小程序的餐厅预约系统设计与实现源码+文档+讲解视频
  • 深度学习+CNN 深度学习大白菜病害检测系统预测模型完整项目源码+训练脚本+评估指标【AI毕设】
  • Codex多Agent加密:你的AI编程Agent正在变成监察黑洞
  • STM32F103C8T6驱动WS2812B灯带:基于PWM+DMA的完整方案
  • 2026年AI岗位能力要求与工程实践:从RAG到模型部署全解析
  • 工厂必须设置的安全标识有哪些?分别放在什么位置?
  • 一张图彻底看懂5G RF前端:从PA、ET、FEMiD、Duplexer到Antenna Tuner,为什么中间能损失4~5dB?
  • AI生成测试用例实战:提示词工程与结构化输出设计
  • SpringBoot+Vue入校申报审批系统:从设计到部署全解析
  • Zotero AI插件批量生成文献精读笔记实战指南
  • 数据科学家私藏!5个Python冷门库,告别重复劳动,效率翻10倍
  • Spring Boot+Vue全栈实战:构建自动化网站监控系统
  • 技术经纪人如何提升匹配效率与专业能力?
  • Live2D动画项目工程化全流程:从原画拆分到Web集成的“和弦”实践
  • Python实战:打造象棋打谱与AI分析桌面小软件
  • CNC刀具直径精准测量全攻略:从工具选择到实战流程
  • Windows USB插拔记录清理指南:注册表、日志与一键脚本
  • UDS 0x28通信控制服务测试用例设计:从协议规范到CANoe自动化验证