深度学习500问——Chapter17:模型压缩及移动端部署(2)

devtools/2024/10/18 14:23:44/

文章目录

17.4.6 低秩分解

17.4.7 总体压缩效果评价指标有哪些

17.4.8 几种轻量化网络结构对比

17.4.9 网络压缩未来研究方向有哪些

17.5 目前有哪些深度学习模型优化加速方法

17.5.1 模型优化加速方法

17.5.2 TensorRT加速原理

17.5.3 TensorRT如何优化重构模型

17.5.4 TensorRT加速效果如何

17.6 影响神经网络速度的4个因素


17.4.6 低秩分解

基于低秩分解的深度神经网络压缩与加速的核心思想是利用矩阵或张量分解技术估计并分解深度模型中的原始卷积核。卷积计算是整个卷积神经网络中计算复杂度最高的计算操作,通过分解4D卷积核张量,可以有效减少模型内部的冗余性。

此外,对于2D的全连接层矩阵参数,同样可以利用低秩分解技术进行处理。但由于卷积层与全连接层的分解方式不同,本文分别从卷积层和全连接层2个不同角度回顾与分析低秩分解技术在深度神经网络中的应用。

在2013年,Denil等人[57]从理论上利用低秩分解的技术并分析了深度神经网络存在大量的冗余信息,开创了基于低秩分解的深度网络模型压缩与加速的新思路。如图7所示,展示了主流的张量分解后卷积计算。

(出自《深度神经网络压缩与加速综述》)

17.4.7 总体压缩效果评价指标有哪些

网络压缩评价指标包括运行效率、参数压缩率、准确率,与基准模型比较衡量性能提升时,可以使用提升倍数(speedup)或提升比例(ratio)。

评价指标特点
准确率目前,大部分研究工作均会测量Top-1准确率,只有在ImageNet这类大型数据集上才会只用Top-5准确率,为方便比较
参数压缩率统计网络中所有可训练的参数,根据机器浮点精度转换为字节(byte)量纲,通常保留两位有效数字以作近似估计
运行效率可以从网络所含浮点运算次数(FLOP)、网络所含乘法运算次数(MULTS)或随机实验测得的网络平均前向传播所需时间这3个角度来评价

17.4.8 几种轻量化网络结构对比

网络结构Top1准确率/%参数量/MCPU运行时间/ms
MobileNet V170.64.2123
ShuffleNet(1.5)69.02.9-
ShuffleNet(x2)70.94.4-
MobileNet V271.73,480
MobileNet V2(1.4)74.76.9149

17.4.9 网络压缩未来研究方向有哪些

网络剪枝、网络蒸馏和网络分解都能在一定程度上实现网络压缩的目的。回归到深度网络压缩到本质目的上,即提取网络中的有用信息,以下是一些值得研究和探寻的方向。

(1)权重参数对结果的影响度量。深度网络的最终结果是由全部的权重参数共同作用形成的,目前,关于单个卷积核/卷积核权重的重要性的度量仍然是比较简单的方式。尽管文献[14]中给出了更为细节的分析,但是由于计算难度大,并不实用。因此,如何通过有效的方式来近似度量单个参数对模型的影响,具有重要意义。

(2)学生网络结构的构造。学生网络的结构构造目前仍然是由人工指定的,然而,不同的学生我网络结构的训练难度不同,最终能够达到的效果也有差异。因此,如何根据教师网络结构设计合理的网络结构在精简模型的条件下获取较高的模型性能,是未来的一个研究重点。

(3)参数重建的硬件架构支持。通过分解网络可以无损地获取压缩模型,在一些对性能要求高的场景中是非常重要的。然而,参数的重建步骤会拖累预测阶段的时间开销,如何通过硬件的支持加速这一重建过程,将是未来对研究方向。

(4)任务或使用场景层面的压缩。大型网络通常是在量级较大的数据集上训练完成的,比如,在ImageNet上训练的模型具备对1000类物体的分类,但在一些具体场景的应用中,可能仅需要一个能识别其中几类的小型模型。因此,如何从一个全功能的网络压缩得到部分功能的子网络,能够适应很多实际应用场景的需求。

(5)网络压缩效用的评价。目前,对各类深度网络压缩算法的评价是比较零碎的,侧重于和被压缩的大型网络在参数量和运行时间上的比较。未来的研究可以从提出更加泛化的压缩评价标准出发,一方面平衡运行速度和模型大小在不同应用场景下的影响;另一方面,可以从模型本身的结构性出发,对压缩后的模型进行评价。

17.5 目前有哪些深度学习模型优化加速方法

https://blog.csdn.net/nature553863/article/details/81083955

17.5.1 模型优化加速方法

模型优化加速能够提升网络的计算效率,具体包括:

(1)Op-level的快速算法:FFT Conv2d(7x7,9x9),Winograd Conv2d(3x3,5x5)等;

(2)Layer-level的快速算法:Sparse-block net[1] 等;

(3)优化工具与库:TensorRT(Nvidia),Tensor Comprehension(Facebook)和Distiller(Intel)等。

17.5.2 TensorRT加速原理

https://blog.csdn.net/xh_hit/article/details/79769599

