量化
训练后量化可以在改善 CPU 和硬件加速器延迟的同时缩减模型大小,且几乎不会降低模型准确率。
Technique | Benefits | Hardware |
---|---|---|
Dynamic range quantization | 4x smaller, 2x-3x speedup | CPU |
Full integer quantization | 4x smaller, 3x+ speedup | CPU, Edge TPU, Microcontrollers |
Float16 quantization | 2x smaller, GPU acceleration | CPU, GPU |
动态范围量化
训练后量化最简单的形式是仅将权重从浮点静态量化为整数(具有 8 位精度)
全整数量化 INT
对于全整数量化,需要校准或估算模型中所有浮点张量的范围,即 (min, max)。与权重和偏差等常量张量不同,模型输入、激活(中间层的输出)和模型输出等变量张量不能校准,除非我们运行几个推断周期。因此,转换器需要一个有代表性的数据集来校准它们。
整数量化 UINT
对于适用于微控制器的 TensorFlow Lite 和 Coral Edge TPU,创建全整数模型是常见的用例。
float16量化
float16 量化的优点:
- 将模型的大小缩减一半(因为所有权重都变成其原始大小的一半)。
- 实现最小的准确率损失。
- 支持可直接对 float16 数据进行运算的部分委托(例如 GPU 委托),从而使执行速度比 float32 计算更快。
float16 量化的缺点:
- 它不像对定点数学进行量化那样减少那么多延迟。
- 默认情况下,float16 量化模型在 CPU 上运行时会将权重值“反量化”为 float32。(请注意,GPU 委托不会执行此反量化,因为它可以对 float16 数据进行运算。)