大模型——剪枝、量化、蒸馏、二值化

大语言模型的参数量现在十分惊人,GPT3的参数量已经达到1750亿。GPT3在fp16的精度下仍需要325G的存储空间,推理时至少需要5张80G的A100GPU。高参数量意味着对内存要求很高,以至于对终端部署有着极高要求。

而为了能在更多的设备上运行大模型,就需要模型压缩技术。

四大模型压缩技术:量化、剪枝、蒸馏和二值化

模型压缩主要有几个需求:1.降低模型所占空间。2.降低模型计算复杂度。3.降低能耗,提高续航。4.保证模型性能

量化

压缩每个权重参数存储的比特数,以达到降低内存需求的目的。传统的深度学习,参数一般用32位浮点数存储。量化可以将32位浮点数,量化成8位整数。这样,模型存储空间将直降至四分之一。而且,低精度的整数运算比浮点数运算高效的多。

对于1位量化,理想条件下,模型大小甚至可以降低至原来的三十二分之一。

量化方法主要有三类:训练后量化(PTQ)、量化感知训练(QAT)、量化感知微调(QAF)

训练后量化

模型训练后,对权重进行量化。

TensorFlow lite提供工具,可以将32位浮点数,量化成8位整数。

缺点:量化时无法考虑训练中的动态变化,会使模型的精度下降

量化感知训练

在训练中就进行量化,让模型提前适应低精度。

TensorRT支持这种方法,在训练中模拟量化,保持模型性能。

缺点:运算更加复杂,需要更高的运算资源

训练感知微调

基于预训练模型进行微调,同时加入量化操作。结合了预训练模型的优势和量化的高效性。

在NLP中,研究人员经常在预训练的BERT中进行量化感知微调。他能快速适应特定任务,减少计算开销。性能上不如从头训练的量化感知模型。

量化存在的问题

  • 精度下降。量化的位数越低,精度下降越大
  • 模型敏感度不同。不同模型,对量化的敏感程度不同,对于有些模型,量化后性能依然出色,但有些模型,量化对其影响会非常大。
    量化友好模型:传统CNN(如ResNet, VGG, MobileNet)、轻量级设计模型。
    敏感模型:包含Transformer架构的模型、某些循环神经网络(RNN/LSTM)、超小模型、包含特定算子(如Depthwise卷积)的模型。
  • 量化感知训练、训练感知微调需要修改训练过程,从而加大了训练的难度和计算资源的需求。

剪枝

去除神经网络中的不必要的连接,或者让一些神经元失活。以减少模型参数,降低计算量。

剪枝方法主要有两种:结构化剪枝、非结构化剪枝

基于权重重要性的剪枝方法

通过分析权重对模型输出的影响,将影响小的权重减掉。在不怎么影响模型性能的情况下,大幅度降低模型的参数数量。

非结构化剪枝

随机移除单个权重和连接。

可以很好提高压缩比,直接移除对模型影响很小的权重。非结构化剪枝可以把模型参数减少50%以上

缺点:产生的稀疏结构在硬件上很难高效运算,因为硬件更喜欢规整的矩阵操作。参数量虽然减少很多,但推理速度减少并不明显。

结构化剪枝

按照一定规则剪枝,比如移除一定的神经元、滤波器、隐藏层。

压缩比上不如非结构化剪枝,但是推理速度优化方面表现更好,在CNN中可以将推理速度提升2~3倍,并降低能耗。

剪枝总结

  • 精度损失问题。剪枝比例高时,精度损失严重。
  • 可以降低参数量50%以上,对于结构化剪枝,还可以提升计算速度,降低能耗,这对于移动设备和嵌入式设备非常友好。
  • 由于剪枝去除了冗余信息,模型的泛化能力也更好。
  • 不同硬件平台对剪枝的接受程度不一样,可能需要额外优化
  • 不同模型对剪枝敏感度不一样

蒸馏

分为教师模型和学生模型。

