【模型压缩】模型压缩的几种方式概述

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/
仅作学习记录

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书是国际算法大师乌迪·曼博(Udi Manber)博士撰写的一本享有盛誉的著作。全书共分12章:第1章到第4章为介绍性内容,涉及数学归纳法、算法分析、数据结构等内容;第5章提出了与归纳证明进行类比的算法设计思想;第6章到第9章分别给出了4个领域的算法,如序列和集合的算法、图算法、几何算法、代数和数值算法;第10章涉及归约,也是第11章的序幕,而后者涉及NP完全问题;第12章则介绍了并行算法;最后是部分习题的答案及参考文献。本书的特色有二,旨在提高读者的问题求解能力,使读者能够理解算法设计的过程和思想:一是强调算法设计的创造性过程,注重算法设计背后的创造性思想,而不拘泥于某个具体算法的详细讨论;二是将算法设计类比于定理归纳证明,揭示了算法设计的基本思想和本质。 本书的组织结构清晰且易于理解,强调了创造性,具有浓郁特色,时至今日仍有其巨大的价值,并且适合作为计算机及相关专业算法和高级算法课程的教材。 第1章 引论 第2章 数学归纳法 2.1 引言 2.2 三个简单的例子 2.3 平面内区域的计数 2.4 简单的着色问题 2.5 复杂一些的加法题 2.6 一个简单的不等式 2.7 欧拉公式 2.8 图论中的一个问题 2.9 格雷码 2.10 在图上寻找无重边的路 2.11 数学平均数和几何平均数定理 2.12 循环不变量:将十进制数转换为二进制数 2.13 常见的错误 2.14 小结 第3章 算法分析 3.1 引言 3.2 符号O 3.3 时间与空间复杂度 3.4 求和 3.5 递推关系 3.5.1 巧妙地猜测 3.5.2 分治关系 3.5.3 涉及全部历史的递推关系 3.6 一些有用的证明论据 3.7 小结 第4章 数据结构简介 4.1 引言 4.2 基本数据结构 4.2.1 元素 4.2.2 数组 4.2.3 记录 4.2.4 链表 4.3 树 4.3.1 树的表示 4.3.2 堆 4.3.3 二叉搜索树 4.3.4 AVL树 4.4 散列 4.5 合并?查找问题 4.6 图 4.7 小结 第5章 基于归纳的算法设计 5.1 引言 5.2 多项式求值 5.3 最大导出子图 5.4 寻找一对一映射 5.5 社会名流问题 5.6 分治算法:轮廓问题 5.7 在二叉树中计算平衡因子 5.8 寻找最大连续子序列 5.9 增强归纳假设 5.10 动态规划:背包问题 5.11 常见的错误 5.12 小结 第6章 序列和集合的算法 6.1 引言 6.2 二叉搜索的几种形式 6.2.1 纯二叉搜索 6.2.2 循环序列的二叉搜索 6.2.3 二叉搜索特殊下标 6.2.4 二叉搜索长度未知的序列 6.2.5 重叠子序列问题 6.2.6 解方程 6.3 内插搜索 6.4 排序 6.4.1 桶排序和基数排序 6.4.2 插入排序和选择排序 6.4.3 归并排序 6.4.4 快速排序 6.4.5 堆排序 6.4.6 排序问题的下界 6.5 顺序统计 6.5.1 最大数和最小数 6.5.2 查找第k小的数 6.6 数据压缩 6.7 串匹配 6.8 序列比较 6.9 概率算法 6.9.1 随机数 6.9.2 着色问题 6.9.3 将拉斯维加斯算法变换成确定性算法 6.10 查找众数 6.11 三个展现有趣证明方法的问题 6.11.1 最长递增序列 6.11.2 查找集合中两个最大的元素 6.11.3 计算多重集合的模 6.12 小结 第7章 图算法 7.1 引言 7.2 欧拉图 7.3 图的遍历 7.3.1 深度优先搜索 7.3.2 广度优先搜索 7.4 拓扑排序 7.5 单源最短路径 7.6 最小代价生成树 7.7 全部最短路径 7.8 传递闭包 7.9 图的分解 7.9.1 双连通分支 7.9.2 强连通分支 7.9.3 利用图分解的例子 7.10 匹配 7.10.1 非常稠密图中的完美匹配 7.10.2 偶图匹配 7.11 网络流量 7.12 哈密尔顿旅行 7.12.1 反向归纳 7.12.2 在非常稠密图中找哈密尔顿回路 7.13 小结 第8章 几何算法 8.1 引言 8.2 判定点是否在多边形内部 8.3 构造简单多边形 8.4 凸包 8.4.1 直接方法 8.4.2 礼品包裹算法 8.4.3 Graham扫描算法 8.5 最近点对 8.6 水平线段和竖直线段的交点 8.7 小结 第9章 代数和数值算法 9.1 引言 9.2 求幂运算 9.3 欧几里得算法 9.4 多项式乘法 9.5 矩阵乘法 9.5.1 Winograd算法 9.5.2 Strassen算法 9.5.3 布尔矩阵 9.6 快速傅里叶变换 9.7 小结 第10章 归约 10.1 引言 10.2 归约的例子 10.2.1 简单字符串匹配问题 10.2.2 特殊代表集 10.2.3 关于序列比较的归约 10.2.4 在无向图中寻找三角形 10.3 有关线性规划的归约 10.3.1 概述与定义 10.3.2 归约到线性规划的例子 10.4 下界的归约 10.4.1 寻找简单多边形算法复杂度的下界 10.4.2 关于矩阵的简单归约 10.5 常见的错误 10.6 小结 第11章 NP完全问题 11.1 引言 11.2 多项式时间归约 11.3 非确定性和Cook定理 11.4 NP完全性的证明例子 11.4.1 顶点覆盖问题 11.4.2 支配集问题 11.4.3 3SAT问题 11.4.4 团问题 11.4.5 3着色问题 11.4.6 一般经验 11.4.7 更多的NP完全问题 11.5 处理NP完全问题的技术 11.5.1 回溯法和分枝限界法 11.5.2 确保性能的近似算法 11.6 小结 第12章 并行算法 12.1 引言 12.2 并行计算模型 12.3 共享存储器算法 12.3.1 并行加 12.3.2 寻找最大数的算法 12.3.3 并行前缀问题 12.3.4 在链表中查寻秩 12.3.5 欧拉遍历技术 12.4 互连网络上的算法 12.4.1 阵列上的排序 12.4.2 排序网络 12.4.3 在树中查找第k个最小元素 12.4.4 网孔上的矩阵乘法 12.4.5 超立方体中的路由 12.5 脉动计算 12.5.1 矩阵与向量相乘 12.5.2 卷积问题 12.5.3 序列的比较 12.6 小结 部分习题答案 参考文献

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值