加速神经网络推理之 8bit Quantization (模型量化压缩)

量化(Quantization)模型的论文来自于 Google 发表的文章 On the efficient representation and execution of deep acoustic models。

量化方法的目的就是使用 8 位或 16 位的整型数来替代浮点数,这种方法试图利用定点点积来替代浮点点积,这很大程度上降低了神经网络在无硬浮点设备上的运算开销。同时,该方法在一些支持单指令流多数据流 SIMD 的硬件设备上优势就更加明显了,比如128-bit 寄存器 SSE 可以单个指令同时运算 4 个 32 位单精度浮点,8 个 16 位整型,16 个 8 位整型。显然 8 位整型数在 SIMD 的加持下,相比于单精度浮点运算速率要更快一些。另外,该方法还可以减少模型的内存和存储占用空间。

量化方法是一种类似于离差标准化的归一化方法,是对原始数据进行线性变换,使结果映射到一定范围内,具体公式如下:
在这里插入图片描述
Python实现如下:

# 根据参数和原始浮点数量化为定点数
def Quant(Vx, Q, RQM):
    return round(Q * Vx) - RQM

# 根据量化参数还原回浮点
def QuantRevert(VxQuant, Q, RQM):
    return (VxQuant + RQM) / Q

针对数组的量化和还原如下:

import numpy as np

def ListQuant(data_list, quant_bits):
    # 数组范围估计
    data_min = min(data_list)
    data_max = max(data_list)

    # 量化参数估计
    Q = ((1 << quant_bits) - 1) * 1.0 / (data_max - data_min)
    RQM = (int)(round(Q*data_min))

    # 产生量化后的数组
    quant_data_list = []
    for x in data_list:
        quant_data = Quant(x, Q, RQM)
        quant_data_list.append(quant_data)
    quant_data_list = np.array(quant_data_list)
    return (Q, RQM, quant_data_list)

def ListQuantRevert(quant_data_list, Q, RQM):
    quant_revert_data_list = []
    for quant_data in quant_data_list:
        # 量化数据还原为原始浮点数据
        revert_quant_data = QuantRevert(quant_data, Q, RQM)
        quant_revert_data_list.append(revert_quant_data)
    quant_revert_data_list = np.array(quant_revert_data_list)
    return quant_revert_data_list

下面两幅图,将原本在浮点分布的正弦曲线,经过量化和还原得到了另外两条曲线。类似图像上的降采样结果,4 位量化方式还原后的曲线出现了明显的锯齿形状,如下图:
在这里插入图片描述
然而,8 位量化方式在还原后,其连接曲线与原始曲线几乎重合,如下图:
在这里插入图片描述
关于定点/浮点的点积优化方法,可以看看下面几个开源项目:

  • Google 开源的代码 gemmlowp: a small self-contained low-precision GEMM library ,结合 Tensorflow 的量化模型训练应该能发挥很好的『药效』。Google 很慷慨地公布了几种 GEMM 优化方法,比如基于 NEON / SSE 的 SIMD 指令、并行化运算、Cache 预热等优化方法。该 C++ 代码移植到目前市面上绝大部分的手持设备上应该不成问题。
  • ARM 公司开源项目,针对自家嵌入式设计的词唤醒引擎架构 ML-KWS-for-MCU ,里面针对 DS-CNN / DNN 模型做了大量的定点计算优化工作,另外该项目还开放了基于 Tensorflow 的 8 位量化模型训练工具,移植到嵌入式设备上的底层优化算法库是来自自家的 CMSIS_5 。
  • 如果 GEMM 优化还没入门,还可以从 OpenBlas 贡献者在 Github 发布的指导文档 How To Optimize Gemm 开始入手。

在展示优化结果前,需要引入语音识别中一项重要的参考指标——实时比(RTF)。假设一个 t 时长的音频,引擎处理完这段音频所花费的时间为 p,那么我们认为该引擎的实时比为 p / t。如果在某一平台上统计出来的实时比大于 1,则表面该引擎在该平台下的实时性无法保证。在一些对实时性要求比较高的系统中将无法使用。另外,在一些不支持幷行化处理的设备上,则会因为来不及消化录音缓存,而出现录音丢帧的状况从而导致设备工作异常。因而在保证一定效果的情况,应该让识别引擎的实时比应尽可能的低。

转载自: https://zhuanlan.zhihu.com/p/38328685

