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.mfbz.cn/a/334393.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

016-Vue-黑马2023:前后端分离开发(在线接口文档),前端工程化、Element、vue编写一个完成页面、Vue路由、vue打包部署到nginx

第三节 前后端分离开发 1、介绍 开发模式 前后端混合开发:传统开发模式 前后端分离开发:当前最为主流的开发模式 页面原型需求案例:分析出接口文档 离线开发文档示例: 2、YAPI(官网已停用) 202…

Kafka(二)【文件存储机制 生产者】

目录 一、Kafka 文件存储机制 二、Kafka 生产者 1、生产者消息发送流程 1.1、发送原理 2、异步发送 API 2.1、普通异步发送 案例演示 2.2、带回调函数的异步发送 2.3、同步发送 API 3、生产者分区 3.1、分区的好处 3.2、生产者发送消息的分区策略 (1&am…

高光谱分类论文解读分享之HybridSN:基于 3-D–2-D CNN 的高光谱分类(经典回顾)

IEEE GRSL 2019:HybridSN:基于 3-D–2-D CNN 的高光谱分类 题目 HybridSN: Exploring 3-D–2-D CNN Feature Hierarchy for Hyperspectral Image Classification 作者 Swalpa Kumar Roy, Student Member, IEEE, Gopal Krishna, Shiv Ram Dubey , Mem…

逸学Docker【java工程师基础】3.4Docker安装redis

1.拉取redis docker pull redis 2.选择一个合适的redis 版本的配置文件 Redis configuration | Redis 或者这个 链接:https://pan.baidu.com/s/1RRdtgec4xBAgQghlhm0x1Q 提取码:ycyc 在1044行修改密码 3.提前在服务器建立 /data/redis 文件夹&…

ConcurrentHashMap 原理

ConcurrentHashMap ConcurrentHashMap的整体架构ConcurrentHashMap的基本功能ConcurrentHashMap在性能方面的优化 concurrentHashMap: ConcurrentHashMap的整体架构 concurrentHashMap是由数组链表红黑树组成 当我们初始化一个ConcurrentHashMap实例时&#xff0c…

一个简单的Web程序(详解创建一个Flask项目后自带的一个简单的Web程序)

程序代码截图如下: 1.应用初始化 在创建 Flask 程序时,通常需要先创建一个应用实例进行应用初始化。 from flask import Flask # 应用的初始化 app Flask(__name__) 上述代码中,使用 Flask 类创建了一个应用实例 app。 __name__ 参数用…

【C++】std::string 转换成非const类型 char* 的三种方法记录

std::string 有两个方法:data() 和 c_str(),都是返回该字符串的const char类型,那如何转换成非const的char呢? 下面展示三种方法: 强转:char* char_test (char*)test.c_str();使用string的地址&#xff…

利用浏览器开发者工具进行网页性能优化

目录 学习目标: 学习内容: 学习时间: 学习产出: 网页性能优化的基本概念和指标: 浏览器开发者工具的基本功能和使用方法: 使用网络面板进行网页加载性能分析: 使用性能面板进行网页渲染性能分析…

目标检测难题 | 小目标检测策略汇总

大家好,在计算机视觉中,检测小目标是最有挑战的问题之一,本文给出了一些有效的策略。 从无人机上看到的小目标 为了提高模型在小目标上的性能,本文推荐以下技术: 提高图像采集的分辨率 增加模型的输入分辨率 tile你…

基于SpringBoot Vue自习室管理系统

大家好✌!我是Dwzun。很高兴你能来阅读我,我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结,还为大家分享优质的实战项目,本人在Java项目开发领域有多年的经验,陆续会更新更多优质的Java实战项目&#x…

【Linux系统编程】程序地址空间

进程地址空间 进程地址空间是指每个进程在计算机内存中所占用的地址空间。地址空间是指能被访问的内存地址范围,它由若干个连续的内存块组成。每个进程都有自己的地址空间,这意味着每个进程都有自己的内存地址范围,不会与其他进程冲突。进程地…

Nightingale 夜莺监控系统 - 自愈篇(4)

Author:rab 官方文档:https://flashcat.cloud/docs/content/flashcat-monitor/nightingale/install/ibex/ 目录 前言一、部署1.1 MySQL1.2 Ibex Server1.3 Ibex Agent 二、验证2.1 n9e 上配置告警自愈2.2 创建自愈脚本2.3 告警规则配置回调地址2.4 模拟…

高效批量剪辑技巧:一键按指定时长精准分割视频的方法,轻松制作视频

随着社交媒体和数字内容的快速发展,视频制作的需求也日益增长。在制作视频时,我们经常需要将长视频分割成多个片段,或者将多个片段连接在一起。为了提高效率,我们可以使用一些高效的批量剪辑技巧,一键按指定时长精准分…

旅游项目day07

目的地攻略展示 根据目的地和主题查询攻略 攻略条件查询 攻略排行分析 推荐排行榜:点赞数收藏数 取前十名 热门排行榜:评论数浏览数 取前十名 浏览数跟评论数差距过大,可设置不同权重,例如:将浏览数权重设置为0.3…

市场监管总局发布区块链和分布式记账技术6项标准,中创积极推动区块链产业发展!

近日,市场监管总局(国家标准委)批准发布一批重要国家标准,涉及生产生活、绿色可持续等多个领域,这些标准将在引领产业发展、促进绿色转型、助力对外贸易、推动城乡建设、提升生活品质等方面发挥重要作用。 其中一项标…

【小笔记】算法训练基础超参数调优思路

【学而不思则罔,思维不学则怠】 本文总结一下常见的一些算法训练超参数调优思路(陆续总结更新),包括: batchsize学习率epochsdropout(待添加) Batch_size 2023.9.29 简单来说,较…

Qt/C++自定义界面大全/20套精美皮肤/26套精美UI界面/一键换肤/自定义颜色/各种导航界面

一、前言 这个系列对应自定义控件大全,一个专注于控件的编写,一个专注于UI界面的编写,程序员有两大软肋,一个是忌讳别人说自己的程序很烂很多bug,一个就是不擅长UI,基本上配色就直接rgb,对于第…

J4 - ResNet与DenseNet结合

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 目录 环境模型设计模型效果展示总结与心得体会 环境 系统: Linux语言: Python3.8.10深度学习框架: Pytorch2.0.0cu118显卡:GT…

基于springboot+vue的高校心理教育辅导系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

SpringCloud源码系列之(Ribbon、Hystrix超时正确配置)

这块的代码debug了一个礼拜,一开始看Fegin创建源码的时候没注意到,是基于RxJava的响应式编程。分析栈桢的时候,有很多异步栈桢。由于只是想搞清楚如下配置的生效时机、以及失效情况,期间还看了一堆与此无关的源码,真的…