首先,训练一个大型、复杂、性能优异的教师模型,让其在大规模的数据集上学习,积累丰富的知识。

其次,选择一个较小的模型作为学生模型,进行初始化,要求结构简单但有一定的学习能力。

然后,进行训练。将教师模型的输出作为额外的监督信息,和学生模型的输出对比,通过优化损失函数来训练学生模型。损失函数包含两部分:学生模型原始损失、两个模型差异损失(一般选KL散度)

最后,对学生模型微调。

蒸馏涉及到一个温度参数,意义为难度程度。在高温模式下,可以学习到复杂的关联关系。低温模式下,答案接近原始分布,适合简单任务。(也可以选择动态,初期高温学习更多信息,后期低温聚焦特征)

NLP中,通常以BERT作为教师模型,LSTM作为学生模型。

蒸馏总结

优势

模型压缩效果显著,学生相较于教师,参数可以达到十分之一甚至更少。

推理速度快几倍

泛化能力更强

应用范围广:图像分类、目标检测、NLP

缺点

学生模型性能严重依赖教师模型的质量

训练时同时考虑学生和教师的训练过程

对于复杂任务,学生模型精度处理不如教师模型

需要合适且匹配的学生模型和教师模型

二值化

二值化可以在一些低功耗的物联网设备中,实现高精度的图像识别和语音识别,且由于计算简单不需要复杂的硬件支持。

二值化是一种极端的量化技术,把神经网络的权重和激活值限制在两个值上,通常为+1和-1。

二值化后,参数只需要1个bit就可以表示,极大程度降低模型复杂度,传统32位浮点数相比,缩小32倍。

由于只有两个值,乘法计算也可以通过转化为加法和移位替代。二值化网络卷积通过 同或XNOR 和 位操作 实现。

二值化总结

在神经网络训练中,研究人员也通过二值化技术压缩预训练的Transformer模型,显著减少模型存储空间和推理延迟。

二值化压缩率极高

推理速度提升明显,在一些网络中可以加快10倍以上

计算简单,可以进行硬件优化,使用专门的二值化硬件加速器

缺点:

精度损失严重,在复杂任务中更为明显

训练时需要特殊处理,如用直通估计器处理不可导的二值化操作

不同模型对二值化敏感度不同

场景分析

资源受限的场景

二值化适合精度要求不高的任务。量化可以调整量化精度控制压缩效果和模型性能之间的平衡。

要求计算速度,对精度有要求

量化和结构化剪枝

要求高性能

蒸馏

展望

多种压缩方法组合

量化+剪枝

蒸馏+量化感知训练

论文

https://arxiv.org/pdf/1603.05279

https://arxiv.org/pdf/2004.09602

https://arxiv.org/pdf/1511.00363

https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/37631.pdf

相关推荐
西猫雷婶3 小时前
pytorch基本运算-分离计算
人工智能·pytorch·python·深度学习·神经网络·机器学习
pzx_0013 小时前
【LeetCode】14. 最长公共前缀
算法·leetcode·职场和发展
self_myth3 小时前
算法与数据结构实战技巧:从复杂度分析到数学优化
算法
songx_994 小时前
leetcode10(跳跃游戏 II)
数据结构·算法·leetcode
没有梦想的咸鱼185-1037-16634 小时前
基于R语言机器学习方法在生态经济学领域中的实践技术应用
开发语言·机器学习·数据分析·r语言
Webb Yu4 小时前
Azure Databricks 实践:数据分析、机器学习、ETL 与 Delta Lake
机器学习·数据分析·azure
先做个垃圾出来………4 小时前
差分数组(Difference Array)
java·数据结构·算法
君名余曰正则5 小时前
机器学习实操项目01——Numpy入门(基本操作、数组形状操作、复制与试图、多种索引技巧、线性代数)
线性代数·机器学习·numpy
hansang_IR5 小时前
【题解】洛谷 P4286 [SHOI2008] 安全的航线 [递归分治]
c++·数学·算法·dfs·题解·向量·点积