基于稀疏矩阵方法的剪枝压缩模型方案总结

news2024/10/6 19:55:41

1.简介

1.1目的

在过去的一段时间里,对基于剪枝的模型压缩的算法进行了一系列的实现和实验,特别有引入的稀疏矩阵的方法实现了对模型大小的压缩,以及在部分环节中实现了模型前向算法的加速效果,但是总体上模型加速效果不理想。所以本文档针对这些实验结果进行分析和总结。

1.2范围

本文档描述的代码修改以及实验方法都是基于caffe-Progress-m40框架进行的,主要的压缩策略是模型剪枝策略,并引入的稀疏矩阵的操作,实验的网络结构lenet。

1.3定义、首字母缩写词和缩略语

序号

术语或缩略语

说明性定义

1

2

3

4

5

6

7

1.4 参考资料

《模型压缩实验设计》

2.实验的方法

        本文档中的实验是基于caffe-Progress-m40框架进行的,修改了其中的源码,使得这个框架可以按照制定的剪枝策略对模型进行剪枝,并修改对应参数层中前向和后向算法将对应可训练的参数的稠密矩阵乘法替换为稀疏矩阵乘法,具体的修改方法可以参考《模型压缩实验设计》。

    实验中用到的剪枝策略是将可训练参数取绝对值,然后按照升序的方法排序,按照事先给定的剪枝率选出阈值,之后根据这个阈值对参数进行剪枝判断,绝对值大于这个阈值的参数保留,小于这个阈值的参数减除。

基于修改完毕的上述框架,做了两组对比实验。第一组实验主要是观察不同压缩率对模型压缩效果的影响。第二组实验主要是观察不同压缩率对前向算法耗时的影响。实验中的压缩率包括0.5,0.6,0.7,0.8,0.9,压缩率从0.5开始的原因是,稀疏矩阵的表示形式是csr/csc结构,全部的参数数量是2x+y,其中x表示的是矩阵中非零元素的个数,y表示矩阵的行或者列的大小。很显然,只有压缩率超过一半,即非零元素的个数小于全部元素的一半的时候,稀疏矩阵的存储才有优势。

实验中都是对剪枝后的模型进行了retrain,最大程度上保证了模型的acc,第一组实验给出不同压缩率的模型压缩效果,第二组实验给出不同压缩率的模型前向耗时情况。所有的实验都是基于mnist数据集在LeNet网络上进行的,具体的实验结果以及实验分析在下一节给出。

3.实验结果及其分析

3.1 模型尺寸压缩效果

(LeNet)mnist

commom train acc

lr = 0.01

Pruning acc

Pruning with retrain acc

lr = 0.001

size

Sparse=0.9

0.9911

0.2972

0.9874

1.7M->252K

Sparse=0.8

0.9072

0.9899

1.7M->496K

Sparse=0.7

0.9824

0.9914

1.7M->744K

Sparse=0.6

0.9819

0.9912

1.7M->984K

Sparse=0.5

0.9878

0.9923

1.7M->1.3M

表1 不同压缩率的模型压缩效果

不同压缩率的模型的压缩效果如表1所示。从表中可以看出随着压缩率的增加模型的尺寸越来越小,模型retrain后的模型acc也越低,特别当压缩率超过0.7之后,压缩后模型的acc会低于压缩前的模型的acc,所以为了保证模型的精度,压缩率在0.7的时候效果是最好的。这说明在压缩率为0.7的时候剩下的权值信息基本上可以代表完整的权值信息,证明原始模型神经元还是有很大的冗余的,通过剪枝的方法可以有效的降低模型的尺寸。

3.2 模型前向加速的效果

Sparse

(LeNet)mnist前向耗时(us)

cpu_time

gpu_time

0

118912

1748

0.5

2415347

2582

0.6

1987526

2272

0.7

1540937

2200

0.8

1071417

2057

0.9

728792

1978

表2 不同压缩率的前向算法耗时

