A White Paper on Neural Network Deployment
  • ❤️‍🔥A White Paper on Neural Network Deployment
    • ❤️‍🔥A White Paper on Neural Network Deployment
    • 🤠CUDA
      • 🤑CPU|GPU程序执行流程
      • 🤗QiuckLearnFromPicture
      • 🤒GPU编程模型
      • 🫣线程束和线程束分化|Warp
      • 🤭Reduction|并行规约
      • 🤔全局内存(Global Memory)访问模式
      • 🫢Share Memory|共享内存|Bank Conflicts
      • 😷CUDA流和事件
      • 🫡Nsight system和Nsight compute
      • 🤫Grid-Stride Loops
    • 😄ONNX
      • 😉ONNX中的各类Proto
      • 🤔onnx->torch
      • 🥳0x00自定义算子
      • 😕0x01自定义算子
      • 🥴ONNX 模型的修改与调试
      • 😆ONNX中的一些概念
      • 😍用python操作ONNX
      • 🥹ONNX中的广播机制
      • 🤣外部数据
      • 🥰ONNX Model hub
      • 😘ONNX IR(Intermediate Representation)
      • 🥳ONNX后端
      • 🥸概述
    • 🐶TensorRT
      • 🐱TensorRT快速入门指南
      • 🐭文档简介
      • 🐹TensorRT的功能
      • 🐰TensorRT的C++接口解析
      • 🦊TensorRT的Python接口解析
      • 🐻TensorRT如何工作
      • 🐼trtexec的使用
      • 🐻‍❄️实战:解析onnx模型保存为engine文件|from scratch
      • 🐨实战:加载engine文件并执行推理|from scratch
      • 🐯手撕TensoRT源码|0x00
    • 🫶模型量化和剪枝
      • 🖕IEEE754标准
      • 🫰浮点运算产生的误差
      • 🤲映射和偏移
      • 🫴quantization from scratch|python
      • 👏动态量化范围
      • 🤝量化粒度
      • 👍校准
      • 👊Post-Training Quantization
      • ✊Quantization-Aware Training
      • 🤞pytorch-quantization使用文档
      • ✌️Polygraphy-Cheatsheet
    • 🤺杂文不杂
      • 😾Roofline_model
      • 🤖模型部署的几大误区
      • 😽手算Ampere架构各个精度的Throughout
      • 😻Tensor Core VS CUDA Core
      • 😺PNNX计算图结构剖析
      • 🎃融合BN和Conv层
      • 👾深度神经网络编译器原理简介
      • 👽在WSL2上安装CUDA_cuDNN_TensorRT
    • 🍀CPP
      • 🪵lamda表达式|C++11
      • 🌴智能指针|C++11
      • 🌲右值引用|移动语义|完美转发|C++11
      • 🫑emplace_back 减少内存拷贝和移动|C++11
      • 🥬多线程|互斥锁|条件变量|C++11
      • 🥒异步操作|C++11
      • 🍆原子变量|CAS操作|内存顺序|C++11
      • 🍏对象生存期和资源管理|RAII设计思想
      • 🍎Pimpl设计模式|编译防火墙
      • 🌶️std::variant|C++17
      • 🫛std::any|C++17
    • 🩷部署实战
      • ❤️yolov8Multitask
      • 💚yolov5
      • 🧡pointpillars
      • 💛centerpoint
      • 🩵deepstream
      • 💜BEVfusion
      • 💙BEVLane
      • 🖤Occupancy
    • ☯️重点参考书籍
Powered by GitBook
On this page
  • Minmax calibration
  • Entropy clibration
  • Percentile calibration
  • 如何选择calibration algorithm
  • calibration dataset与batch size的关系

Was this helpful?

Edit on GitHub
  1. A White Paper on Neural Network Deployment
  2. 模型量化和剪枝

校准

Previous量化粒度NextPost-Training Quantization

Last updated 1 year ago

Was this helpful?

