大模型剪枝概述

近年来,随着Transformer、MOE架构的提出,使得深度学习模型轻松突破上万亿规模参数,从而导致模型变得越来越大,因此,我们需要一些大模型压缩技术来降低模型部署的成本,并提升模型的推理性能。而大模型压缩主要分为如下几类:

  • 模型剪枝(Pruning)
  • 知识蒸馏(Knowledge Distillation)
  • 模型量化(Quantization)
  • 低秩分解(Low-Rank Factorization)

本文将针对当前大模型剪枝相关的一些工作进行讲述。

文章较长,建议先点赞收藏,后续再慢慢观看。另外,我撰写的大模型相关的博客及配套代码均整理放置在Github:llm-action,有需要的朋友自取。

剪枝简介

模型剪枝(Model Pruning)是一种用于减少神经网络模型参数数量和计算量的技术。它通过识别和去除在训练过程中对模型性能影响较小的参数或连接,从而实现模型的精简和加速。

通常,模型剪枝可以分为两种类型:结构化剪枝(Structured Pruning)、非结构化剪枝(Unstructured Pruning)。

结构化剪枝和非结构化剪枝的主要区别在于剪枝目标和由此产生的网络结构。结构化剪枝根据特定规则删除连接或层结构,同时保留整体网络结构。而非结构化剪枝会剪枝各个参数,从而产生不规则的稀疏结构。

模型剪枝的一般步骤包括:

  1. 训练初始模型:首先,需要训练一个初始的大模型,通常是为了达到足够的性能水平。
  2. 评估参数重要性:使用某种评估方法(如:权重的绝对值、梯度信息等)来确定模型中各个参数的重要性。
  3. 剪枝:根据评估结果,剪枝掉不重要的参数或连接,可以是结构化的或非结构化的。
  4. 修正和微调:进行剪枝后,需要进行一定的修正和微调,以确保模型的性能不会显著下降。

模型剪枝可以带来多方面的好处,包括减少模型的存储需求、加速推理速度、减少模型在边缘设备上的资源消耗等。然而,剪枝可能会带来一定的性能损失,因此需要在剪枝前后进行适当的评估和调整。

下面来探讨一些将LLMs与剪枝技术相结合的方法,旨在解决LLMs巨大尺寸和计算成本的问题。

非结构化剪枝方法

非结构化剪枝通过删除特定参数而不考虑其内部结构来简化 LLM。这种方法针对 LLM 中的单个权重或神经元进行,通常通过将阈值以下的参数归零。但是此方法忽略了 LLM 整体结构,导致不规则的稀疏模型,这种不规则性需要专门的压缩技术来有效存储和计算剪枝后的模型。

非结构化修剪通常涉及对 LLM 进行大量重新训练以重新获得准确性,这对于LLMs来说尤其昂贵。该领域的一种创新方法是 SparseGPT(论文:SparseGPT: Massive Language Models Can be Accurately Pruned in One-Shot)。它引入了一种不需要重新训练的一次性剪枝策略。该方法将剪枝视为广泛的稀疏回归问题,并使用近似稀疏回归求解器对其进行求解。 SparseGPT 实现了显著的非结构化稀疏性,在 OPT-175B 和 BLOOM-176B 等大模型上甚至高达 60%,而困惑度的增加很小。

image.png

与此相反,Syed 等人[Syed et al., 2023]提出一种迭代剪枝技术,在剪枝过程中以最少的训练步骤微调模型。

image.png

另一个优化是 LoRAPrune(论文:LoRAPrune: Pruning Meets Low-Rank Parameter-Efficient Fine-Tuning),它将参数高效调整 (PEFT) 方法与剪枝相结合,以增强下游任务的性能。它引入了一种独特的参数重要性标准 [Hu et al., 2022] 使用低秩自适应 (LoRA) 的值和梯度。

image.png

为了解决 SparseGPT 仍然需要的资源密集型权重更新过程,Wanda(论文:Simple and Effective Pruning Approach for Large Language Models)提出了一种新的剪枝指标。 Wanda 根据每个权重的大小和相应输入激活的范数的乘积来评估每个权重,并使用小型校准数据集进行近似。该指标用于线性层输出内的局部比较,从而能够从 LLMs 中删除较低优先级的权重。

image.png

