首页 > 其他分享 >深度学习模型压缩方法概述

深度学习模型压缩方法概述

时间:2023-09-16 16:05:36浏览次数:47  
标签:剪枝 结构化 压缩 概述 计算 深度 量化 模型 精度


一,模型压缩技术概述

深度学习模型压缩方法概述_非结构化剪枝

知识蒸馏算法整体的框架图如图下所示。

深度学习模型压缩方法概述_模型量化_02

图片来源 https://intellabs.github.io/distiller/knowledge_distillation.html。

三,轻量级模型架构

深度学习模型压缩方法概述_结构化_03

四,模型剪枝

模型剪枝(model pruning)也叫模型稀疏化(model sparsity)。

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

深度学习模型压缩方法概述_结构化_04

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

上图是典型的三段式剪枝算法 pipeline,主要是 3 个步骤:

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

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

模型剪枝算法根据粒度的不同,可以粗分为细粒度剪枝粗粒度剪枝,如下所示:

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

按照剪枝是否规则,剪枝算法也可分为:

4.1,结构化稀疏与非结构化剪枝比较

与非结构化剪枝相比,结构化剪枝通常通常会牺牲模型的准确率和压缩比。结构化稀疏对非零权值的位置进行了限制,在剪枝过程中会将一些数值较大的权值剪枝,从而影响模型准确率。 “非规则”的剪枝则契合了神经网络模型中不同大小权值的随机分布,这对深度学习模型的准确度至关重要。展开来讲就是:

  1. 非结构化稀疏具有更高的模型压缩率和准确性,在通用硬件上的加速效果不好。因为其计算特征上的“不规则”,导致需要特定硬件支持才能实现加速效果。
  2. 结构化稀疏虽然牺牲了模型压缩率或准确率,但在通用硬件上的加速效果好,所以其被广泛应用。因为结构化稀疏使得权值矩阵更规则更加结构化,更利于硬件加速。

深度学习模型压缩方法概述_知识蒸馏_05

综上所述,深度神经网络的权值稀疏应该在模型有效性和计算高效性之间做权衡

目前,有一种趋势是在软硬件上都支持稀疏张量,因此未来非结构化剪枝可能会变得更流行。

五,模型量化

相比于剪枝操作,参数量化则是一种常用的后端压缩技术。所谓量化,其实可以等同于低精度(Low precision)运算概念,常规模型精度一般使用 FP32(32 位浮点数,单精度)存储模型权重参数,低精度则表示使用 INT8FP16 等权重数值格式。

模型量化(Model Quantization,也叫网络量化)过程分为两部分:将模型的单精度参数(一般 FP32-32浮点参数)转化为低精度参数(一般 INT8-8定点参数),以及模型推理过程中的浮点运算转化为定点运算,这个需要推理框架支持。

模型量化技术可以降低模型的存储空间、内存占用和计算资源需求,从而提高模型的推理速度,也是为了更好的适配移动端/端侧 NPU 加速器。简单总结就是,模型变小了,速度变快了,支持的场景更多了。

最后,现在工业界主流的思路就是模型训练使用高精度-FP32 参数模型,模型推理使用低精度-INT8 参数模型: 将模型从 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
  3. 《解析卷积神经网络》
  4. 《4-model_compression》(https://github.com/HarleysZhang/deep_learning_system/tree/main/4-model_compression)

本文作者嵌入式视觉

标签:剪枝,结构化,压缩,概述,计算,深度,量化,模型,精度
From: https://blog.51cto.com/armcvai/7493936

相关文章

  • 计算机网络概述
    计算机网络概述1.计算机网络发展简史1.1最早的广域网在通信双方或多方之间,通过电路交换建立电路连接的网络1.2电路交换网特点1.建立链接->使用链接->释放链接2.物理通路被通信双方独占计算机数据是突发式出现在数据链路上的,而电路交换网的建立链接、释放链接的三个过程......
  • 《动手学深度学习 Pytorch版》 6.2 图像卷积
    importtorchfromtorchimportnnfromd2limporttorchasd2l6.2.1互相关计算X=torch.tensor([[0.0,1.0,2.0],[3.0,4.0,5.0],[6.0,7.0,8.0]])K=torch.tensor([[0.0,1.0],[2.0,3.0]])此处应为:012345678*0123=......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • 深度学习---图像目标检测网络
    前面介绍了图像分类网络,并重点解析了ResNet及其应用以及MobileNet系列的轻量化分类网络,这一篇接着介绍图像目标检测网络。目标检测具有巨大的实用价值和应用前景。应用领域包括人脸检测、行人检测、车辆检测、飞机航拍或卫星图像中道路的检测、车载摄像机图像中的障碍物检测、医......
  • 使用深度远程启动管理器配置BMC DHCP管理地址的方法
    1.请确保服务器BMC口或者/IDRAC口是DHCP状态,才可以使用深度工具分配地址;若BMC配置过静态地址,请使用静态地址登录;2.配置好自己笔记本的ip(例如:192.168.10.1),用网线与ipmi独立管理口直连;笔记本请务必关闭防火墙和杀毒软件;3.可自行网上下载深度远程启动管理器;下载后,打开文件夹,双......
  • bindizip批量压缩解压(xjl456852原创)
    linux使用bindizip需要在wine下使用.linux批量解压缩脚本(xjl456852原创):脚本名: unpack.sh,可以将脚本放入到/usr/bin/bash下进行使用更方便没有加入-y参数,所以解压完成后不会自动关闭窗口,需要自己手动关闭窗口.因为需要检测是否有错误.如果不想检测是否有错误,可以使用下面......
  • 正则表达式和枚举概述
     一、正则表达式1、目的   正则表达式是独立于java的技术,不依附于java,但是它可以在java中使用,也可以在python/js等中使用   通过正则表达式处理字符串复杂的查找/替换/匹配/分割工作2、概述   使用单个字符串来描述或者匹配一系列符合某种语法规则的字符串3、使用步......
  • 三维模型3DTile格式轻量化压缩处理的数据质量提升方法分析
    三维模型3DTile格式轻量化压缩处理的数据质量提升方法分析 在处理三维模型3DTile格式的轻量化压缩时,如何在减少数据量的同时,保证或提升数据质量是一大挑战。以下为一些提升数据质量的方法分析:改进几何简化算法:在进行几何简化时,除了考虑顶点数量的减少,更要注重误差度量和形状......