量化中另外一个非常重要的概念:Calibration(校准) 对于一个训练好的模型,权重是固定的,所以可以通过一次计算就可以得到每一层的量化参数。 但是activation value(激活值)是根据输入的改变而改变的。所以需要通过类似于统计的方式去 寻找对于不同类型的输入的不同的dynamic range,这个过程叫做校准。

针对不同的输入,各层layer的input activation value都 会有不同的分布和取值。大数据集的差别比较大。我们需 要通过训练数据集中的一部分数据来尝试表征整个数据集 的分布。 这个小数据集就是calibration dataset。一般往往很小, 但需要尽量有整体的表征。

calibration的过程一般是在模型训练以后进行的,所以一般与PTQ搭配使用,整体的流程就是:

  • 在calibration dataset中做一次FP32的推理

  • 以histogram的形式去统计每一层的floating point的分布 ,(注意,因为activation value是per-tensor quantization) ,寻找能够表征当前层的floating point分布的scale 。

  • 这里会有几种不同的算法,比较常见的有

    • Minmax calibration

    • Entropy calibration

    • Percentile calibration

Minmax calibration

FP32->INT8的scale需要能够把FP32 中的最大最小值都给覆盖住。 如果floating point的分布比较离散, 各个区间下的分布都比较均匀, minmax是个不错的选择

然而,如果只是极个别数据分布在这种地方的话,会让dynamic range变得比较稀疏,不适合用minmax。

Entropy clibration

通过计算KL散度,寻找阈值,能够最小化量化前的 FP32的浮点数分布于INT8的量化后整 形分布 目前TensorRT使用默认的是Entropy calibration。一般来讲使用entropy calibration精度可以比较好

Percentile calibration

如上图所示,表示的是FP32中占据 99.99%的浮点数参与量化。这样可以 避免极个别特殊点(误差)参与量化,导出量化出现问题。 Percentile有99.9%, 99.99%, 99.999%等等。(不同分位数可能将准确率提升两个百分点,这里要多尝试)

如何选择calibration algorithm

如同quantization granularity对不同的情况会有不同的策略。calibration的算法 选择也会根据输入是activation value还是weights而改变。那么我们该如何选择呢?

calibration算法的选择,我们按照这个规律去选

  • weight的calibration,选用minmax

  • activation的calibration,选用entropy或者percentile

(左)固定activation values的精度,量化weights。(右)固定weights的精度,量化activation values 我们可以看出不同模型的量化选择上会有不同的策略。calibration的选择与模型架构相关

calibration dataset与batch size的关系

在使用calibration dateset中构建histogram是需要注意的一个点:calibration时的batch size会影响精度。 更准确来说会影响histogram的分布,这个跟TensorRT在构建浮点数的histogram的算法有关

上面的说法表明:在创建histogram直方图的时候,如果出现了大于当前histogram可以表示的最大值的时 候,TensorRT会直接平方当前histogram的最大值,来扩大存储空间

  • (思考)如果batchsize=1,最后一个batch的浮点数很大,那么最终的histogram会呈现什么形状?

  • (思考)如果batchsize=16,但每一个batch size的数据分布很均匀,histogram会呈现什么形状?

  • (思考)如果模型的鲁棒性很强,batchsize=1和batchsize=16/32/64/128的区别会有吗

  1. example

这时histogram的后半段很稀疏,甚至没有数据。在量化的时候会根据这个直方图来将 FP32转为INT8,很显然这块领域是多余的

  1. example

我们希望每一个batch里面的数据比较均匀, 让比较大的数据出现的时候,histogram的 范围已经能够表现它了。 e.g. 当2.4出现的时候,如果之前已经出现 过1.54,那么hisogram的range不需要改变。否则range的最大值会变成5.76 (总的来讲,calibratio的batch size越大越好,但不是绝对的)

❤️‍🔥
🫶
👍
https://github.com/NVIDIA/TensorRT/issues/774