TensorRT模型优化部署 (八)--模型剪枝Pruning

系列文章目录

第一章 TensorRT优化部署(一)–TensorRT和ONNX基础
第二章 TensorRT优化部署(二)–剖析ONNX架构
第三章 TensorRT优化部署(三)–ONNX注册算子
第四章 TensorRT模型优化部署(四)–Roofline model
第五章 TensorRT模型优化部署(五)–模型优化部署重点注意
第六章 TensorRT模型优化部署(六)–Quantization量化基础(一)
第七章 TensorRT模型优化部署(七)–Quantization量化(PTQ and QAT)(二)
第八章 TensorRT模型优化部署 (八)–模型剪枝Pruning


文章目录

  • 系列文章目录
  • 前言
  • 一、模型剪枝是什么?
  • 二、模型剪枝流程
    • 2.1 对模型进行剪枝
    • 2.2 对剪枝后的模型进行fine-tuning
    • 2.3 获取到一个压缩的模型
    • 2.4 模型剪枝和量化
  • 三、模型剪枝的分类
    • 3.1 Coarse Grain Pruning (粗粒度剪枝)
    • 3.1 Fine Grain Pruning(细粒度剪枝)
  • 四、channel-level pruning
    • 4.1 L1 & L2 regularization
    • 4.2 BN中的scaling factor
  • 五、Pruning和fine-tuning
  • 总结


前言

自学视频笔记,专题内容后续有补充。


一、模型剪枝是什么?

模型剪枝是不同于量化的另外一种模型压缩的方式。如果说“量化”是通过改变权重和激活值的表现形式从而让内存占用变小和计算变快的话,“剪枝”则是直接“删除”掉模型中没有意义的,或者意义较小的权重,来让推理计算量减少的过程。更准确来说,是skip掉一些没有必要的计算。
在这里插入图片描述
模型剪枝的目的:
主要是因为学习的过程中会产生过参数化导致会产生一些意义并不是很大的权重,或者值为0的权重(ReLU)。对于这些权重所参与的计算是占用计算资源且没有作用的。需要想办法找到这些权重并让硬件去skip掉这些权重所参与的计算。
在这里插入图片描述
如图,我们可以把一个dense里面的不重要的权重归0,然后压缩,从88压缩成84和索引,再将压缩好的权重与激活值进行计算,就可以skip掉一些不重要的权重。
在这里插入图片描述
在剪枝前一般是以0为中心呈高斯分布,剪枝后0附近的权重就稀疏了。

二、模型剪枝流程

  1. 获取一个已经训练好的初始模型
  2. 对这个模型进行剪枝
  3. 对剪枝后的模型进行fine-tuning
  4. 获取到一个压缩的模型

2.1 对模型进行剪枝

  • 可以通过训练的方式让DNN去学习哪些权重是可以归零的(使用L1 regularization和BN中的scaling factor让权重归零)
  • 可以通过自定义一些规则,手动的有规律的去让某些权重归零.(对一个1x4的vector进行2:4的weight prunning)

2.2 对剪枝后的模型进行fine-tuning

有很大的可能性,在剪枝后初期的网络的精度掉点比较严重,则需要fine-tuning这个过程来恢复精度,Fine-tuning后的模型有可能会比之前的精度还要上涨。

2.3 获取到一个压缩的模型

如果压缩不满足要求可以回到步骤2再次剪枝,然后fine-tuning,压缩,直至满足要求。
在这里插入图片描述

2.4 模型剪枝和量化

模型剪枝是可以配合着量化一起进行的。

在这里插入图片描述

三、模型剪枝的分类

按照减枝的方法按照一定规律与否