不同压缩率的前向算法耗时如表2所示,对模型压缩之后模型的前向速度比压缩之前要慢,无论是在cpu还是gpu上,特别是在cpu上压缩后模型前向的耗时要比之前大一个量级。但是从表2中还可以得到另一个结论,那就是随着压缩率的增加,模型的前向算法的耗时都是下降的,无论是在cpu上还是gpu上,这说明当压缩率超过0.5后,稀疏矩阵的乘法是比稠密矩阵的乘法要快的,这个在相关的论文中以及自己的测试中都是得到验证的。但是为什么在本次实验结果中稀疏矩阵乘法的引入导致模型前向变慢了呢,本文对其中的原因做了总结:

  • cpu方面,在处理float或者double类型的数据时,Eigen矩阵运算库相比于cublas矩阵运算库要慢不少,而且为了代码中支持稀疏矩阵的运算引入了很多额外的操作,造成的前向耗时开销增加。
  • gpu方面,引入的稀疏矩阵运算库是cusparse库,这个运算库对稀疏矩阵乘法的支持只是支持稀疏矩阵的左乘,这样就导致cusparse只可以很好的适配ip层,而不能很好的支持卷积层,因为卷积层的稀疏操作是右乘,否则需要对得到输出进行转置,大大的增加了开销。而且caffe中卷积层的gpu支持有两种实现方法,其中cudnn加速版本的卷积层比无cudnn加速版本的卷积层的前向也要快,目前还没有发现支持cudnn加速的稀疏矩阵乘法运算库。所以每次在进行卷积操作的时候要将稀疏矩阵转换为稠密矩阵也增加了前向耗时的开销。

3.3 稀疏矩阵乘法耗时效果对比

    以上,介绍了在CPU上使用Eigen库的稀疏矩阵以及GPU上使用的cuSparse的矩阵乘法替换原本caffe上矩阵乘法的前向耗时情况。因为总体的性能不行,所以下面单独会对稀疏矩阵矩阵乘法耗时的情况进行统计,并进行分析。耗时的统计分为两大类:一是Mat*Mat的类型;二是Mat*Vec的类型。每个大类会分成三种情况:

  1. DenseMat*DenseMat/Vector:两个稠密矩阵的乘法耗时,其中第一个矩阵没有非零元素:使用MKL的cblas_sgemm()或者cblas_sgemv()函数
  2. DenseMat* DenseMat/Vector:两个稠密矩阵的乘法耗时,其中第一个矩阵是普通存储方式的稀疏矩阵: 使用MKL的cblas_sgemm()或者cblas_sgemv()函数
  3. SparseMat* DenseMat/Vector:csr存储格式的稀疏矩阵乘上稠密矩阵或者向量:分别使用MKL的mkl_scsrmm()或者mkl_scsrmv()函数以及eigen库的方法

3.3.1 Mat*Mat乘法耗时效果对比

当稀疏率为0.7时,各种矩阵和稠密矩阵乘法随着矩阵尺寸变化耗时的情况如图1所示,其中yMklNzDenseMm表示的是稠密矩阵和稠密矩阵的乘法耗时情况,其中稠密矩阵中无零元素;yMklDenseMm表示的是稠密矩阵和稠密矩阵的乘法耗时情况,其中稠密矩阵是由稀疏矩阵填充的;yMklSparseMm表示的是csr格式存储基于MKL库的稀疏矩阵和稠密矩阵的乘法耗时情况;yEigenSparseMm表示的是csr格式存储基于Eigen库的稀疏矩阵和稠密矩阵的乘法耗时情况。

图 1 稀疏率为0.7时,各种矩阵和稠密矩阵乘法随着矩阵尺寸变化耗时的情况

当稀疏率为0.8时,各种矩阵和稠密矩阵乘法随着矩阵尺寸变化耗时的情况如图2所示。

图 2 稀疏率为0.8时,各种矩阵和稠密矩阵乘法随着矩阵尺寸变化耗时的情况

当稀疏率为0.9时,各种矩阵和稠密矩阵乘法随着矩阵尺寸变化耗时的情况如图3所示。

