Skip to content

Neural Network Quantization & Low-Bit Fixed Point Training For Hardware-Friendly Algorithm Design

Notifications You must be signed in to change notification settings

A-suozhang/awesome-quantization-and-fixed-point-training

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 

Repository files navigation

初衷

  • (表明该整理的目的,为后续工作展开做一些指引)
  • 本文不完全包括了一些NN Fixed-Point Training的可能实现方向,为后续实验指路
  • 本文的最终目的是面向FPGA等嵌入式设备的NN 部署/训练,的一个软件仿真工具。为了Scalability,会尝试实现一些较为General的定点训练技巧现方式
    • 以及诸如MobileNet, ShuffleNet 等轻量化网络设计
  • Quantization的两种主要方式
    • 基于CodeBook的(Deep Compression) :实际参数还是高精度的,无法利用定点计算进行加速,仅能减少存储
    • 基于定点数(Fixed Point表示),(IBM的FP8也可以归入此类) : 可利用定点计算加速,故本文主要采取该方式
  • 目前预计的几种场景
    • Post-Training Quantization : 在完成FP训练之后的压缩,产生定点的W/A进行部署
      • Example:Distillation,EntropyConstraintQ, IncrementalQ
    • Quantize-Aware Training : 在训练过程中考虑定点的影响,在训练中采取Fixed,产生定点的W/A进行部署
      • Example: StraightThroughActivation的方法(训练时用Fixed Inference,但是梯度是对应的全精度副本做)
    • Fixed-Point Training: 训练过程中进行纯定点(W/G/A),模拟在纯定点设备上进行训练
      • Example:WAGE
      • 有点激进,不知道是否能实现
    • Binary-Network

Methods

从自己的出发点对看到的一些定点相关工作的方法与思想的纯主观归纳(可能存在偏差甚至错误)

该种划分方式没有什么道理,只是我强行区分的罢了)

A. Post-Training Quantization

该类方法最大的特点就是利用已经训练好的模型进行压缩,与Quantized-Aware Training相对比有几分 2-Stage的意味,优势在于可以利用已经基本确定的参数分布去分析,采取量化策略,对大模型比较有效,但是小模型会崩

B. Quantize-Aware-Training

相比于第一类,该类方法的主要优势在于1-Stage,简化了训练过程

C. (Full) Fixed-Point Training

纯定点的训练,大部分都是对一些经典的部分做一些简化。以及对梯度量化也会归入此类(目的是训练的加速,而不仅仅是为了部署)

D. Binary

Ideas

Post-Training Quantization

  • Important Weighing
    • 通过评估每个参数对最终Loss的重要程度,作为剪枝或是量化的依据,比如这篇文章
  • Knowledge Distillation
    • 通过一个高精度模型给低比特模型的Finetune提供SoftLabel
  • Incremental & Iterative Quantization
    • Gradually做Quantization,前者是每次选取一部分Weight,后者是逐渐降低比特数目
  • Analytical Correction
    • 从解析的角度去做一些矫正或者是限制,代表文章
  • Data-Free Quantization
    • 近几年兴起的一个领域,和👆的方法有一些相关性

Quantize-Aware Training

定点数化之后相比于浮点最大的问题就是动态范围,也是主要的优化目的 

  • 限制动态范围
    • 从训练角度就不要让参数分布的太散,减少造成的影响,比如PACT
    • 训练中加大WeightDecay(L1 Norm)之后训练出来的模型定点效果会更好
  • 细粒度的确定量化区间
    • 同一区间中会取同一个Range,通过减少被划入同一动态范围的参数量来减少Clamp的发生
    • 从Layer-Wise到Channel-Wise再到Block-Wise
  • 细粒度的分配bit数
    • Mixed-Precision的一系列方法
    • Hybrid FP8 - 对A/W采取不同的指数bit分配
  • 扩大动态范围
    • FP8 - 2次幂的浮点数
  • 充分利用动态范围
    • 引入浮点ScalingFactor,这篇
    • 非线性量化
  • 学习量化中的各种值(ClippingValue/QuantizeInterval)
    • 用于替代解析方法求出来的一些解析解(解析方法的一些假设不是很精确)
    • PACT学习了Relu的ClippingValue
    • KAIST的这篇文章学习了量化的
    • TTQ学习了ScalingFactor

Fixed-Point Training