通过观察到 LLM 推理性能和内存使用量很大程度上受到下图四种类型的 Skinny MatMul 的限制。 因此,Flash-LLM 旨在基于称为“稀疏加载和密集计算”(LSCD) 的关键方法来优化四个 MatMul。Flash-LLM 作为另一个用于非结构化模型剪枝的大语言模型推理加速方法。主要包含基于Tensor-Core加速的非结构化稀疏矩阵乘法计算的高效GPU代码,可以有效加速LLM中常见矩阵计算的性能。使用Flash-LLM,修剪后的LLM模型可以以更少的内存消耗部署到GPU上,并且可以更高效地执行。

image.png

结构化剪枝方法

结构化剪枝通过删除整个结构组件(例如:神经元、通道或层)来简化 LLM。这种方法同时针对整组权重,具有降低模型复杂性和内存使用量的优点,同时保持整体 LLM 结构完整。

这个领域的一个例子是 LLM-Pruner(论文:LLM-Pruner: On the Structural Pruning of Large Language Models),它采用通用方法来压缩 LLMs,同时保护其多任务解决能力和语言生成能力。此外,LLM-Pruner 还解决了 LLMs 使用大量训练数据带来的挑战,这可能导致大量的数据传输。为了克服这些挑战,LLM-Pruner 结合了依赖性检测算法来查明模型中相互依赖的结构。它还实现了一种有效的重要性估计方法,该方法考虑一阶信息和近似的 Hessian 信息。该策略有助于选择最佳的组用于剪枝,从而改进压缩过程。

image.png

通过研究能否利用现有的预训练 LLMs 来生成更小、通用且具有竞争力的 LLM,同时使用比从头开始训练要少得多的计算量?LLM-Shearing 提出了另外一种结构化剪枝方法。该方法提出了两种技术:

  • 有针对性的结构化剪枝:将源模型剪枝为预先指定的目标架构,同时最大化剪枝模型的性能。
  • 动态批量加载:修剪会导致跨域的信息保留发生变化。本方法为恢复缓慢的域加载更多数据,并且加载比例是动态决定的。

image.png

通过评估一系列广泛的下游任务,包括推理、阅读理解、语言建模和知识密集型任务,我们的 Sheared-LLaMA 模型优于现有的大语言模型。

image.png

结语

本文简单讲述了目前大模型剪枝的一些工作,在大模型参数量越来越大的今天,该方向的研究对于减少模型的大小以及复杂性非常有用。

码字不易,如果觉得有帮助,欢迎点赞收藏加关注。

参考文档:

### Ultralytics 模型剪枝技术方法实现 对于Ultralytics模型的剪枝操作,可以借鉴YOLO系列模型剪枝的经验。具体来说,在对这些模型进行优化时,通常会采用一系列特定的方法来减少参数量并提高推理效率而不显著降低性能。 #### 工程搭建与文件准备 为了实施有效的剪枝流程,需先构建必要的开发环境,并创建两个核心脚本文件用于支持整个过程: - `LL_train.py`: 负责常规训练以及引入稀疏性的特殊训练阶段。 - `LL_pruning.py`: 执行实际的剪枝逻辑,依据设定的标准去除冗余连接或节点[^1]。 #### 剪枝策略选择 针对不同应用场景可以选择多种不同的剪枝算法,比如L1正则化是最常用的一种方式,除此之外还有诸如L2、Random等多种选项可供考虑。每种方法都有其特点和适用范围,因此应当根据具体情况挑选最合适的方案[^2]。 #### 完整剪枝流程概述 完整的剪枝工作流一般分为几个连续的部分来进行: - **正常训练**: 初始状态下按照标准方式进行一轮或多轮次的基础训练。 - **稀疏训练(可选)**: 如果条件允许的话,可以在正式进入剪枝之前加入额外的一轮带有权重衰减机制(如L1/L2惩罚项)的预处理训练,这有助于后续更精准地定位那些真正不必要的部分[^3]。 - **执行剪枝**: 应用选定的技术手段削减掉被认为贡献较小甚至无意义的一些组件。 - **微调恢复**: 经过上述步骤之后往往还需要进一步调整剩余结构中的参数值以弥补可能存在的精度损失现象。 #### 结果评估与改进措施 完成以上各环节后要仔细分析最终成果的质量指标变化情况。如果发现经过处理的新版本表现不如预期,则建议尝试通过知识蒸馏等高级技巧帮助提升效果,即利用未压缩版作为教师指导简化过的学员模型学习更多有用特征表达形式。 ```python from ultralytics import YOLO def prune_model(model_path, pruned_model_save_path): model = YOLO(model_path) # 正常训练... # 稀疏训练... # 进行剪枝... # 微调... model.save(pruned_model_save_path) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃果冻不吐果冻皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值