在计算资源并不丰富的嵌入式设备上,TensorRT之所以能加速神经网络的推断主要得益于两点:

  • 首先是TensorRT支持int8和fp16的计算,通过在减少计算量和保持精度之间达到一个理想的trade-off,达到加速推断的目的。
  • 更为重要的是TensorRT对于网络结构进行了重构和优化,主要体现在以下几个方面:

        (1)TensorRT通过解析网络模型将网络中无用的输出层消除以减小计算。

        (2)对于网络结构的垂直整合,即将目前主流神经网络的Conv、BN、Relu三个层融合为了一个层,例如将图1所示的常见的Inception结构重构为图2所示的网络结构。

        (3)对于网络结构的水平组合,水平组合是指将输入为相同张量和执行相同操作的层融合在一起,例如图2向图3的转化。

图1

图2

图3

以上3步即是TensorRT对于所部属的深度学习网络的优化和重构,根据其优化和重构策略,第一和第二步适用于所有的网络架构,但是第三步则对于含有Inception结构的神经网络加速效果最为明显。

Tips:想更好地利用TensorRT加速网络推断,可在基础网络中多采用Inception模型结构,充分发挥TensorRT的优势。

17.5.3 TensorRT如何优化重构模型

条件方法
若训练的网络模型包含TensorRT支持的操作

1、对于Caffe与TensorFlow训练的模型,若包含的操作都是TensorRT支持对,则可以直接由TensorRT优化重构;

2、对于MXnet、PyTorch或其他框架训练的模型,若包含的操作都是TensorRT支持的,可以采用TensroRT API重建网络结构,并间接优化重构;

若训练的网络模型包含TensorRT不支持的操作

1、TensorFlow模型可通过tf.contrib.tensorrt转换,其中不支持的操作会保留为TensorFlow计算节点;

2、不支持的操作可通过Plugin API实现自定义并添加进Tensor计算图;

3、将深度网络划分为两个部分,一部分包含的操作都是TensorRT支持的,可以转换为TensorRT计算图。另一部分则采用其他框架实现,如MXnet 或 PyTorch;

17.5.4 TensorRT加速效果如何

以下是在TitanX(Pascal)平台上,TensorRT对大型分类网络的优化加速效果:

NetworkPrecisionFramework/GPU:TitanXPAvg.Time(Batch=8,unit:ms)Top1 Val.Acc.(ImageNet-1k)
Resnet50fp32TensorFlow24.10.7374
Resnet50fp32MXnet15.70.7374
Resnet50fp32TRT4.0.112.10.7374
Resnet50int8TRT4.0.160.7226
Resnet101fp32TensorFlow36.70.7612
Resnet101fp32MXnet25.80.7612
Resnet101fp32TRT4.0.119.30.7612
Resnet101int8TRT4.0.190.7574

17.6 影响神经网络速度的4个因素

  1. FLOPs(FLOPs就是网络执行了多少multiply-adds操作);
  2. MAC(内存访问成本);
  3. 并行度(如果网络并行度高,速度明显提升);
  4. 计算平台(GPU,ARM)

http://www.ppmy.cn/devtools/119779.html

相关文章

第七章 Redis常用五大数据类型之ZSet

目录 一、介绍 二、常用命令 2.1. zadd 2.2. zrange 2.3. zrangebyscore 2.4. zrevrangebyscore 2.5. zincrby 2.6. zrem 2.7. zcount 2.8. zrank 一、介绍 Redis有序集合ZSet与普通集合Set非常相似,是一个没有重复元素的字符串集合。不同之处是有序…

【无标题】logistic映射

当Logistic映射中的控制参数 μ \mu μ 为负数时,系统的行为与正数 μ \mu μ 的情况截然不同。Logistic映射的一般形式是: x ( t 1 ) μ x ( t ) ( 1 − x ( t ) ) x(t1) \mu x(t) (1 - x(t)) x(t1)μx(t)(1−x(t))其中 x ( t ) x(t) x(t) 表示时…

sql 时间交集

任务(取时间交集) 前端输入开始时间和结束时间,通过sql筛选出活动开始时间和活动结束时间再开时时间和结束时间有交集的活动 想法: 前后一段时间内遇到了类似取交集的,从网上找到了两种写法,再结合GPT等…

#git 问题failed to resolve head as a valid ref

问题如下: 解决方法: 1、运行 git fsck --full 可以查看具体error信息,一般都是head索引问题 2、.git\refs\heads\xxx(当前分支)txt编辑器打开显示乱码,而不是hash编码 3、在.git\logs\refs\heads\xxx&a…

environment.yml迁移环境

在Anaconda中迁移环境是一个常见的任务,特别是在需要共享环境设置或在不同的机器上重建环境时。以下是迁移Anaconda环境的一般步骤: 1. 导出环境 首先,在源环境中导出当前环境的配置文件。打开终端(或Anaconda Prompt&#xff0…

css 中 ~ 符号、text-indent、ellipsis、ellipsis-2、text-overflow: ellipsis、::before的使用

1、~的使用直接看代码 <script setup> </script><template><div class"container"><p><a href"javascript:;">纪检委</a><a href"javascript:;">中介为</a><a href"javascript:…

Android常用C++特性之std::unique_lock

声明&#xff1a;本文内容生成自ChatGPT&#xff0c;目的是为方便大家了解学习作为引用到作者的其他文章中。 std::unique_lock 是 C 标准库中的一种灵活的锁管理类&#xff0c;提供了比 std::lock_guard 更多的功能和灵活性。它可以控制对互斥锁&#xff08;std::mutex&#x…

中间件:SpringBoot集成Redis

一.Redis简介 Redis&#xff08;Remote Dictionary Server&#xff0c;远程字典服务&#xff09;是一个开源的、使用ANSI C语言编写的、支持网络交互的、可基于内存亦可持久化的日志型Key-Value数据库&#xff0c;它提供了多种语言的API。Redis通常被称为数据结构服务器&#…