一、
clip函数:限制一个array的上下界
给定一个范围[min, max],数组中值不在这个范围内的,会被限定为这个范围的边界。如给定范围[0, 1],数组中元素值小于0的,值会变为0,数组中元素值大于1的,要被更改为1.
a = np.arange(10)
np.clip(a, 1, 8)
array([1, 1, 2, 3, 4, 5, 6, 7, 8, 8])
读完论文 OPTIMAL ANN-SNN CONVERSION FOR HIGH-ACCURACY AND ULTRA-LOW-LATENCY SPIKINGNEURAL NETWORKS
量化
1、精度科普
在小学的时候,小学生们可能只会用手算的方式计算数学题目,圆周率的数值也只能计算到小数点后两位——3.14;而高中生使用图形计算器可能会使圆周率数值排到小数点后10位,更加精确地表示圆周率。在计算机科学中,这被称为精度,它通常以二进制数字来衡量,而非小数。
精度越高,计算越细。但是,意味着所需的计算资源、数据传输和内存存储就越多。其成本也会更大,同时也会消耗更多的功率。
由于并非每个工作负载都需要高精度,因此 AI 和 HPC 研究人员可以通过混合或匹配不同级别的精度的方式进行运算,从而使效益最大化。
single precision
: float32 32位 double precision
: double 64位 half precision
: 16位
在混合精度中,计算从半精度值开始,以进行快速矩阵数学运算。但是随着数字的计算,机器会以更高的精度存储结果。例如,如果将两个16位矩阵相乘,则结果为32位大小。
可以看一下不同精度的计算差距:
2、量化
量化感知训练(Quantization-aware-training)探索-从原理到实践
Quantization for Neural Networks written by Lei Mao
知乎
2.1
量化方法的目的就是使用 8 位或 16 位的整型数来替代浮点数,这种方法试图利用定点点积来替代浮点点积,这很大程度上降低了神经网络在无硬浮点设备上的运算开销。同时,该方法在一些支持单指令流多数据流 SIMD 的硬件设备上优势就更加明显了,比如128-bit 寄存器 SSE 可以单个指令同时运算 4 个 32 位单精度浮点,8 个 16 位整型,16 个 8 位整型。显然 8 位整型数在 SIMD 的加持下,相比于单精度浮点运算速率要更快一些。另外,该方法还可以减少模型的内存和存储占用空间。
为什么对 8 位量化模型这么关心,原因如下:
结合单指令流多数据流 技术,比如拥有 128 位寄存器的 SSE 技术, 8 位量化时单指令可同时计算数据个数为 16 个,而 16 位量化时,为 8 个。
随着同时计算个数的增加,运算速度提升也更加明显。内存以及实际存储占用更小。0
低比特位量化后的,点积运算数据溢出风险更小。
量化是一个信息有损压缩的过程,如果训练过程中使用FP32,在模型推理时使用Post-training Quantization(PTQ)直接量化为INT8模型,模型精度会存在一定损失。而量化感知训练(Quantization-aware-training, QAT)在模型训练过程中就引入了伪量化(Fake-quantization)来模拟量化过程中带来的误差,通过这种方式能够进一步减少量化后模型的精度损失。
模型量化精度损失的主要原因为量化-反量化(quantization-dequantization)过程中取整引起的误差。
模型经过量化后,在推理框架(e.g. TensorRT、Openvino)运行时,会根据不同的Op调用相应的算子:
- 某些算子可以支持低精度的输入输出(e.g Conv、Relu、Gelu),此时推理框架会调用INT8 kernel进行计算;
- 某些算子需要高精度输入输出(使用低精度会导致误差显著增加),那么将会将INT8输入反量化为FP32浮点数之后再输入算子进行计算;
2.2 Post-training-quantization
Post-training-quantization(PTQ)是目前常用的模型量化方法之一。以INT8量化为例,PTQ处理流程为
- 首先在数据集上以FP32精度进行模型训练,得到训练好的baseline模型;
- 使用小部分数据对FP32 baseline模型进行calibration,这一步主要是得到网络各层weights以及activation的数据分布特性(比如统计最大最小值);
- 根据2. 中的数据分布特性,计算出网络各层 S,Z 量化参数(缩放因子(Scale-factor)和零点(Zero-Point));
- 使用3. 中的量化参数对FP32 baseline进行量化得到INT8模型,并将其部署至推理框架进行推理;
2.3 QAT
从上一小节可以看出如果PTQ中模型训练和量化是分开的,而QAT则是在模型训练时加入了伪量化节点,用于模拟模型量化时引起的误差。QAT方式需要重新对插入节点之后的模型进行finetune,通过伪量化操作,可以是网络各层的weights和activation输出分布更加均匀,相对于PTQ可以获得更高的精度。以INT8量化为例,QAT处理流程为
- 首先在数据集上以FP32精度进行模型训练,得到训练好的baseline模型;
- 在baseline模型中插入伪量化节点,得到QAT模型,并且在数据集上对QAT模型进行finetune;
- 伪量化节点会模拟推理时的量化过程并且保存finetune过程中计算得到的量化参数;
- finetune完成后,使用3. 中得到的量化参数对QAT模型进行量化得到INT8模型,并部署至推理框架中进行推理
The idea of quantization aware training is to ask the neural networks to take the effect of such information loss into account during training. Therefore, during inference, the model will have less sacrifice to the inference accuracies.