图 3 稀疏率为0.9时,各种矩阵和稠密矩阵乘法随着矩阵尺寸变化耗时的情况

    从图中可以看出,稀疏率只有0.7的时候,稠密矩阵乘法的速度还是比较慢的,即使矩阵的稀疏率达到了0.9,无论是基于Eigen库的稀疏矩阵还是基于MKL库的稀疏矩阵来看,稀疏矩阵乘法相比稠密矩阵乘法也几乎没有什么优势。所以可以断定利用稀疏矩阵和稠密矩阵乘法加速的办法是不可行的。

3.3.2 Mat*Vec乘法耗时效果对比

当稀疏率为0.7时,各种矩阵和向量乘法随着矩阵尺寸变化耗时的情况如图4所示,其中yMklNzDenseMv表示的是稠密矩阵和向量的乘法耗时情况,其中稠密矩阵中无零元素;yMklDenseMv表示的是稠密矩阵和向量的乘法耗时情况,其中稠密矩阵是由稀疏矩阵填充的;yMklSparseMv表示的是csr格式存储基于MKL库的稀疏矩阵和向量的乘法耗时情况;yEigenSparseMv表示的是csr格式存储基于Eigen库的稀疏矩阵和向量的乘法耗时情况。

图 4 稀疏率为0.7时,各种矩阵和向量乘法随着矩阵尺寸变化耗时的情况

可以看出稀疏率为0.7的时候随着矩阵尺寸变大,稠密矩阵乘以向量和稀疏矩阵乘以向量的耗时基本上差不多。并且对比yMklNzDenseMv和yMklDenseMv可以看出稠密矩阵中0元素的多少对于稠密矩阵的运算没有影响。而基于Eigen的稀疏矩阵的乘法的速度和Mkl库还是有一定差距。

当稀疏率为0.8时,各种矩阵和向量乘法随着矩阵尺寸变化耗时的情况如图5所示。从图中可以看出,稀疏矩阵乘以向量上的速度优势已经体现出来了,无论是基于Eigen库还是Mkl库实现的稀疏矩阵乘法的运算速度都比稠密矩阵的运算速度要快,并且同样尺寸的矩阵,基于MKL库的稀疏矩阵运算速度最快。并且稠密矩阵中0元素多少得出的结论和之前的结论一致。

当稀疏率为0.9时,各种矩阵和向量乘法随着矩阵尺寸变化耗时的情况如图6所示。从图中可以看出稀疏矩阵的运算速度的优势更加明显了,当矩阵尺寸达到一定程度后,这种优势愈发明显,如矩阵尺寸到达2560*2560,稀疏矩阵比稠密矩阵的速度要快3倍多。

图 5 稀疏率为0.8时,各种矩阵和向量乘法随着矩阵尺寸变化耗时的情况

图 6 稀疏率为0.9时,各种矩阵和向量乘法随着矩阵尺寸变化耗时的情况

   

为了验证随着稀疏率的越增加,稀疏矩阵乘法的速度与稠密矩阵乘法速度差距越大的这个观点,我们给出固定矩阵尺寸为2560*2560,观察不同稀疏率对矩阵乘法速度的影响,结果如图7所示。对于Eigen库的稀疏矩阵乘法来说,当稀疏率达到0.8左右,稀疏矩阵与向量的乘法的耗时就比稠密矩阵与向量的乘法的耗时要少了。同样的对于基于MKL库的稀疏矩阵来说,稀疏率达到0.7左右就可以了。所以上述的观点得到了验证。

图 7 各种矩阵和向量乘法随着矩阵稀疏率变化耗时的情况

