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.mzph.cn/news/627939.shtml

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

相关文章

Go-安装与基础语法

TOC 1. Go 安装与环境变量 1.1 下载 需要从Go语言的官方网站下载适合你操作系统的Go语言安装包。Go语言支持多种操作系统,包括Windows、Linux和Mac OS。 对于Windows用户,下载.msi文件,然后双击该文件,按照提示进行安装即可。…

python的装饰器详解

目录 一:介绍 二:在方法中使用 三:在类中使用 四:python自带的装饰器 一:介绍 Python的装饰器是一种高阶函数,它允许你在不改变函数内部逻辑的情况下,给函数添加额外的功能。装饰器本质上是…

【C++进阶】心心念念的红黑树,它来了!

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…

Spring框架是如何解决Bean创建过程中的循环依赖问题的

引言 本文主要梳理了Spring框架Bean创建过程中应对循环依赖问题的相关源码。我在手写super-mini-webpackhttps://blog.csdn.net/q1424966670/article/details/135628531?spm1001.2014.3001.5502的时候也介绍过解决循环依赖的算法:Map记忆化搜索。可以猜测这段源码…

ACL【新华三与华为的区别】

【解释】acl简单点解释就是,一套根据需求而设置的规则 【背景】 192.168.1.0/24 网段不允许访问 192.168.2.0/24 网段,要求使用基本 ACL 实现20_1 可以访问 20_6 的 TELNET 服务,但不能访问 FTP 服务 【操作步骤】 {易混点 }:1. …

机器学习周刊第六期:哈佛大学机器学习课、Chatbot Ul 2.0 、LangChain v0.1.0、Mixtral 8x7B

— date: 2024/01/08 — 吴恩达和Langchain合作开发了JavaScript 生成式 AI 短期课程:《使用 LangChain.js 构建 LLM 应用程序》 大家好,欢迎收看第六期机器学习周刊 本期介绍10个内容,涉及Python、机器学习、大模型等,目录如下&#xff…

Miracast手机高清投屏到电视(免费)

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl Miracast概述 Miracast是一种无线显示标准,它允许支持Miracast的设备之间通过Wi-Fi直接共享音频和视频内容,实现屏幕镜像或扩展显示。这意味着你可以…

C++常用类

1、QString 字符串类 QString 是Qt的字符串类,与C的std::string相比,不再使用ASCII编码。QString使用的Unicode编码。 QString 完全支持中文, 但是由于不同的技术可能会采用不同的编码。有时候也会遇到中文编码的一致性问题。 如果后续的学习…

PointMixer: MLP-Mixer for Point Cloud Understanding

Abstract MLP-Mixer 最近崭露头角,成为对抗CNNs和Transformer领域的新挑战者。尽管相比Transformer更为简单,但通道混合MLPs和令牌混合MLPs的概念在图像识别任务中取得了显著的性能。与图像不同,点云本质上是稀疏、无序和不规则的,这限制了直接将MLP-Mixer用于点云理解。为…

i18n多国语言Internationalization的实现

i18n 是"Internationalization”的缩写,这个术语来源于英文单词中首尾字母“”和“n”以及中间的字符数(共计18个字符) 当我们需要开发不同语言版本时,就可以使用i18n多国语言的一个操作处理,i18n主要实现那一方面的内容呢?…

项目压测优化实践思路

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的…

日本樱岛火山喷发遥感卫星影像监测

日本樱岛火山喷发监测 当地时间2024年1月9日15时许,位于日本九州地区鹿儿岛县的樱岛南岳山顶火山口,开始喷发,火山烟雾从火山口上升至空中1200米左右。目前,日本气象厅将樱岛的火山警戒级别维持在3级,限制民众入山。 火…

HCS私有云简介

1、HCS简介和发展史 华为云产品:私有云和公有云,现在的私有云已经和公有云越来越像了FusionSphere是华为的一个品牌2016年,在5.0版本的时候,华为Openstack叫FusionSphere Openstack 5.0,底层用的是suse操作系统&#…

BitLocker 驱动器加密

BitLocker 简介 BitLocker 驱动器加密是一项由微软开发并集成在Windows操作系统中的数据保护功能,其主要作用是通过加密存储在硬盘驱动器上的数据来增强信息安全。具体来说: 数据安全:BitLocker可以对整个操作系统卷(包括系统分区…

开源图床Lychee本地如何部署并结合内网穿透工具实现远程访问

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站,可以看做是云存储的一部分,既可…

酒店订房小程序源码系统:帮您打造类似美团的酒店模式的小程序 带完整的安装部署教程

随着移动互联网的快速发展,小程序已经成为一种新型的应用形态,为各大行业提供了更加便捷的服务。其中,酒店预订小程序作为一种方便快捷的预订方式,备受用户青睐。小编给大家分享一款酒店订房小程序源码系统,旨在帮助您…

中霖教育:中级会计师报名条件是什么?

一、学历要求 报考中级会计师的考生需要具备大专及以上学历,如果不满足学历要求是无法报考的。 二、工作经验要求 报考中级会计师的考生需要具备一定的工作经验。根据规定,不同的学历对从业年限要求不同,主要有以下几种情况: …

多租户体系实现

文章目录 核心思路方案选择设计考量安全性扩展性通用性易用性 具体实现租户信息透传透传变量名命名规范应用内透传应用间透传 数据层租户隔离MySQL存储方案:多租户Mybatis插件Mybatis插件特点使用多租户Mybatis插件的优势参考文档 应用场景 经过工作中的一处场景启发…

机器学习周刊第五期:一个离谱的数据可视化Python库、可交互式动画学概率统计、机器学习最全文档、快速部署机器学习应用的开源项目、Redis 之父的最新文章

date: 2024/01/08 这个网站用可视化的方式讲解概率和统计基础知识,很多内容还是可交互的,非常生动形象。 大家好,欢迎收看第五期机器学习周刊 本期介绍7个内容,涉及Python、概率统计、机器学习、大模型等,目录如下: 一个离谱的Python库看见概率,看见统计2024机器学习最…

U盘提示未格式化解决方法超级简单

U盘提示未格式化是常见故障,主要原因有文件系统损坏、固件问题、物理故障等。解决方法包括格式化U盘、更新固件、恢复数据等,具体操作需根据故障原因选择。如无法解决,建议联系专业维修人员处理。 U盘提示未格式化解决方法超级简单 当U盘提示…