NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模
模型剪枝(Model Pruning)是指从深度学习神经网络模型中删除不重要的参数,以减小模型大小并实现更高效的模型推理。通常,只剪枝参数的权重,而不影响偏差。偏差的剪枝往往有更明显的缺点。
由于这些参数被删除,可能会导致模型推理性能下降,因此应谨慎执行。在后续章节中,我们将探讨剪枝的类型以及剪枝策略,然后再讨论适合你特定用例的最佳剪枝策略。
1、为什么模型剪枝很重要?
有充分的证据表明,神经网络具有过多的参数,需要很好地概括并做出准确的预测。 “彩票假说:寻找稀疏、可训练的神经网络”(Frankle 和 Carbin,2019 年)表明,神经网络往往具有一组对预测至关重要的特定参数子集。模型剪枝是一种非常直观的模型压缩方法,其假设是有效的模型压缩应该删除未使用的权重,类似于大脑减少神经元之间连接的使用以强调重要通路的方式。
考虑到这一点,剪枝在压缩和简化模型方面通常比量化等其他方法更具针对性,量化只是直接去除模型权重的精度。因此,模型剪枝非常适合那些优先考虑在保持或提高模型准确性与减少整体模型大小之间找到平衡的从业者。
2、如何实现模型剪枝?
有两种主要方法可以修剪神经网络,即训练时剪枝和训练后剪枝,具体取决于剪枝过程相对于模型训练的发生时间。训练时修剪和训练后修剪都旨在减少神经网络的大小和计算复杂性,但它们在相对于训练过程做出修剪决策的时间上有所不同。
- 训练时修剪
训练时修剪(Train-Time Pruning)涉及将修剪过程直接集成到神经网络的训练阶段。在训练期间,模型的训练方式鼓励稀疏性或删除不太重要的连接或神经元作为优化过程的一部分。这意味着修剪决策是在训练迭代期间与权重更新同时做出的。
训练时修剪可以使用诸如 L1 或 L2 正则化等正则化方法(其中惩罚项鼓励稀疏性)或通过将修剪掩码纳入优化过程来实现。
- 训练后修剪
顾名思义,训练后修剪(Post-Training Pruning)涉及在训练模型完全训练后对其进行修剪,而不考虑在训练过程中进行修剪。一旦模型经过训练达到收敛,就会应用修剪技术来识别和删除训练模型中不太重要的连接、神经元或整个结构。这通常在训练完成后作为单独的步骤应用。
训练时修剪和训练后修剪都为模型压缩和优化提供了显着的好处。但是,每种方法都有自己的缺点,如下图所示:
一个好的起点通常是实施训练后修剪,因为你可以立即修剪任何现有模型,而无需增加训练流程的复杂性并从头开始重新训练模型。如果即使在微调模型后,修剪过程导致的任何准确度下降仍然不理想,你可以考虑训练时修剪。
3、训练后修剪的类型
修剪主要有两种类型:结构化和非结构化修剪。非结构化修剪通常侧重于删除单个模型权重参数,而结构化修剪则涉及切除整个权重结构。
3.1 非结构化修剪
非结构化修剪是一种更简单、更幼稚的修剪方法,但它是一种入门门槛低的可访问方法。
非结构化修剪的一般方法使用取决于原始权重本身或其激活的最小阈值来确定是否应修剪单个参数。如果参数未达到阈值,则将其归零。
由于非结构化修剪涉及将权重矩阵中的单个权重归零,这意味着将执行模型修剪之前的所有计算,因此延迟改进最小。另一方面,它可以帮助对模型权重进行去噪以实现更一致的推理,并有助于减小模型大小无损模型压缩。
与结构化剪枝不同,结构化剪枝在没有上下文信息和适应性的情况下肯定无法使用,非结构化剪枝通常可以开箱即用,不会有太大风险。“通过逐层校准进行训练后深度神经网络剪枝”(Lazarevich 等人,2021 年)证明了这种简单、无数据范式的有效性,可将模型权重减少 50% 以上,而准确率下降不到 1%。
3.2 结构化剪枝
结构化剪枝是一种更具野心、更具架构思维的剪枝方法。通过删除整个结构化权重组,该方法减少了在前向传递模型权重图时必须进行的计算规模。这对模型推理速度和模型大小有真正的改进。
“DepGraph:面向任何结构化剪枝”(Fang 等人,2023 年)展示了在各种架构中保持准确性的强大功能,同时将推理速度减半。鉴于更宏伟的目标,结构化修剪方法必须更加精确和有意识地修剪整个权重组,因为影响会扩展到该节点与图中其他节点之间的关系。这需要更多底层自适应过程,如果任意使用,肯定会对性能造成灾难性后果。
4、训练后修剪范围
对于每种主要修剪类型,也有不同的修剪范围:局部修剪和全局修剪。本节将深入探讨这些范围所包含的内容以及它们之间的主要区别。
4.1 局部修剪
局部修剪涉及在神经网络层内的单个神经元、连接或权重级别进行修剪。它通常侧重于根据某些标准(例如权重幅度低、在特定层上下文中重要性低或对模型性能的贡献最小)移除不太重要的连接或神经元。局部修剪通常涉及迭代技术,其中权重或连接根据某些标准一次修剪一个或分成小组。
局部修剪方法的示例包括权重幅度修剪、基于单位幅度的修剪或基于连接敏感度的修剪。
4.2 全局修剪
另一方面,全局修剪涉及同时修剪整个神经元、层甚至模型的大部分。它考虑整个网络中神经元或层的整体重要性,而不是关注单个层内的特定部分。全局修剪通常涉及更复杂的技术,这些技术考虑到网络不同部分之间的相互作用和依赖关系。
全局修剪方法的示例包括迭代幅度修剪(其中对整个网络的权重同时进行排序和修剪)、最佳脑损伤或最佳脑外科手术算法。
主要区别如下:
局部和全局修剪都有其优点,但一般来说,全局修剪具有更多背景信息,可以做出更有影响力的修剪决策,但可能会导致特定层整体受损。局部修剪的背景信息较少,因此可能不会产生有效的结果,但是一种更有分寸的方法。
5、修剪的效果
修剪的效果因深度学习模型而异。我们通过以不同的百分比修剪我们在 Nexus 上提供的一系列模型中的几种模型进行了比较研究。这些模型包括 DeepLabV3 MobileNetV3、UNet ResNet50、YOLOX Large 以及 YOLOv8 系列模型中的几种变体,均以 ONNX 导出。我们利用非结构化全局修剪来展示一种更简单的修剪方法将如何影响这些模型。
5.1 模型压缩
模型修剪可显著减少模型文件大小。压缩后的模型文件大小随着修剪量的增加而线性减小。这是意料之中的,因为当模型文件被压缩时,归零的权重应该只占用微不足道的空间。
需要注意的一点是,修剪是以尽力而为的方式进行的。例如,90% 的修剪百分比意味着 90% 的符合修剪条件的权重将被归零。由于并非所有权重都被选中进行修剪,并且激活和偏差等其他节点被排除在此过程之外,因此模型压缩的百分比可能与原始模型大小的 90% 没有直接关系,如下图所示的 UNet ResNet50 和 YOLOX Large 模型所示。
修剪带来的存储节省对于存储容量有限的边缘设备(例如无人机和片上系统摄像头)至关重要。通常与 GPU 部署相关的较大模型架构可以集成到这些边缘设备上,以实现更高的可访问性和本地推理能力。这对于可能需要在同一硬件上加载多个模型的其他部署环境也大有裨益。
5.2 推理速度
模型修剪还可以减少推理时间,因为归零权重是一个简单的传递过程,不会增加模型的计算复杂性。在下图中,模型对每幅图像进行推理所需的时间通常会随着修剪率的增加而减少。虽然并非所有模型都是如此,但大多数模型似乎都遵循这一趋势。
加速推理速度对于具有动态运动的实时应用至关重要,例如用于产品检查的传送带上的快速移动物体,或繁忙地区的人群和交通管理。经过剪枝的较大模型架构可以取代具有相似推理速度但可能具有更高准确度的较小现有模型。
5.3 推理性能
虽然剪枝通常有利于模型压缩和更快的推理速度,但过多的剪枝可能会对模型造成不利影响。虽然剪枝旨在将不重要的权重归零,但这些权重可能仍会对模型的决策过程产生轻微影响。较高的剪枝率也可能无意中剪枝重要的权重。这可能会导致模型的准确性下降。
根据下图,尽管大多数权重被清零,但一些模型仍能保持高性能(例如 DeepLabV3 MobileNetV3 和 UNet ResNet50 等语义分割模型)。然而,仍有一些模型会受到大量剪枝的严重影响(例如 YOLOv8x、YOLOv8s-seg)。
使用 mAP@0.5IOU 来衡量模型推理性能,用于对象检测、关键点检测和实例分割模型,而准确度用于语义分割和分类模型。两个值的范围都是从 0 到 1,值越高通常表示模型性能越好。
总体而言,模型修剪量越大,内存和推理时间节省越多。尽管推理性能下降是一个潜在的考虑因素,但选择正确的修剪率可以帮助缓解这种情况。
6、何时应该修剪模型?
在计算资源受限或效率至关重要的部署场景中,修剪模型尤其有益。
- 边缘设备:由于计算资源、内存和功率限制有限,在智能手机、物联网设备或嵌入式系统等边缘设备上部署模型通常需要轻量级模型。修剪可以显著减少模型大小和计算复杂度,从而可以在不牺牲性能的情况下在这些设备上部署。
- 实时应用:在低延迟至关重要的应用中,例如实时视频分析、自动驾驶汽车或语音识别,修剪可以帮助减少模型的推理时间。通过删除冗余参数或连接,修剪后的模型需要更少的计算,从而实现更快的推理,而不会影响准确性。
- 云服务:即使在基于云的部署场景中,计算资源可能更丰富,修剪仍然有利于节省成本和提高可扩展性。较小的模型需要更少的资源来部署和维护,从而降低基础设施成本并提高可扩展性,尤其是在高需求或弹性工作负载的场景中。
- 移动应用:移动应用通常具有有限的存储空间和处理能力,这使得部署大型模型具有挑战性。修剪允许开发人员创建更轻量级的模型,这些模型可以集成到移动应用中,而不会显著影响性能或用户体验。
- 嵌入式系统:在将模型部署在嵌入式系统上以执行工业自动化、机器人或传感器数据分析等任务的场景中,修剪可以帮助优化资源利用率并提高能源效率。这对于延长电池供电设备的电池寿命和减少资源受限环境中的能耗至关重要。
- 带宽受限环境:在带宽有限的部署场景中,例如远程位置或具有间歇性连接的物联网部署,修剪产生的较小模型在部署和推理期间需要更少的数据传输,从而实现更快、更可靠的通信。
7、应该修剪到什么程度?
与模型训练类似,有一些普遍的良好原则,但找出答案的最佳方法是确定标准化基准或基线,然后尝试各种设置以确定最适合您的设置。
从上图中,我们可以观察到,在修剪的参数的 30% - 50% 的“安全区”之外,模型推理性能急剧下降。因此,建议的起点可以是 30% 的初始修剪率。
根据你的用例,可以随后执行以下操作:
- 高性能批处理作业
对于需要更精确预测的批处理任务,你可以进一步降低修剪百分比,以提高性能的准确性。请注意,这会增加模型文件大小,并可能增加推理时间。因此,找到一个精确的水平非常重要,既要平衡验证指标的损失,又要尽可能多地修剪权重。
- 高速推理
如果你的模型必须适合某个固定大小(例如 25 MB),以便它可以满足在边缘设备上部署的某些要求,或者如果你想潜在地减少单次推理所需的时间,可以选择一定的最低修剪级别来实现该大小。同样,随着模型大小和推理时间的减少,模型的准确性也可能会受到影响。
- 在 Datature Nexus 上修剪模型
在 Nexus 上训练模型后,Datature 提供训练后模型修剪作为高级导出选项。我们专注于将训练后修剪作为初始选项,为在 Nexus 上训练的所有新模型和现有模型提供修剪兼容性。该模型使用基于幅度的非结构化修剪进行修剪,并且可以以模型兼容的任何导出格式导出(例如 PyTorch、TensorFlow、ONNX、TFLite、CoreML)。
要体验 Datature Nexus 上的模型修剪功能,你首先需要在 Nexus 上训练一个模型。要了解如何快速开始并训练你的第一个模型,请查看我们的五分钟教程,或探索我们如何使用 Nexus 训练和可视化人脸检测模型。
完成后,导航到 Artifacts 页面,您可以在其中查看已保存的模型检查点。选择要导出的模型检查点后,单击三个点 (...) -> 导出 Artifact。Artifacts 导出和转换卡将显示,并显示所有可用导出格式的列表。
要生成修剪后的模型,请单击你选择的导出格式下的查看高级导出。你可以根据模型压缩和推理准确性之间的权衡要求选择要修剪的权重百分比。修剪过程可能需要长达 5 分钟,具体取决于你的模型架构的大小和所选的修剪百分比。
修剪完成后,单击下载高级导出按钮将你的模型保存到本地文件系统。或者,你可以使用我们的 Python SDK 来转换和下载你的模型。
8、验证修剪后的模型
我们可以在 Netron 上检查修剪率为 90% 的样本修剪 ONNX 模型的卷积层,以验证大多数权重是否已清零。此外,Datature 提供了评估脚本来验证修剪后的模型在特定硬件架构上的性能。
9、结束语
模型修剪为用户提供了一种简单方便的方式来压缩他们的模型并提高与边缘设备的兼容性,但这只是进入模型优化领域的一步。
模型修剪通常与模型量化齐头并进,因为众所周知,这两种方法都可以有效减少模型的内存占用并加速推理性能。模型修剪可以在量化权重之前执行,并且这两种内存减少技术的效果都会叠加。换句话说,修剪和量化模型的压缩文件大小将比简单地应用这两种技术中的一种还要小。
原文链接:A Comprehensive Guide to Neural Network Model Pruning
BimAnt翻译整理,转载请标明出处