量化介绍
量化指的是使用比浮点精度更少的比特数来进行yi计算和存储的技术。一个量化后的模型使用整数tensor而不是浮点数tensor来执行一部分或全部的操作。这是一种更紧凑的模型表现方式,并且可以利用许多硬件平台上的高性能向量操作。PyTorch支持INT8的量化,相比于FP32,模型大小减少了4x,对内存带宽的需求也减少了4x。INT8操作的硬件支持使得其计算通常要比FP32快2-4倍。量化主要是一种加速inference的技术,量化后的操作也仅支持前向的计算。
PyTorch支持多种深度学习模型的量化方式。在大部分的情况下,模型使用FP32训练,然后被转换为INT8的模型。此外,PyTorch还支持量化感知的训练,可以将量化过程中出现的误差建模,通过fake-quantization模块进行前向和反向的计算。需要注意的是全部的计算是在浮点数上执行的。在量化感知训练最后,PyTorch提供了转换工具来吧训练好的模型转换为更低的精度。
从更底层的层面上,PyTorch提供了一种表示量化后的tensor的方式,同时使用它们进行计算。这些tensor可以被用来直接构建模型,并在低精度下完成所有的计算。同时也提供高级的API包含了典型的用最小的精度损失从FP32转换到低精度模型的工作流程。
量化tensor
PyTorch同时提供逐tensor与逐channel的非对称线性量化。逐tensor的量化意味着tensor内所有的值都被同样的尺度缩放。逐channel的量化意味着对于给定维度,通常是tensor的channel维度,tensor在该维度的每个切片会使用不同的缩放和偏移(这样缩放与偏移可以用向量的方式来表示),这样保证了在量化过程拥有更少的误差。
浮点数到定点数的转换过程使用了下面的映射方程:
Q ( x , s c a l e , z e r o _ p o i n t ) = r o u n d ( x s c a l e + z e r o _ p o i n t ) Q(x, sca