首页 > 其他分享 >知识蒸馏、轻量化模型架构、剪枝…几种深度学习模型压缩方法

知识蒸馏、轻量化模型架构、剪枝…几种深度学习模型压缩方法

时间:2023-03-13 15:35:30浏览次数:68  
标签:剪枝 卷积 模型 轻量化 芯片 量化 压缩

摘要:模型压缩算法旨在将一个大模型转化为一个精简的小模型。工业界的模型压缩方法有:知识蒸馏、轻量化模型架构、剪枝、量化。

本文分享自华为云社区《深度学习模型压缩方法综述》,作者:嵌入式视觉 。

一,模型压缩技术概述

因为嵌入式设备的算力和内存有限,因此深度学习模型需要经过模型压缩后,方才能部署到嵌入式设备上。

在一定程度上,网络越深,参数越多,模型也会越复杂,但其最终效果也越好。而模型压缩算法是旨在将一个庞大而复杂的预训练模型转化为一个精简的小模型。本文介绍了卷积神经网络常见的几种压缩方法。

按照压缩过程对网络结构的破坏程度,《解析卷积神经网络》一书中将模型压缩技术分为“前端压缩”和“后端压缩”两部分:

  • 前端压缩,是指在不改变原网络结构的压缩技术,主要包括知识蒸馏、轻量级网络(紧凑的模型结构设计)以及滤波器(filter)层面的剪枝(结构化剪枝)等;
  • 后端压缩,是指包括低秩近似、未加限制的剪枝(非结构化剪枝/稀疏)、参数量化以及二值网络等,目标在于尽可能减少模型大小,会对原始网络结构造成极大程度的改造。

总结:前端压缩几乎不改变原有网络结构(仅仅只是在原模型基础上减少了网络的层数或者滤波器个数),后端压缩对网络结构有不可逆的大幅度改变,造成原有深度学习库、甚至硬件设备不兼容改变之后的网络。其维护成本很高。

1.1,模型压缩技术分类

工业界主流的模型压缩方法有:知识蒸馏(Knowledge Distillation,KD)轻量化模型架构(也叫紧凑的模型设计)、剪枝(Pruning)、量化(Quantization)。各个模型压缩方法总结如下:

模型压缩方法描述涉及的网络层示例
知识蒸馏 属于迁移学习的一种,主要思想是将学习能力强的复杂教师模型中的“知识”迁移到简单的学生模型中。 卷积和全连接层 经典KD论文,属于蒸 "logits"方法,将Teacher Network输出的soft label作为标签来训练Student Network。必须重新训练模型。
轻量化模型架构 轻量级网络的核心是在尽量保持精度的前提下,从体积和速度两方面对网络进行轻量化改造。 卷积层/卷积模块 Mobilenet 提出深度可分离卷积;
shufflenetv2 论文 提出的四个高效网络设计的实用指导思想
RepVGG 提出重参数化思想。
都需要重新设计 backbone 和和重新训练模型。
剪枝 将权重低于阈值的连接都从网络中删除。 卷积层和全连接层 韩松2016年Deep Compression属于开山之作,剪枝步骤:正常训练,删除网络中权重低于阈值的连接层,重新训练。需要重新训练模型。
量化 指将神经网络的浮点算法转换为定点算法 卷积、全连接、激活、BN层等 TensoRT框架中的基于 KL 散度方法的INT8量化策略是主流技术。PTQ 训练后量化方法不需要重新训练模型。

二,知识蒸馏

一个复杂模型可由多个简单模型或者强约束条件训练得到。复杂模型特点是性能好,但其参数量大,计算效率低。小模型特点是计算效率高,但是其性能较差。知识蒸馏是让小模型去拟合大模型,从而让小模型学到与大模型相似的函数映射。使其保持其快速的计算速度前提下,同时拥有复杂模型的性能,达到模型压缩的目的。模型蒸馏的关键在于监督特征的设计,例如使用 Soft Target(软标签 KD) 所提供的类间相似性作为依据,或使用大模型的中间层特征图或 attention map 作为暗示,对小网络进行训练。整体的框架图如图下所示。

KD.png

三,轻量化模型架构

