1. 背景

  • 从速度看
    • 访存耗时远多于计算
    • 浮点数计算耗时和整型计算耗时差不多?(from 张志),但是浮点数计算单元需要占用更多额外的芯片面积
  • 从energy看
    • 访存消耗energy远多于计算(200倍)
    • 浮点数运算消耗energy多于int8类型(十几倍),因此量化有助于keep efficient

2. 数值类型(浮点数)

  • FP32:1+8+23
  • FP16:1+5+10,通常使用在混合精度训练中
  • BF16:1+8+7,直接将FP32进行截断,方便直接进行转换
  • TF32:1+8+19,保留了FP32的范围(8位范围)与FP16的精度(10位精度),用于TensorCore中
  • FP24:

3. 量化基础

  • K-Means-based Quantization

    • 原理:权重进行kmeans聚类(每个类别cluster视为一个模式),每个cluster对应一个浮点数,构成一个codebook(lookup table),权重矩阵中保存的是codebook中的索引
      • 微调过程:给定权重矩阵对应的梯度矩阵,将梯度矩阵按照模式进行分组(对应不同的cluster),每组梯度进行求和,再更新codebook中对应cluster的浮点数
    • 效果:
      • 从pruning ratio看:剪枝+量化同时使用,可以获得更小的pruning ratio(量化后再微调一下,有助于恢复精度)
      • 从准确率看:剪枝+量化准确率与只进行量化差不多
    • 优化:霍夫曼编码
      • 将更频繁的权重使用更短的编码表示(但是这样会导致权重矩阵中各个元素大小不一❓)
    • 特点:量化后存储的是低比特,但是计算仍然是浮点数(只是节省了存储,但是访存翻倍❓)
  • Linear Quantization

4. 量化种类

4.1 Post-Training Quantization(PTQ)

  • 权重量化Weight Quantization:减小模型大小

    • Per-tensor vs Per-channel

    • Weight Equalization

      • 背景:

        • Per-tensor量化简单,但是由于channel之间range差异较大,导致效果很差
        • Per-channel量化效果较好,但是需要特殊硬件支持❓
        • 目标:make weight ranges similar (or equalize the weight range), so that per-tensor quantization can be applied(既想要per-tensor的简单,又想要per-channel的效果)
      • 原理:positive scaling equivariance伸缩等价性

        对于conv、fc和relu,满足:

        $$f(s x) = s f(x), where \quad s \gt 0 $$

      • 方法:对于连续的两个卷积层,第一个卷积层乘上一个scale,第二个卷积核对应通道除以一个scale,这样与原来是等价的,但是调整了第一个卷积核的range;然后逐渐连续地调整

        后量化训练-Data free quantization

    • Adaptive Rounding

      • 背景:

        • 看似符合直觉的round-to-nearest其实精度并不是最优的

          因为并非每个单独的weight的量化损失越小越好,weight之间存在相互影响

      • 方法:Adaptive地决定weight量化时将浮点数转到最近右定点还是最近左定点❓

        AdaRound解读

  • 激活值量化Activation Quantization:减小内存占用

    目标:由于激活值无法提前确定,因此要找到激活值的$r_{min}, r_{max}$

  • 偏置量化Bias Quantization

    • 背景:权重量化之后,权重分布会产生一个shift。一方面希望量化误差尽量小,另一方面希望量化误差的期望为0(但并非如此)

      后训练量化——Data free quantizationBias Correction,可以看到蓝色的量化误差明显左偏

    • 方法:

      • 如果当前有数据:全精度和量化模型分别跑一遍,bias减去这个量化误差,注意对于每一个卷积层或全连接层都要跑一遍
      • 如果当前没有数据:

4.2 Quantization Aware Training(QAT)

5. 低比特量化

  • Binary Quantization
  • Ternary Quantization
  • Mixed-Percision Quantization

参考: