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

深度学习量化双雄:PTQ 与 QAT 的技术剖析与实战

深度学习量化双雄:PTQ 与 QAT 的技术剖析与实战

写给想把 FP32 模型卷成 INT8 又不掉精度的你。


1 量化的动机

  • 体积:FP32 → INT8,模型大小 ×4 倍压缩
  • 带宽:内存/显存占用 ×4 倍降低
  • 算力:INT8 Tensor Core 峰值 ×4 倍提升
    一句话:量化 ≈ 免费午餐

2 训练后量化(PTQ)

2.1 原理

  1. 在校准集上跑一次前向,统计 权重/激活 的 min/max(或 99.9 % percentile)。
  2. 按公式计算 scalezero-point
    对称量化(权重常见):
    scale = max(|w|) / 127
    zero_point = 0
    
    非对称量化(激活常见):
    scale = (max - min) / 255
    zero_point = round(-min / scale)
    
  3. 将 scale/zero-point 写入引擎,推理时作为 常量乘子 直接吸收进 kernel,无额外计算

2.2 粒度

对象推荐粒度scale 个数
权重per-channel(每输出通道)OC
激活per-tensor(整张特征图)1

2.3 一键脚本

trtexec --onnx=model.onnx --int8 \--calibDataDir=./calib_imgs \--saveEngine=model_int8.engine
  • calib_imgs/ 只需原始图片,无标签
  • 10 分钟生成可部署引擎。

2.4 优缺点

  • ✅ 零训练、零侵入
  • ❌ 精度损失 1–3 %,对异常值敏感

3 量化感知训练(QAT)

3.1 原理

在训练图里插入 FakeQuant 节点

w_q = round(clip(w / scale)) * scale
  • 前向:模拟量化误差
  • 反向:STE 把梯度直接传给 FP32 权重,让网络学会“抗量化”的位置。

3.2 粒度

  • 默认:权重 per-channel,激活 per-tensor
  • 最新研究:scale/zero-point 亦可 可学习参数,端到端更新。

3.3 PyTorch 30 行示例

import torch, torchvision, torch.quantization as tqmodel = torchvision.models.resnet18(pretrained=True)
model.train()
tq.prepare_qat(model, qconfig=tq.get_default_qat_qconfig('fbgemm'))opt = torch.optim.AdamW(model.parameters(), 1e-4)
for x, y in train_loader:loss(model(x), y).backward()opt.step()torch.jit.save(tq.convert(model.eval()), 'qat.pt')
  • 额外训练 1–5 epoch
  • 精度损失 <0.5 %

3.4 优缺点

  • ✅ 精度几乎无损,支持 4-bit 超低比特
  • ❌ 需完整训练集和 GPU 时间

4 选型建议

场景推荐
模型已训练好,精度要求不苛刻PTQ
精度敏感,可接受再训练QAT
正在训练新模型直接 QAT

5 技术小结

  • scale/zero-point 是编译期常数,推理时 无额外延迟
  • PTQ 先上车,QAT 再精雕
    量化不再是黑魔法,而是标准化流水线。
http://www.dtcms.com/a/360566.html

相关文章:

  • 开源协作白板 – 轻量级多用户实时协作白板系统 – 支持多用户绘图、文字编辑、图片处理
  • globals() 小技巧
  • C++ 模板全览:从“非特化”到“全特化 / 偏特化”的完整原理与区别
  • Prometheus之启用--web.enable-remote-write-receiver
  • 基于muduo库的图床云共享存储项目(三)
  • 前端常见安全问题 + 防御方法 + 面试回答
  • 「数据获取」《中国工会统计年鉴》(1991-2013)(获取方式看绑定的资源)
  • 【人工智能99问】Qwen3简介(33/99)
  • 浅析NVMe协议:DIF
  • 多线程使用场景一(es数据批量导入)
  • 林曦词典|老死不相往来
  • 洛谷p2392kkksc03考前临时抱佛脚 详解(回溯,深度搜索法)
  • 大模型参数到底是什么?
  • CUDA与图形API的深度互操作:解锁GPU硬件接口的真正潜力
  • C++内存序不迷茫:从CPU缓存一致性理解Memory Order
  • 如何将剪贴板内容存为文件?Paste As File支持文本/图片转换
  • 批处理脚本操作 JSON 文件
  • centos7挂载iscis存储操作记录
  • Java学习笔记(前言:开发环境配置)
  • 五分钟聊一聊AQS源码
  • 【系统架构师设计(五)】需求工程上:需求开发与需求管理概述、结构化需求分析法
  • 【PyTorch】基于YOLO的多目标检测(一)
  • Trae接入自有Deepseek模型,不再排队等待
  • C# .Net8 WinFormsApp使用日志Serilog组件
  • 【IO学习】IO基础和标准IO函数
  • 生物学自然主义:心灵哲学中的生物性探索
  • 《程序员修炼之道》第七八九章读书笔记
  • 栈的基本概念介绍
  • kafka、RabbitMQ结构
  • Qt QNetworkAccessManager 简述及例程