关于如何手动设计轻量级网络的研究,目前还没有广泛通用的准则,只有一些指导思想,和针对不同芯片平台(不同芯片架构)的一些设计总结,建议大家从经典论文中吸取指导思想和建议,然后自己实际做各个硬件平台的部署和模型性能测试。

3.1,如何设计高效CNN架构

一些结论

  1. 分析模型的推理性能得结合具体的推理平台(常见如:英伟达 GPU、移动端 ARM CPU、端侧 NPU 芯片等);目前已知影响 CNN 模型推理性能的因素包括: 算子计算量 FLOPs(参数量 Params)、卷积 block 的内存访问代价(访存带宽)、网络并行度等。但相同硬件平台、相同网络架构条件下, FLOPs 加速比与推理时间加速比成正比。
  2. 建议对于轻量级网络设计应该考虑直接 metric(例如速度 speed),而不是间接 metric(例如 FLOPs)。
  3. FLOPs 低不等于 latency 低,尤其是在有加速功能的硬体 (GPUDSP 与 TPU)上不成立,得结合具硬件架构具体分析
  4. 不同网络架构的 CNN 模型,即使是 FLOPs 相同,但其 MAC 也可能差异巨大。
  5. Depthwise 卷积操作对于流水线型 CPUARM 等移动设备更友好,对于并行计算能力强的 GPU 和具有加速功能的硬件(专用硬件设计-NPU 芯片)上比较没有效率Depthwise 卷积算子实际上是使用了大量的低 FLOPs、高数据读写量的操作。因为这些具有高数据读写量的操作,再加上多数时候 GPU 芯片算力的瓶颈在于访存带宽,使得模型把大量的时间浪费在了从显存中读写数据上,从而导致 GPU 的算力没有得到“充分利用”。结论来源知乎文章-FLOPs与模型推理速度和论文 G-GhostNet

一些建议

  1. 在大多数的硬件上,channel 数为 16 的倍数比较有利高效计算。如海思 351x 系列芯片,当输入通道为 4 倍数和输出通道数为 16 倍数时,时间加速比会近似等于 FLOPs 加速比,有利于提供 NNIE 硬件计算利用率。(来源海思 351X 芯片文档和 MobileDets 论文)
  2. 低 channel 数的情况下 (如网路的前几层),在有加速功能的硬件使用普通 convolution 通常会比 separable convolution 有效率。(来源 MobileDets 论文
  3. shufflenetv2 论文 提出的四个高效网络设计的实用指导思想: G1同样大小的通道数可以最小化 MAC、G2-分组数太多的卷积会增加 MAC、G3-网络碎片化会降低并行度、G4-逐元素的操作不可忽视。
  4. GPU 芯片上 3×33×3 卷积非常快,其计算密度(理论运算量除以所用时间)可达 1×11×1 和 5×55×5 卷积的四倍。(来源 RepVGG 论文
  5. 从解决梯度信息冗余问题入手,提高模型推理效率。比如 CSPNet 网络。
  6. 从解决 DenseNet 的密集连接带来的高内存访问成本和能耗问题入手,如 VoVNet 网络,其由 OSAOne-Shot Aggregation,一次聚合)模块组成。

3.2,轻量级模型部署总结

在阅读和理解经典的轻量级网络 mobilenet 系列、MobileDetsshufflenet 系列、cspnetvovnetrepvgg 等论文的基础上,做了以下总结:

  1. 低算力设备-手机移动端 cpu 硬件,考虑 mobilenetv1(深度可分离卷机架构-低 FLOPs)、低 FLOPs 和 低MACshuffletnetv2channel_shuffle 算子在推理框架上可能不支持)
  2. 专用 asic 硬件设备-npu 芯片(地平线 x3/x4 等、海思 3519、安霸cv22 等),分类、目标检测问题考虑 cspnet 网络(减少重复梯度信息)、repvgg2(即 RepOptimizervgg 型直连架构、部署简单)
  3. 英伟达 gpu 硬件-t4 芯片,考虑 repvgg 网络(类 vgg 卷积架构-高并行度有利于发挥 gpu 算力、单路架构省显存/内存,问题: INT8 PTQ 掉点严重)

