赞
踩
这些年来,深度学习在众多领域亮眼的表现使其成为了如今机器学习的主流方向,但其巨大的计算量仍为人诟病。近几年,业界涌现出越来越多基于深度神经网络的端侧上的智能应用。而对于端上产品而言,深度神经网络巨大计算量是非常大的挑战。为了弥补端侧智能应用的算力需求与端侧的算力能力的鸿沟,近几年来模型压缩成为了业界的热点之一。而模型量化属于非常实用的模型压缩技术,并且当前已经在工业界发展非常成熟。
模型量化所处位置
为了保证较高的精度,大部分的科学运算都是采用浮点型进行计算,常见的是32位浮点型和64位浮点型,即float32和double64。然而推理没有反向传播,网络中存在很多不重要的参数,或者并不需要太细的精度来表示它们。
所以,模型量化就是将训练好的深度神经网络的权值,激活值等从高精度转化成低精度的操作过程,例如将32位浮点数转化成8位整型数int8,同时我们期望转换后的模型准确率与转化前相近。
因此,在工业界对模型量化有非常强烈的需求。
一般来说,会对模型的哪些数据进行量化。主要有以下三个。实际中可能是量化其中的多个甚至全部。
大部分的科学运算都是采用浮点型进行计算,常见的是32位浮点型和64位浮点型,即float32和double64。
对于量化的位数,可以有很多种选择。大体可分为几类:
量化主要分为离线量化:(Post Training Quantization,PTQ ) 和量化感知训练(Quantization Aware Training,QAT)。高通在 2019 年的一篇paper里,为生产量化模型定义了4 种等级:一般我们用的多的就是level2 和level3。
如下图所示,量化可分为均匀量化和非均匀量量化。
如下图所示,量化还可分为对称量化和非对称量化。量化前后0点的值不变的称为对称量化。但在实际过程中,量化的对象分布式不均匀的,不一定在0点值两边对称,所下图右侧所示,量化前后0点的值不同的称为非对称量化。
上面的介绍可知,量化其实就是将训练好的深度神经网络的权值,激活值等从高精度转化成低精度的操作过程,并保证精度不下降的过程。如何从高精度转到低精度呢?在定点与浮点等数据之间建立一种数据映射关系,将信号的连续取值 近似为 有限多个离散值,并使得以较小的精度损失代价获得了较好的收益。这个映射过程一般用下面的公式来表示:
Q = round(scale factor * clip(x,α,β))+ zero point
这个公式中:x 代表需要量化的数,也就是量化对象,是个浮点型数据。Q代表量化后的数,是个整型数据。公式涉及到3个操作,round操作,clip操作和 scale factor 选取。以及需要确定的值α,β,是clip操作的上下界,称为clipping value。
zero point 代表的是原值域中的0在量化后的值。在weight或activation中会有不少0(比如padding,或者经过ReLU),因此我们在量化时需要让实数0在量化后可以被精确地表示。
round操作:其实就是一种映射关系,决定如何将原来的浮点值按照一定的规律映射到整型值上。举个例子,我们可以选用四舍五入「假设5.4 则取值为5,5.5 则取值为6」的原则,也可以选用最近左顶点「5.4 和 5.5 都取值为5」或者最近右顶点原则等。
clip操作:其实就是切片操作,如何来选择这个量化对象的范围。为什么要选这个范围呢,因为量化到n位数后,可以用来表示量化后的整型值就是固定的,只有 2^N 个,这么有限的数据,怎么才能更好去映射原来的浮点值分布呢?这个范围选的太大了(按照原来的最大最小值来选,如下图所示),此时如果在头尾的浮点值只有零星的几个,而且距离其他值非常远,(如果此时是均匀量化)那么这个对于图中 α-α,β-β的离散值可能就被浪费了,这样浮点值到整型值的映射后导致的误差可能就会很大。这个取值是门艺术,大了浪费比特位,小了把就把太多有用信息“切”掉。
所以当前不同的量化算法和优化策略往往是寻找一个恰当的[α,β],使得 clip 和 round 操作导致的误差较小。
scale factor:是表述浮点数和整数之间的比例关系【不同的量化形式取不同的值】,如果是线性均匀量化,那么
总结下,量化的过程就是选取合适量化参数(如scaling factor,zero point,clipping value)以及数据映射方式,让原来的浮点值映射到整型值后,尽量保持准确率不下降(或者在可控范围)。
根据不同的模型量化参数选择范围,可将模型量化的粒度分为:
1、多后端难点
不同芯片后端的量化算法实现具有不同的特点。对于不同的硬件,用户需要针对硬件研究不同的量化方案。这同时也会导致量化方案的硬件泛化 性受到限制。 所谓硬件泛化性,主要是指量化模型在泛硬件平台的迁移能力。
2、硬件黑盒难点
模型的量化部署往往伴随着复杂的模型精度修复工作,特别是在第三方硬件下,需要解决如何与第三方硬件对齐的问题。 但在实际服务过程中,硬件的比特级对齐方案又是部署服务的重中之重。可以通过提供量化算法的模拟环境,使得精度修复算法能够在硬件上复现。常见的硬件差异主要源于非计算算子(Concat, Eltwise)的量化处理、累加器的重采样和取整方式的不同。
3、量化误差分析难点
量化在计算过程中会引入误差,导致网络部署精度相对于 FP32 会损失部分表达。 在实际业务中,部署的一大挑战在于,如何去保证量化模型的精度,通过降低误差,以保证模型速度和精度的收益平衡。
1、如何找到一个更好的数据映射方式
量化最简单粗暴的做法的是rounding。将浮点转为定点的rounding方法:一种是Round-to-nearest,即就近取整;另一种是Stochastic rounding,即以一定概率(与向下取整点的距离成正比)确定向上还是向下取整。
常用算法 adaround 就是这种
2、给定一个训练好的量化模型,如何找到最优的量化超参数
解决问题就是:给定一个 Tensor,寻找一个恰当的[α,β],使得 clip 和 round 操作导致的误差较小。
3、如何让量化目标对象的分布变得更适合量化
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。