GithubHelp home page GithubHelp logo

zhly0 / awesome-quantization-and-fixed-point-training Goto Github PK

View Code? Open in Web Editor NEW

This project forked from a-suozhang/awesome-quantization-and-fixed-point-training

0.0 2.0 0.0 34 KB

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

awesome-quantization-and-fixed-point-training's Introduction

初衷

  • (表明该整理的目的,为后续工作展开做一些指引)
  • 本文不完全包括了一些NN Fixed-Point Training的可能实现方向,为后续实验指路
  • 本文的最终目的是面向FPGA等嵌入式设备的NN 部署/训练,的一个软件仿真工具。为了Scalability,会尝试实现一些较为General的定点训练技巧
    • 故可能不会包含BinaryNetwork等较为*激进/专门化(需要额外硬件计算结构设计)*的实现方式
    • 以及诸如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
      • 有点激进,不知道是否能实现

Methods

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

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

A. Post-Training Quantization

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

B. Quantize-Aware-Training

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

C. (Full) Fixed-Point Training

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

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

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

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

awesome-quantization-and-fixed-point-training's People

Contributors

a-suozhang avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.