<think>好的,我现在需要帮助用户理解神经网络权重量化的概念、方法和实现。首先,我得先回忆一下权重量化的基本概念。权重量化主要是通过降低权重的精度来减少模型的大小和计算量,这对于移动端或嵌入式设备来说非常重要,因为它们通常计算资源有限。 接下来,用户提到了几个引用,我需要结合这些引用来组织答案。比如引用[1]提到FFN将权重量化到2bit,消除MAC操作,这对性能有帮助。引用[4]则讨论了Statistics量化方法,通过均值和方差来压缩权重。而引用[3]指出移动端算力的限制,说明量化的必要性。 我应该先解释权重量化的概念,然后分点介绍不同的方法。比如线性量化、对数量化、统计量化等。每种方法需要简要说明原理,并结合引用中的例子。例如,线性量化可以分为对称和非对称,引用[4]中的统计方法可以归到统计量化里。 在实现部分,用户可能想知道具体怎么操作,比如PyTorch中的量化工具,引用[5]提到了PyTorch的文档,这里需要提到框架支持,并给出一个简单的代码示例。同时,引用[2]提到BP神经网络的训练函数,可能和量化后的微调有关,需要说明量化后的微调步骤。 还需要注意用户的问题可能涉及到方法的选择,比如不同比特位的适用性,比如低比特如2bit可能用三值量化,而统计量化不适合低比特,这点引用[4]已经提到。要指出不同方法的优缺点,帮助用户根据需求选择。 最后,生成的相关问题需要覆盖概念、方法对比、实现工具和挑战,这样用户可以有进一步探索的方向。检查是否所有引用都合理应用,比如引用[1]的例子用于减少计算量,引用[3]说明移动端的需求,引用[4]解释统计方法,引用[5]提供实现资源。 总结下来,结构应该是:概念、方法分类及说明、实现步骤和工具、相关问题。确保每个部分都有对应的引用支持,并且用中文清晰表达,使用正确的LaTeX格式,如$W_q$这样的变量用行内公式,独立公式用$$包围。</think>### 神经网络权重量化详解 #### 一、权重量化的核心概念 权重量化(Weight Quantization)是通过降低神经网络权重参数的数值精度(如从32位浮点压缩至8位整数或更低),以减小模型存储空间和计算复杂度的方法。其核心目标是在保持模型性能的前提下,实现以下优势: 1. **减少存储开销**:例如,将32位浮点权重转为8位整型可减少75%存储需求[^3] 2. **加速计算**:低精度运算可有效利用硬件特性(如SIMD指令集),减少MAC操作[^1] 3. **降低功耗**:移动端设备通过量化可降低50%以上的能耗[^3] #### 二、主要量化方法 ##### 1. 线性量化(均匀量化) 将浮点权重$W_f$映射到整数范围$[0,2^b-1]$,量化公式为: $$ W_q = \text{round}\left( \frac{W_f - \beta}{\alpha} \times (2^b-1) \right) $$ 其中$\alpha=(W_{max}-W_{min})/(2^b-1)$为缩放因子,$\beta=W_{min}$为偏移量。分为: - **对称量化**:$W_{max}=|W|_{max}, W_{min}=-|W|_{max}$ [^4] - **非对称量化**:保留原始数值范围边界 ##### 2. 对数量化 更适合处理权重分布呈指数特征的情况: $$ W_q = \text{sign}(W_f) \times 2^{\text{round}(\log_2|W_f|)} $$ 可配合移位运算实现硬件加速 ##### 3. 统计驱动量化(引用[4]方法) 通过统计特性压缩权重分布: 1. 计算均值$\mu$和标准差$\sigma$ 2. 标准化处理:$\hat{W} = (W_f - \mu)/\sigma$ 3. 按新分布进行线性量化 ##### 4. 极低比特量化 - **二值化**:$W_q = \text{sign}(W_f)$ - **三值化**:$W_q \in \{-1,0,+1\}$,可完全消除乘法运算 #### 三、实现流程(以PyTorch为例) ```python import torch import torch.quantization # 原始模型 model = MyNeuralNetwork().float() # 量化配置 quant_config = torch.quantization.get_default_qconfig('fbgemm') # 量化准备 model.qconfig = quant_config torch.quantization.prepare(model, inplace=True) # 校准(统计量分布) with torch.no_grad(): for data in calibration_dataset: model(data) # 转换量化模型 quant_model = torch.quantization.convert(model) ``` #### 四、关键挑战与解决方案 1. **精度损失补偿**: - 量化感知训练(QAT):在训练中模拟量化过程 - 微调策略:使用弹性梯度下降法(如引用[2]提到的trainrp) 2. **硬件适配**: - GPU量化:使用FP16/INT8混合精度 - CPU优化:NEON指令集加速INT4运算[^3] 3. **动态范围控制**: - 基于通道的量化(per-channel) - 自适应裁剪阈值调整 #### 五、方法对比 | 方法 | 比特位 | 计算复杂度 | 适用场景 | |-------------|--------|------------|-------------------| | 线性量化 | 4-8bit | 中 | 通用模型压缩 | | 对数量化 | 3-4bit | 低 | 语音/图像处理 | | 三值量化 | 2bit | 极低 | 边缘设备推理 | | 统计量化 | 8+bit | 高 | 高精度保留场景[^4]|
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值