一般只有有加速训练的需求的时候才需要量化梯度,但是由于梯度的特殊性(动态范围大,且大值小值都很重要)采用一般的量化方式不足,一般需要额外的设计;但是👆部分的很多方法的目的是为了更好的量化,印次对该部分也有指导价值

Binary

  • Binarize本质上是一种极限的Quantize,所面临的问题其实也和Quantize类似,除了几个区别
    • Overflow的Tradeoff不存在,由于只有一个量化区间
    • 同理Rounding的操作也不存在
  • 但是存在的Error都是前向的QuantizationError与等精度的模型进行对比 - Forward Error
    • 另外是由于梯度的问题导致收敛不到一个有效的结果 - Gradient Error
  • 解决以上两种问题的方法主要有
  • 前向误差 - 本质上是通过微调(整体的)在有限的表达能力下尽可能的去近似Counter的一个全精度模型
    • Scaling Factor(更细粒度的)
    • Adjustable/Learnable的NonLinear Function - PACT
    • Gradual/Iterative/Recursive(交替的优化binary函数以及参数)-有点类似于Quantize-aware training的思想
    • 通过引入一定的随机性(个人臆测比较玄学,不知道效果如何) - 类似Stochastic Roudning思想的(抖色深的) - Half-wave Gaussian
    • 增加模型的表达能力(增加模型大小,堆叠)
      • 线性组合(multiple binary basis) - ABCNet
      • KD
      • Wide
  • 反向误差 - 本质上是修正/补偿梯度所带来的误差
    • Loss修正 - 最朴素的是进行正则化,加一个奇形怪状的项来拉动
      • 比较高一点的是一系列Differentiable的方法,把Loss导到各个部分来协助优化
      • 更多learnable parameter - LQNet
    • 对STE进行修正
  • Binary Neural Networks: A Survey
    • 存在的问题: severe information loss & Discontinuality
    • Explainable解释
      • some filters are redundnant(play a similar role)
    • 有这样的操作,去衡量某一层是否重要-将它从fp换成0/1,看acc decay
      • traitioinal understanding for the layer sensitivity, is keeping the 1st and -1st layer with full precision
    • beneficial for understanding the structure of NN
    • ensemble to help training the BNN, but may face over-fitting
    • 分类 naive binarization / optimized binarization
      • 后者针对quantize error或者是loss function做了一些额外的操作
    • Preliminary
      • BP: STE with clamp(-1,1)
    • Category
      • 几个方向
        • Minimize Q Error
          • Introducing Scale Factor(XNOR)
          • Hash Map with Scaling Factor(BWHN)
          • Train with Quantized Gradient, improved XNOR(DoReFa)
          • More Channels, imporved XNOR(WRPN)
          • Group and gradually Quantize
          • Recursive approximation (HOPQ-Higher-order residue quantization)
            • not 1 step quantization, linear combination of each recursive step
          • Similar linear combination of binary masks - ABCNet
          • 2 Step Quantization
            1. only quantize activation with learnable function
            2. then fix function and quantize weight (learn scale factor)
          • PACT
            • learnable upper bound
          • LQ-Net (Learnt Quantization)
            • Jointly trainig the NN and the Quantizer
            • Surrport arbitary bit
          • XNORNet++
            • Fuse w/a scaling factor together to support arbitary bits
        • Improved Loss func
          • 主要focus在如何去globally适配binarization(对应上面的Q-error的就是更focus在局部上)
          • LAB - Loss-aware-binarization (quasi-Newton )
          • Problems
            • degeneration
            • saturation
            • gradient mismatch
          • INQ (Incremental Network Quantization)
            • 逐渐把Group扩大
          • Apprentice Network
          • DBNN - Distillation BinaryNN
        • Reduce Gradient Error
          • 修正STE
            • 最朴素的方式会导致在[-1,1]之间的参数不会被更新(?)
            • 核心方式是Soft,Adjustable,SignFunction(然后不用STE)
          • Bi-real: approx sign function(一个二次函数)
          • CBCB - Circulant BNN
          • BNN+
          • HWGQ - Half Gaussian Quantization
          • Differentiable Soft Quantization