4.总结

         通过一系列的实验和结果分析,可以看出剪枝策略可以很好解决模型尺寸压缩的问题,特别是如果允许模型精度有些许下降的前提下,模型的压缩率可以达到0.9,然而要是同时还想达到模型前向加速的效果,目前使用的基于稀疏矩阵和稠密矩阵的乘法的加速方法是无效的,但是稀疏矩阵乘以向量的方法是可以尝试的。根据caffe中卷积层和全连接层的计算方法可知,当batchsize设置为1的时候全连接层的矩阵运算可以表示为矩阵和向量乘积的方法,即可以使用稀疏矩阵加速的方法来实现,但是对于卷积层来说,即使将batchsize设置为1,卷积层的运算还是矩阵和矩阵的乘法运算,所以无法用稀疏矩阵乘向量的方法进行加速。重要的是我们实验中还发现,用循环调用稀疏矩阵乘以向量的方法来替换稠密矩阵乘法的方法时,当循环次数到达10次以上之后,即使稀疏率达到0.9,循环调用的方法比直接矩阵乘法的方法要慢很多。总之,最后的实验说明,当稀疏率达到一定程度之后,只有稀疏矩阵和向量的乘法和稠密矩阵和向量的乘法对比才会有加速的效果。

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

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

相关文章

从零到一打造自己的大模型:模型训练

前言 最近看了很多大模型,也使用了很多大模型。对于大模型理论似乎很了解,但是好像又缺点什么,思来想去决定自己动手实现一个 toy 级别的模型,在实践中加深对大语言模型的理解。 在这个系列的文章中,我将通过亲手实践…

【面试题】Spring面试题

目录 Spring Framework 中有多少个模块,它们分别是什么?Spring框架的设计目标、设计理念?核心是什么?Spring框架中都用到了哪些设计模式?Spring的核心机制是什么?什么是Spring IOC容器?什么是依…

竞赛选题 python区块链实现 - proof of work工作量证明共识算法

文章目录 0 前言1 区块链基础1.1 比特币内部结构1.2 实现的区块链数据结构1.3 注意点1.4 区块链的核心-工作量证明算法1.4.1 拜占庭将军问题1.4.2 解决办法1.4.3 代码实现 2 快速实现一个区块链2.1 什么是区块链2.2 一个完整的快包含什么2.3 什么是挖矿2.4 工作量证明算法&…

鸿蒙面试心得

自疫情过后,java和web前端都进入了冰河时代。年龄、薪资、学历都成了找工作路上躲不开的门槛。 年龄太大pass 薪资要高了pass 学历大专pass 好多好多pass 找工作的路上明明阳关普照,却有一种凄凄惨惨戚戚说不清道不明的“优雅”意境。 如何破局&am…

修复:cannot execute binary file --- ppc64le 系统架构

前言: 修复node_exporter,引用pprof包,对源码编译后在 Linux 系统下执行程序运行时,发生了报错,报错信息:cannot execute binary file: Exec format error。 开始以为编译有问题,检查发现;该l…

正规的外盘期货开户指南避坑!

一:最正规最靠谱的外盘期货开户方式。那就是直开香港账户,需要基本证件、护照、境外卡等。 如果你满足以上条件,可以直接在香港外盘期货公司的营业部或线上官网开户。 优点:安全正规,银期转账。 缺点:保…

Java - 程序员面试笔记记录 实现 - Part1

社招又来学习 Java 啦,这次选了何昊老师的程序员面试笔记作为主要资料,记录一下一些学习过程。 1.1 Java 程序初始化 Java 程序初始化遵循规则:静态变量优于动态变量;父类优于子类;成员变量的定义顺序; …

1. jenkins持续集成交付

jenkins持续集成交付 一、jenkins介绍二、jenkins的安装部署1、下载jenkins2、安装jenkins3、修改插件下载地址4、初始化jenkins 一、jenkins介绍 持续集成交付, CI/CD 偏开发、项目编译、部署、更新 二、jenkins的安装部署 1、下载jenkins [rootjenkins ~]# wge…

LLM 推理:Nvidia TensorRT-LLM 与 Triton Inference Server

随着LLM越来越热门,LLM的推理服务也得到越来越多的关注与探索。在推理框架方面,tensorrt-llm是非常主流的开源框架,在Nvidia GPU上提供了多种优化,加速大语言模型的推理。但是,tensorrt-llm仅是一个推理框架&#xff0…

算法设计与分析--分布式系统作业及答案