MobileNet block (深度可分离卷积 blockdepthwise separable convolution block)在有加速功能的硬件(专用硬件设计-NPU 芯片)上比较没有效率。

这个结论在 CSPNet 和 MobileDets 论文中都有提到。

除非芯片厂商做了定制优化来提高深度可分离卷积 block 的计算效率,比如地平线机器人 x3 芯片对深度可分离卷积 block 做了定制优化。

下表是 MobileNetv2 和 ResNet50 在一些常见 NPU 芯片平台上做的性能测试结果。

深度可分离卷积和常规卷积模型在不同NPU芯片平台上的性能测试结果

以上,均是看了轻量级网络论文总结出来的一些不同硬件平台部署轻量级模型的经验,实际结果还需要自己手动运行测试。

四,模型剪枝

深度学习模型中一般存在着大量冗余的参数,将权重矩阵中相对“不重要”的权值剔除(即置为 0),可达到降低计算资源消耗和提高实时性的效果,而对应的技术则被称为模型剪枝。

模型剪枝图例

图片来源论文Han et al. Learning both Weights and Connections for Efficient Neural Networks, NIPS 2015

剪枝算法步骤:

  1. 正常训练模型;
  2. 模型剪枝;
  3. 重新训练模型

以上三个步骤反复迭代进行,直到模型精度达到目标,则停止训练。

模型剪枝算法根据粒度的不同,可以粗分为4种粒度:

  1. 细粒度剪枝(fine-grained):对连接或者神经元进行剪枝,它是粒度最小的剪枝。
  2. 向量剪枝(vector-level):它相对于细粒度剪枝粒度更大,属于对卷积核内部(intra-kernel)的剪枝。
  3. 核剪枝(kernel-level):去除某个卷积核,它将丢弃对输入通道中对应计算通道的响应。
  4. 滤波器剪枝(Filter-level):对整个卷积核组进行剪枝,会造成推理过程中输出特征通道数的改变。

五,模型量化

模型量化是指将神经网络的浮点算法转换为定点。量化有一些相似的术语,低精度(Low precision)可能是常见的。

  • 低精度模型表示模型权重数值格式为 FP16(半精度浮点)或者 INT8(8位的定点整数),但是目前低精度往往就指代 INT8
  • 常规精度模型则一般表示模型权重数值格式为 FP32(32位浮点,单精度)。
  • 混合精度(Mixed precision)则在模型中同时使用 FP32 和 FP16 的权重数值格式。 FP16 减少了一半的内存大小,但有些参数或操作符必须采用 FP32 格式才能保持准确度。

模型量化过程可以分为两部分:将模型从 FP32 转换为 INT8(即量化算术过程),以及使用 INT8 进行推理

5.1,模型量化的方案

在实践中将浮点模型转为量化模型的方法有以下三种方法:

  1. data free:不使用校准集,传统的方法直接将浮点参数转化成量化数,使用上非常简单,但是一般会带来很大的精度损失,但是高通最新的论文 DFQ 不使用校准集也得到了很高的精度。
  2. calibration:基于校准集方案,通过输入少量真实数据进行统计分析。很多芯片厂商都提供这样的功能,如 tensorRT、高通、海思、地平线、寒武纪
  3. finetune:基于训练 finetune 的方案,将量化误差在训练时仿真建模,调整权重使其更适合量化。好处是能带来更大的精度提升,缺点是要修改模型训练代码,开发周期较长。

按照量化阶段的不同,量化方法分为以下两种:

  • Post-training quantization PTQ(训练后量化、离线量化);
  • Quantization-aware training QAT(训练时量化,伪量化,在线量化)。

5.2,量化的分类