Others

  • Fitting Weight or Activation?
    • 从二值化网络开始,很多analytical的求解方式往往是在参数分布高斯的假设前提下,最小化量化后参数与量化前参数的MSE
    • 后续的如这篇,认为参数可以变化,需要保存的是每一层的输出Activation
  • 把WA压缩到能放到片上能够显著提升硬件设计性能(显而易见)
    • 这可能也是BNN系列的比较繁荣的原因
  • Huge Batch Size可以帮助Binary的训练(原理上对低比特同理?)
  • Rounding Methods - Neareset/Stochastic/Biased Rounding
    • Stochastic Rounding很关键,可以用到更低比特的信息
    • 但是对硬件设计不太友好
    • 也是TernGrad之所以能work的原因
  • 从模型压缩角度看,硬件部署训练的几大难点(和不太elegant的地方)
    • 依赖大batch对存储要求高
    • 随机rounding,硬件难实现

经典的建模方式

  • Post-Training 4bit一文,各种Analytical求解的方法都是将量化过程抽象为一个优化问题
  • (一般都假设输入的分布为Gauss),最小化量化前后参数的MSE

Stochastic Roudning Related

  • Stochastic Rounding对保证Convergence重要
    • 但是WRPN作者文中表示自己利用了Full-Precision Grad所以不关键
    • Scalable Methods for 8-bit Training of Neural Networks也提到了
    • Mixed Precision Training With 8-bit Floating Point文中对RNE和Stochastic Rounding做了一个对比
      • 比如imagenet Res18,问题不大,但是Res50会明显Overfiting
      • 作者归因为Noisy Gradient错误指引了模型的前进方向,weight被错误更新了
      • 同时发现L2范数会激烈增大,导致了Gradient变得更加Noisy,从而Vicious Circle
      • 结论是RNE的方法对Gradient的Quantization Noise不是很有效
      • 认为stochastic rounding参考了被丢掉bit的信息,更稳定

BN Related

  • WAGE首先提出BN是训练瓶颈
  • L1BN (Linear BN)
    • 将BN所有的操作都转化为线性
  • RangeBN
    • 将BN的Var转化为一个|Max-Min|*(1/sqrt(2ln(n)))
  • 假设BN的running mean/var已经稳定
    • 然后把他当作常数来计算

Genre

这一部分列举了很多文章,但是很多并没有阅读过

Binary及其延申(极低比特)

从一开始的BNN延申开来的一系列work,基本都是利用了二值之后乘法变bitwise,对硬件部署采用非传统运算单元。

量化方法(低比特)

使用相对较为传统的比特数(4,6,8),在具体量化方式,以及训练方式入手

理论分析

奇技淫巧

Docs

看一下大公司主流的压缩工具都提供了什么功能

Tensorflow Lite

tf.contrib.quantize & Tensorflow Lite

  • 提供了一个Post-Training-Quantize的工具
    • 看上去是很直接的Quantize没有用到什么技巧,标准数据格式之间的转变(float16/int8) 没有自定义的数据格式
    • 文档中直接写到 If you want Higher Performance, Use Quantize-aware Training
    • 没有Finetune的过程?
  • Quantize-Aware Training
    • 只支持部分网络结构(合理)以卷积为主,还有一些RNN
    • 这里默认Fold了Conv和BN(我们所说的MergeConvBNs)
    • 有一个TOCO(Tf Lite Optimizing Converter)工具可以直接将训练好的FrozenGraph转化为真正的定点模型

PyTorch

Quantization Tool

  • QNNPack
  • 支持PerTensor和PerChannel的量化,采用带zeropoint的rounding
  • Quantize Aware Training at torch.nn.qat torch.nn.intrinsic.qat
  • 提供了很多Observer
  • 支持Symmetrical和Asymmetrical的量化

Groups (Low-Bit Training)

  • Intel (AIPG)
  • KAIST (Korea)
  • IBM
  • Kaust (迪拜的一个学校...)

TODO

  • 实现对BN的魔改
    • 首先研究它的定点Beahaviour
      • 还需要再过一过文献中,统计以下目前对BN的认识(除了不能定点之外,大家都是怎么处理的)
  • 实现Stochastic rounding
  • 实现PACT
  • 对目前的几种Range方法实现分组
  • 对WA做Clamp实现,作为超参数加入
  • (?) 能否从TernaryNet这一系列中提取出一些可以参考的优化点(比如训练出一个Range)

References

About

Neural Network Quantization & Low-Bit Fixed Point Training For Hardware-Friendly Algorithm Design

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published