分布式系统 作业参考答案2.1 分析在同步和异步模型下,convergecast 算法的时间复杂性。2.2 G 里一结点从 pr 可达当且仅当它曾设置过自己的 parent 变量。2.3 证明 Alg2.3 构造一棵以 Pr 为根的 DFS 树。2.4 证明 Alg2.3 的时间复杂度为 O(m)。2.5 修改 Alg2.3 获得…

限域传质分离膜兼具高渗透性、高选择性特点 未来应用前景广阔

限域传质分离膜兼具高渗透性、高选择性特点 未来应用前景广阔 分离膜是一种具有选择性透过功能的薄层材料。限域传质分离膜是基于限域传质机制的分离膜,兼具高渗透性、高选择性的特点。限域传质是流体分子通过与其运动自由程相当传质空间的过程,流体分子…

网络安全 DVWA通关指南 Cross Site Request Forgery (CSRF)

DVWA Cross Site Request Forgery (CSRF) 文章目录 DVWA Cross Site Request Forgery (CSRF)DVWA Low 级别 CSRFDVWA Medium 级别 CSRFDVWA High 级别 CSRFDVWA Impossible 级别 CSRF CSRF是跨站请求伪造攻击,由客户端发起,是由于没有在执行关键操作时&a…

推荐一个shp修复工具

我们在《如何解决ArcGIS中数据显示乱码问题》一文中,为你分享过打开shp文件的乱码问题。 现在再为你分享一个shp文件的修复工具,你可以在文末查看该工具的领取方式。 shp文件修复工具 Shapefile(简称SHP)是Esri推出的一种广泛使…

新能源行业知识体系-------蒙西电网需求侧响应

新能源行业知识体系-------主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/139946830 目录 一、背景介绍二、需求响应电能量收益介绍三、超额回收需求响应减免收益介绍四、参与需求侧响应五、蒙西电力现货特点六、交易中…

好消息!终于解决了!Coze工作流错误中断问题终于得到解决!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 解决方案 📒📝 常见的工作流中断问题📝 好消息来了!⚓️ 相关链接 ⚓️📖 介绍 📖 大家是否曾经遇到过这样的问题:在Coze平台辛辛苦苦设计的一个工作流,尤其是流程非常复杂和长的情况下,只要中间一个环节出错,整…

红海云签约联东集团,引领产业园区领军企业人力资源数字化新范式

北京联东投资(集团)有限公司(以下简称“联东集团”)是集产业园区运营、模板钢结构和投资业务为一体的集团化公司。联东集团独创了产业聚合U模式,致力于打造产业集聚平台,服务于实体企业成长和地区经济发展。…

[SD必备知识18]修图扩图AI神器:ComfyUI+Krita加速修手抽卡,告别低效抽卡还原光滑细腻双手,写真无需隐藏手势

🌹大家好!我是安琪!感谢大家的支持与鼓励。 krita-ai-diffusion简介 在AIGC图像生成领域的迅猛发展下,当前的AI绘图工具如Midjourney、Stable Diffusion都能够近乎完美的生成逼真富有艺术视觉效果的图像质量。然而,针…

基于大语言模型的多意图增强搜索

随着人工智能技术的蓬勃发展,大语言模型(LLM)如Claude等在多个领域展现出了卓越的能力。如何利用这些模型的语义分析能力,优化传统业务系统中的搜索性能是个很好的研究方向。 在传统业务系统中,数据匹配和检索常常面临…

SpringMVC 请求参数接收

目录 请求 传递单个参数 基本类型参数传递 未传递参数 传递参数类型不匹配 传递多个参数 传递对象 后端参数重命名 传递数组 传递集合 传递JSON数据 JSON是什么 JSON的优点 传递JSON对象 获取URL中的参数 文件上传 在浏览器与程序进行交互时,主要分为…

互联网信息服务算法备案流程与要求

一、备案申请的办理流程 企业通过网信办的互联网信息服务算法备案系统(https://beian.cac.gov.cn/#/index)提交算法备案申请。填报信息包括三部分,分别是算法主体信息、产品及功能信息、算法信息。备案中比较重要的文件包括主体信息中的《落…