目前已知的加快推理速度概率较大的量化方法主要有:

  1. 二值化,其可以用简单的位运算来同时计算大量的数。对比从 nvdia gpu 到 x86 平台,1bit 计算分别有 5 到128倍的理论性能提升。且其只会引入一个额外的量化操作,该操作可以享受到 SIMD(单指令多数据流)的加速收益。
  2. 线性量化(最常见),又可细分为非对称,对称和 ristretto 几种。在 nvdia gpux86arm 和 部分 AI 芯片平台上,均支持 8bit 的计算,效率提升从 1 倍到 16 倍不等,其中 tensor core 甚至支持 4bit计算,这也是非常有潜力的方向。线性量化引入的额外量化/反量化计算都是标准的向量操作,因此也可以使用 SIMD 进行加速,带来的额外计算耗时不大。
  3. 对数量化,一种比较特殊的量化方法。两个同底的幂指数进行相乘,那么等价于其指数相加,降低了计算强度。同时加法也被转变为索引计算。目前 nvdia gpux86arm 三大平台上没有实现对数量化的加速库,但是目前已知海思 351X 系列芯片上使用了对数量化。

六,压缩方法总结

  1. 一般情况下,参数剪枝,特别是非结构化剪枝,能大大压缩模型大小,且不容易丢失分类精度。对于需要稳定的模型分类的应用,非结构化剪枝成为首要选择。
  2. 如果需要一次性端对端训练得到压缩与加速后模型,可以利用基于紧性滤波设计的深度神经网络压缩与加速方法。
  3. 影响神经网络推理速度主要有 4 个因素:FLOPs、MAC、计算并行度、硬件平台架构与特性(算力、GPU内存带宽)。

参考资料

    1. 深度学习模型压缩与加速

    2. Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding

 

点击关注,第一时间了解华为云新鲜技术~

标签:剪枝,卷积,模型,轻量化,芯片,量化,压缩
From: https://www.cnblogs.com/huaweiyun/p/17211587.html

相关文章

  • goroutine调度机制(GMP模型)
    进程、线程和协程进程是操作系统分配资源的最小单元,是一个具有一定独立功能的程序关于某个数据集合上的一次运行活动线程是操作系统调度的最小单元,是进程的一个执行单元......
  • 使用Python训练好的决策树模型生成C++代码
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、决策树模型二、解析决策树模型1.模型分解2.构建决策二叉树3.生成代码3.1生成python代......
  • AI机器学习模型python到C/C++的转换播
    了解过机器学习的人应该都知道python的sklearn库非常好用的机器学习助手。从sklearn导入某个机器学习的库,调用fit函数即可生成模型,用来预测测试数据。1、保存模型如......
  • GPT-4:OpenAI新一代多模态大型自然语言模型
    ChatGPT的发布让全世界都感受到了AI的力量,但是OpenAI不满足于此,将在本周发布升级版的模型GPT-4。基于GPT-3.5模型的ChatGPT已经这么强大了,GPT-4会到达一个什么水平,其语言能......
  • 基础订单模型
    我们在设计一个领域业务模型的时候,往往喜欢闭门造车,通过一些领域建模的理论去实践一些设计的理念,在此我并没有贬低的意思,只是感慨电商技术发展这么多年,有些系统设计出来的......
  • 总结linux安全模型
    1.总结linux安全模型①用户登录系统时必须提供用户名和密码。②使用用户和用户组来控制使用者访问文件和其他资源的权限。③系统上的每一个文件都一定属于一个用户(一般......
  • 基于5G密集网络模型的资源分配和负载均衡算法matlab仿真
    目录一、理论基础二、核心程序三、测试结果一、理论基础首先,5G模型的基本结构如下所示:  超密集网络是5G通信系统中的重要技术,是现在通信界的研究热点。系统中......
  • WINNER II信道模型与WINNER+信道模型概述
    目录1.WINNERII2.WINNER+目前信道模型主要分为准确信道模型、随机信道模型、统计信道模型。其中随机信道模型集和其他两种模型的优点,成为主流的信道模型。随机模型中......
  • pairwise损失_triplet损失_提升精排模型的trick
    多标签importtorchimporttorch.nnasnnimporttorch.optimasoptimclassRankModel(nn.Module):def__init__(self,num_features):super(RankMode......
  • 取出预训练模型中间层的输出(pytorch)
    1遍历子模块直接提取对于简单的模型,可以采用直接遍历子模块的方法,取出相应name模块的输出,不对模型做任何改动。该方法的缺点在于,只能得到其子模块的输出,而对于使用nn.Seq......