type
status
date
slug
summary
tags
category
icon
password
🤔 什么是神经网络量化?
通常来说,“量化”指“连续”到“离散”的一个过程。在人工智能语境下,“量化”通常指将神经网络模型从高精度(例如fp32)转化为低精度(例如int8,binary…),从而降低内存开销和计算开销。
从映射关系上来说,分为线性量化和非线性量化。在线性量化中,又分为对称量化和非对称量化。从量化方式上,分为Post Training Quantization(PTQ)和量化感知训练(QAT, Quantization-Aware Training)。
线性量化(Linear Quantization)
两种数值类型的线性映射(An affine mapping of integers to real numbers),又称uniform quantization,与此对应的是non-uniform quantization.

r代表浮点数,S代表scale(浮点数),q为量化后的整数。Z为零点(整数),含义是整数的Z值对应到浮点的0值。这个数是没有量化误差的

一个完整的量化算子过程应该包括量化和反量化:
量化误差来自: round error 和 clip error.
- rounding error:
- clipping error: s ,error
真实部署中,还是利用了浮点数乘法,只是做计算的时候用了整数:
在整数乘法结束后,需要进行重量化(Requantization)进行浮点数数值范围恢复。包括:,重新量化(从而可以输入到下一层),公式如下:
对称量化: Symmetric Quantization
z=0, TBA
😊 博主推荐
💯 博文/课程推荐:
- Nvidia tensorrt int8实战:
- 商汤ppq作者张志大佬的教程:(尤其是前几节)
张志对于量化的一些理解:
[RFC] MMRazor Quantization Design
Updated Jan 17, 2023
- 华为工程师zomi酱的教程:
- 知乎专栏:大白话模型量化:
- MIT EfficientML(韩松教授主讲)
- 零散教程:
框架推荐:
各家的推理引擎都有针对tensorflow,pytorch模型的量化包,例如openvino的
nncf
,tensorrt的 quantization-for-pytorch
之类,甚至可以直接使用 trtexec
进行量化。但是有以下一些弊端:- 只针对自家的推理引擎,如果想部署到多种推理引擎的话比较麻烦;
- 量化算法黑箱,例如
trtexec
int8优化时不知使用什么量化算法;
onnxruntime也是一个不错的技术路线,提供了量化策略以及在多种端侧的部署;
有一定技术能力的可以考虑tvm,由陈天齐等人开源,是一种神经网络编译器,可以提供更加深层的定制优化
另外还有一些压缩模型库,提供了常用预训练模型:
- FastDeploy,openmmlab团队出品,主要对接paddlepaddle模型