{ 结构化减枝 非结构化减枝 \left\{ \begin{array}{l} 结构化减枝 \\ \\ 非结构化减枝 \\ \end{array}\right. 结构化减枝非结构化减枝

按照减枝的粒度与强度

{ 粗粒度减枝 细粒度减枝 \left\{ \begin{array}{l} 粗粒度减枝 \\ \\ 细粒度减枝 \\ \end{array}\right. 粗粒度减枝细粒度减枝

3.1 Coarse Grain Pruning (粗粒度剪枝)

粗粒度剪枝包括Channel/Kernel Pruning,但Channel/Kernel Pruning也是结构化减枝(Structured pruning)。

在这里插入图片描述

Kernel Pruning也就是直接把某些卷积核给去除掉,比较常见的方法就是通过L1Norm寻找权重中影响度比较低的卷积核。Channel Pruning就是把部分channel去除掉 。

Coarse Grain Pruning的优势劣势

  • 优势:
    不依赖于硬件,可以在任何硬件上跑并且得到性能的提升
  • 劣势:
    1. 由于减枝的粒度比较大(卷积核级别的),所以有潜在的掉精度的风险
    2. 不同DNN的层的影响程度是不一样的
    3. 减枝之后有可能反而不适合硬件加速(比如Tensor Core的使用条件是channel是8或者16的倍数)

3.1 Fine Grain Pruning(细粒度剪枝)

Fine Grain Pruning(细粒度剪枝)主要是对权重的各个元素本身进行分析减枝。这里面可以分为结构化减枝(structed)与非结构化减枝(unstructed)。

  1. 结构化减枝

    Vector-wise的减枝: 将权重按照4x1的vector进行分组,每四个中减枝两个的方式减枝权重 Block-

    wise的减枝: 将权重按照2x2的block进行分区,block之间进行比较的方式来减枝block

  2. 非结构化减枝

    Element-wise的减枝:每一个每一个减枝进行分析,看是不是影响度比较高

在这里插入图片描述

Fine Grain Pruning的优势劣势

  • 优势:
    相比于Coarse Grain Pruning,精度的影响并不是很大
  • 劣势:
    1. 需要特殊的硬件的支持(Tensor Core可以支持sparse)
    2. 需要用额外的memory来存储哪些index是可以保留计算的
    3. memory的访问不是很效率(跳着访问)数)
    4. 支持sparse计算的硬件内部会做一些针对sparse的tensor的重编,这个会比较耗时

四、channel-level pruning

原文地址:https://arxiv.org/pdf/1708.06519.pdf

结构化剪枝中比较常用以及使用起来比较简单的方式是channel-level pruning,不依赖于硬件的特
性可以简单的实现粗粒度的剪枝。

在这里插入图片描述
通过使用BN中的scaling factor,与使用L1-regularization的训练可以让权重趋向零这一特点,找到conv中不是很重要的channel,实现channel-level的pruning。通过对scaling factor进行L1正则,这里面的𝐶𝑖2和𝐶𝑖4会逐渐趋向零,我们可以认为这些channel不是很重要,可以称为pruning的候选。

4.1 L1 & L2 regularization

两者都是通过在loss损失函数中添加L1/L2范数(L1/L2-norm),实现对权重学习的惩罚(penalty)来限制权重的更新方式。根据L1/L2范数的不同,两者的作用也是不同的。训练的目的是让loss function逐渐变小。

• L1 regularization: 可以用来稀疏参数,或者说让参数趋向零。Loss function的公式是:
在这里插入图片描述

• L2 regularization: 可以用来减少参数值的大小。Loss function的公式是:
在这里插入图片描述

4.2 BN中的scaling factor

Batch normalziation一般放在conv之后,对conv的输出进行normalization。整个计算是channel-wise的,所以每一个channel都会有自己的BN参数(均值、方差、缩放因子、偏移因子)。如果BN之后发现某一个channel的scaling非常小,或者为零,可以认为这个channel做参与的计算并没有非常大强度的改变/提取特征,并不是那么重要。

使用BN和L1-norm对模型的权重进行计算以及重要度排序

在channel-wise pruning中,同样使用L1-norm作为惩罚项添加到loss中,但是L1-norm的参数不再是每一个权重,而是BN中对于conv中每一个channel的scaling factor。从而在学习过程中让scaling factor趋向零,并最终变为零。(负的scaling factor会变大,正的scaling factor会变小)。

在这里插入图片描述
整个pruning的过程中𝜆和𝑐ℎ𝑎𝑛𝑛𝑒𝑙的剪枝力度是超参,需要不断的实验找到最优。𝜆表示的是在
loss中L1-norm这个penalty所占的比重。𝜆越大就整个模型就会越趋近稀疏。

对于scaling factor不是很大的channel,在pruning的时候可以把这些channel直接剪枝掉,但同时也需要把这些channel所对应的input/outputd的计算也skip掉。最终得到一个紧凑版的网络。这个方法比较方便去选择剪枝的力度,通过不断的实验找到最好的剪枝百分比。

• 0% pruning
• 25% pruning
• 50% pruning
• 75% pruning

注意:

  1. 刚剪枝完的网络,由于权重信息很多信息都没了,所以需要fine-tuning来提高精度(需要使用mask)

  2. 剪枝完的channel size可能会让计算密度变低(64channel通过75% pruning后变成16channel)

  3. pruning后的channel尽量控制在64的倍数

    • 要记住最大化tensor core的使用
    • 对哪些层可以大力度的pruning需要进行sensitive analysis
    • 要记住DNN中哪些层是敏感层

五、Pruning和fine-tuning

Pruning
在这里插入图片描述

fine-tuning
在这里插入图片描述
先训练,更新权重,然后根据weight mask 决定哪部分更新,与weight mask相乘,为1的部分不变,为0的相乘后为0。


总结

本章为专题内容,主要介绍TensorRT优化部署,可移步专题查看其他内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/419184.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构 | 红黑树

二叉搜索树 节点的左边比节点的值小,右边比节点的值大。 红黑树 红黑树的性质 节点要么是红色,要么是黑色根节点是黑色叶子节点都是黑色的空节点红黑树中红色节点的子节点都是黑色从任一节点到叶子节点的所有路径都包含相同数目的黑色节点 在添加或者…

git 常规操作及设置

git 常规操作及设置 Git是一个分布式版本控制系统,可以用来跟踪文件的修改历史并与其他人进行协作开发。下面是一些常见的Git操作及设置: 初始化仓库:使用命令git init在当前目录创建一个新的Git仓库。 克隆仓库:使用命令git clo…

第十一站:多态练习ODU

实现动态切换 ODU.h #pragma once #include <iostream> using namespace std; #define ODU_TYPE_311_FLAG "311" #define ODU_TYPE_335_FLAG "335" enum class ODU_TYPE {ODU_TYPE_311,ODU_TYPE_335,ODU_TYPE_UNKNOW };class ODU{ public:ODU();//发…

【ARM Cortex-M 系列 1.1 -- Cortex-M33 与 M4 差异 详细介绍】

请阅读【嵌入式开发学习必备专栏 之 Cortex-Mx 专栏】 文章目录 背景Cortex-M33 与 M4 差异Cortex-M33Cortex-M4关系和差异举例说明 背景 在移植 RT-Thread 到 瑞萨RA4M2&#xff08;Cortex-M33&#xff09;上时&#xff0c;遇到了hardfault 问题&#xff0c;最后使用了Cortex…

JAVA的基础面试题二

​ 1.描述Servlet调用过程&#xff1f; 答案&#xff1a; &#xff08;1&#xff09;在浏览器输入地址&#xff0c;浏览器先去查找hosts文件&#xff0c;将主机名翻译为ip地址&#xff0c;如果找不到就再去查询dns服务器将主机名翻译成ip地址。 &#xff08;2&#xff09;浏…

keil软件仿真

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要…

无法打开浏览器开发者工具的可能解决方法

网页地址: https://jx.xyflv.cc/?url视频地址url 我在抖音里面抓了一个视频地址, 获取到响应的json数据, 找到里面的视频地址信息 这个网站很好用: https://www.jsont.run/ 可以使用js语法对json对象操作, 找到所有视频的url地址 打开网页: https://jx.xyflv.cc/?urlhttps:…

【UEFI基础】EDK网络框架(DHCP4)

DHCP4 DHCP4协议说明 DHCP是应用层的协议&#xff0c;DHCP报文是承载UDP上的高层协议报文&#xff0c;采用67&#xff08;DHCP服务器&#xff09;和68&#xff08;DHCP客户端&#xff09;两个端口号。 DHCP的全称是Dynamic Host Configuration Protocol&#xff0c;它的主要…

字节跳动 ByteHouse 云原生之路 – 计算存储分离与性能优化

01 起源 ByteHouse 的故事从字节跳动对于先进数据处理和分析的需求开始&#xff0c;这一需求随着公司业务规模的迅速扩张而日益增长&#xff0c;起源是对开源数据库管理系统 ClickHouse 的改造和增强。面对数据处理的高延迟、大规模数据操作的复杂性以及数据存储和处理成本的上…

【linux驱动】用户空间程序与内核模块交互-- IOCTL和Netlink

创建自定义的IOCTL&#xff08;输入/输出控制&#xff09;或Netlink命令以便用户空间程序与内核模块交互涉及几个步骤。这里将分别介绍这两种方法。 一、IOCTL 方法 1. 定义IOCTL命令 在内核模块中&#xff0c;需要使用宏定义你的IOCTL命令。通常情况下&#xff0c;IOCTL命令…

实战内网穿透NPS搭建过程

前提条件 首先你要有个公网IP的服务器&#xff0c;既然是内网穿透&#xff0c;那必然是通过公网IP或者域名访问本地服务。 官网下载地址 https://github.com/ehang-io/nps/releases 服务端 选择linux_amd64_server.tar.gz 客户端 选择windows_amd64_client.tar.gz 服…

EasyRecovery2024电脑数据恢复工具好不好用?

Ontrack是我们综述中的第一个产品&#xff0c;由于该软件的功效和广度&#xff0c;我认为它完全基于业务。有一个具有基本功能的免费版本和一系列付费版本&#xff0c;不仅可以恢复文件&#xff08;免费版和家庭版&#xff09;&#xff0c;还可以创建磁盘映像/从 CD 和 DVD 恢复…