【模型压缩】模型压缩的几种方式概述-程序员宅基地

技术标签: 计算机视觉  【AI模型训练与部署】  人工智能  【pytorch】  

1. AI模型组成

通常在训练模型时为了精度,权重值大多会使用32位浮点数(FP32)表示法,这就代表了每个权重占用了4个Byte(32bit)的储存(硬盘)和计算(随机内存)空间。 这还不包括在推论计算过程中额外所需的临时随机内存需求。

为了让运行时减少数据(网络结构描述及权重值)在CPU和AI加速计算单元(如GPU, NPU等)间搬移的次数,所以通常会一口气把所有数据都都加载专用内存中,但一般配置的内存数量都不会太多,大约1GB到16GB不等,所以如果没有经过一些减量或压缩处理,则很难一口气全部加载。
在这里插入图片描述

2. 常见的模型压缩方式

如同前面提到的,我们希望将一个强大复杂的AI模型减量、压缩后,得到一个迷你、简单的模型,但仍要能维持原有的推论精度或者只有些微(0%到指定%)的下降,就像我们平常看到的JPG影像、MP4影片,虽然采大幅度破坏性压缩,但人眼是很难分辨其品质差异的。 这样可以得到几项好处,包括大幅减少存储空间和计算用内存,推论速度加快,耗能降低,同时更有机会使用较低计算能力的硬件(如GPU变成CPU)来完成推理工作。 以下就把常见的四种方式简单介绍给大家。

2.1 模型量化 Model quantification

具体细节可阅读blog

通常在训练模型时,为求权重有较宽广的数值动态范围,所以大部分会采用32位浮点数(FP32, 符号1 bit,指数8 bit,小数23 bit,共4 Byte,数值表示范围 ±1.18e-38 ~ ±3.40e38)。
而经许多数据科学家实验后,发现在推理时将数值精度降至16位浮点数(FP16, 2 Byte, -32,768 ~ +32767),甚至8位整数(INT8, 1 Byte, -128 ~ +127)、8位浮点数(FP8, e5m2, e4m3, 1 Byte)在推论时其精度下降幅度可控制在一定程度内,同时可让储存空间和内存使用量减少1/2到3/4,若加上有支持SIMD或平行运算指令集[1]还可让运算量提升1.x ~ 3.x倍,一举多得。

以FP32量化为INT8为例,一般最简单的作法就是把所有空间等比对称分割再映射,不过当遇到权重值分配往单边靠或集中在某个区间时就很难分别出细部差异。 于是就有以最大值与最小值非对称方式来重新映射,以解决上述问题。

这样的量化减量的方式最为简单,但也常遇到模型所有层用同一数值精度后推论精度下降太多,于是开始有人采混合精度,即不同层的权重可能采不同数值精度(如 FP32,FP16,INT8 等)来进行量化。 不过这样的处理方式较为复杂,通常需要一些自动化工具来协助。
在这里插入图片描述

2.2 模型剪枝 Model pruning

所谓树大必有枯枝,模型大了自然有很多链接(权重)是没有存在必要的或者是删除后只产生非常轻微的影响。 如果要透过人为方式来调整(删除、合并)数以百万到千万的连结势必不可能,此时就只能透过相关程序(如Intel OpenVINO, Nvidia TensorRT,Google TensorFlow Lite等)使用复杂的数学来协助完成。

经过剪枝后,计算量会明显下降,但可以减少多少则会根据模型复杂度及训练的权重值分布状况会有很大差异,可能从数%到数十%不等,甚至运气好有可能达到减量90%以上。

另外由于剪枝后会造成模型结构(拓扑)变成很不完整,无法连续读取,所以需要另外增加一些描述信息。 不过相对权重值占用的储存空间,这些多出来的部份只不过是九牛一毛,不需要太过在意。
在这里插入图片描述

2.3 权重共享 Weight share

由于权重值大多是由浮点数表示,所以若能将近似值进行群聚(合并),用较少的数量来表达,再使用查表法来映射,如此也是一个不错的作法。 但缺点是这样的作法会增加一些对照表,增加推理时额外的查表工作,且由于和原数值有些微差异,因此会损失一些推论精度

如Fig. 4所示,即是将16个权重先聚类成4个权重(索引值),再将原本的权重值变成索引号,等要计算时再取回权重值,这样储存空间就降到原本的1/4。
在这里插入图片描述

2.4 知识蒸馏 Knowledge distillation

知识蒸馏基本上不是直接压缩模型,而是利用一个小模型去学习大模型输出的结果,间接减少模型的复杂度、权重数量及计算量。 大模型就像老师,学富五车,经过大数据集的训练,拥有数百万甚至千亿个权重来帮忙记住各种特征。 而小模型就学生,上课时间有限,只能把老师教过的习题熟练于心,但若遇到老师没教过的,此时是否能举一反三,顺利答题就很难保证了。

如Fig. 5所示,训练学生模型时,将同一笔数据输入到老师模型和学生模型中,再将老师的输出变成学生的标准答案,学生模型再以此调整所有权重,使输出推论结果和老师一样即可。 当给予足够多及足够多样的样本训练后,学生就能结束课程,独当一面了。
在这里插入图片描述

3. 小结

以上仅是简单介绍了部份减量及压缩模型的方式,还不包含模型减量、压缩后造成的精度下降如何调整。 这些工作相当复杂,只能交给专业的工具来办,其中 Intel OpenVINO Toolkit 就有提供许多模型优化(Model Optimization)及神经网络压缩工具 NNCF (Neural Network Compression Framework),有兴趣的朋友可以自行了解一下。

文章转载自:https://www.51openlab.com/article/548/
仅作学习记录

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/All_In_gzx_cc/article/details/135864351

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签