LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

这篇具有很好参考价值的文章主要介绍了LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

概要

大语言模型(LLMs, Large Language Models)在各种任务上展现出了惊人的能力,这些能力很大程度上来自于模型庞大的模型规模以及海量的训练语料。为了应对这些模型部署上存在的挑战,许多研究者开始关注大语言模型的轻量化问题。由于 LLM 模型庞大的参数量,我们希望能以最小的成本完成对模型的压缩,尽可能的减少压缩后训练的开销,实现高效的模型压缩。

因为,我们提出了一种基于自动化的结构化剪枝的方案,采用结构化剪枝可以尽最大可能保留模型已习得的知识,实现高效的大语言模型压缩。在实验中,我们仅使用了 5 万条训练语料以及单张 4090 24GB 显卡,就可以在 3 小时内完成 LLaMA,Vicuna 和 ChatGLM 等大语言模型的剪枝和训练。

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

论文标题:

LLM-Pruner: On the Structural Pruning of Large Language Models

论文作者:

Xinyin Ma, Gongfan Fang, Xinchao Wang

单位:

新加坡国立大学

论文地址:

https://arxiv.org/abs/2305.11627

Github地址:

https://github.com/horseee/LLM-Pruner

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

大语言模型压缩面临的问题

首先,大语言模型的压缩与之前的语言模型(例如 BERT,RoBERTa 等)的压缩等有什么差异呢。这需要从模型/数据/任务三个角度来分析,

  • 模型规模:第一个主要差异来自 LLM 参数量规模远超之前的语言模型,这导致许多依赖重新训练的压缩方案,例如知识蒸馏,重新训练的开销较大。

  • 海量训练语料:许多 LLMs 经历了 1 万亿甚至更大规模的 tokens 上的训练,这导致许多依赖于原始数据或收集替代数据的方案变得尤其昂贵。

  • 任务无关的模型压缩:现有的压缩算法通常针对单一、特定的任务进行压缩,而 LLMs 是很优秀的多任务处理器,在压缩过程中我们不希望折损 LLM 的通用性和多功能性。

上述三种问题实际上对应了三个基本要求:

  • 降低训练规模:压缩算法需要尽可能少的依赖大规模的重新训练。

  • 减少数据依赖:压缩训练所需要的数据需要尽可能少

  • 保留模型原始能力:压缩模型过程中需要保留一定的原始模型能力。

由此,我们需要一种能够避免大规模重新训练、且能保持模型原有能力的压缩方法。现有的较为可行的两种方案是模型量化和结构化剪枝,他们的最主要特点都在于不需要完全从零开始训练。其中模型量化侧重于降低推理阶段的存储开销以及提升计算速度,而结构化剪枝则直接移除部分参数实现压缩,两种方案可以相互结合达到最优性能。本文主要介绍基于结构化剪枝的 LLM 压缩方法,通过保留 LLM 中的重要参数,降低压缩训练成本。

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

方法

本文提出一种简洁高效的结构化剪枝方法,遵循了经典的“重要性估计-剪枝-微调”的策略,能够在有限资源下完成大语言模型的压缩:

  • 重要性估计:在 LLM 中存在着复杂的子结构,剪枝算法需要对网络的参数进行分组,找到可移除的最小单元(通常称为 Group),并对各个组进行重要性评估。不同于之前的研究,我们解决了依赖图自动的挖掘神经网络中存在依存关系的子结构,也因此我们的方法更易拓展到更多的大规模语言模型。

  • 剪枝:在得到各个分组的重要性后,我们将冗余的组整个移除,从而降低模型的参数量。

  • 微调:在剪枝后的模型上应用 LoRA 等高效微调策略,恢复模型性能。

3.1 参数组重要性分析

首先我们分析了 LLM 模型中参数之间的依赖关系,从而找到最小可移除的分组。这些依赖可以归纳为三类,下图展示了 LLaMA 模型中存在的层耦合关系,主要由 MLP 内部的耦合、MHA 内部的耦合(主要为 QKVO 四个映射层)与整个网络中的通道耦合。这些耦合导致虚线显示的参数、神经元需要被同时移除,从而确保剪枝后结构的正确性。

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

为了自动化上述依赖分析,我们需要对神经元的依赖进行形式化建模。假设 和 是模型中的两个神经元, 和 表示 被指向和指向的所有神经元。结构之间的依赖性可以定义为:

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

其中 表示神经元的入度。注意这里的依赖关系并非是前向计算流向上的依赖关系,而是神经元结构上的依赖关系。这种依赖性是方向性的,我们因此可以得到另一种依赖性:

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

其中 表示神经元的出度。依赖性在网络剪枝中的重要性在于,如果当前神经元(例如 )仅依赖于另一个神经元(例如 ),且神经元 被剪枝,那么神经元 也必须被剪枝。此时如果不裁剪 ,那么网络结构中的维度就会不匹配。基于上述规则,我们可以实现一个自动识别参数依赖的程序,帮助我们剪枝各种 LLM 模型。同时,我们注意到 LLM 的最小可移除子结构通常包含了多个层,这就要求我们设计一种针对整个组的重要性估计策略。

3.2 组重要性估计

目前,我们已经对模型内部的耦合结构进行了建模。为了找到冗余分组,我们需要对将整个组作为一个最小单元进行重要性估计。鉴于对训练数据集的访问权限有限,我们探索使用可用的公共数据集或手动创建的样本作为替代资源。尽管这些数据集的领域可能与训练集不完全一致,但它们仍提供了评估结构组重要性的宝贵信息。

a)权重向量的一阶重要性估计:给定一个数据集 ,其中 N 是样本数量。在我们的实验中,我们设置 N 等于 10,也就是仅需 10 个样本。一个组(如前所述,被定义为一组耦合结构)包含一组互相耦合的参数 ,其中 M 是一个组中耦合结构的数量, 是组内第i层的权重。

在修剪时,我们的目标是移除对模型预测影响最小的结构,因此,参数的重要性可以通过损失函数的剪枝后扰动来判断。我们对损失函数进行泰勒展开并进行移项,可以得到一种简单的重要性估计指标 ,这类重要性评估策略需要我们尽可能精准的对损失函数进行建模,因此我们采用了二阶的泰勒展开:

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

其中, 表示 Hessian 矩阵, 表示 Next-token Prediction Loss。通常来说,重要性的一阶项由于模型在训练数据集已完全收敛,此项通常为 0,即 。然而,由于我们选取的数据 并非来自原始数据集,重要性评估中我们通常可以得到非 0 的一阶项,即 (实验中发现我们的数据上的 Loss 高于充分收敛样本上的 Loss)。

重要性估计的第二项要求我们对 Hessian 矩阵 进行计算。然而,由于 Hessian 矩阵的计算复杂度过高,这对参数了巨大的 LLM 而言是不现实的。因此,我们不直接对参数计算 Hessian 矩阵,而是仅考虑估计 hessian 矩阵的对角线元素,这需要引入单个参数标量的重要性评估。

b)单个参数的二阶重要性估计:上述过程对整个权重向量 的进行了估计。实际上,我们可以在更细粒度上得到另一种重要性度量,其中 参数矩阵内的每个数值都被独立地执行重要性估计。

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

这里, 用于索引 中的第 k 个参数。我们使用 Fisher Information Matrix 来近似 Hessian 矩阵的对角线 ,重要性可以被定义为:

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

3.3 组重要性聚合

在获得权重向量重要性 以及单个参数的重要性 后,我们还需要将其进行聚合,得到整个分组的重要性。本文提出四种重要性聚合的策略:

  • 求和 Sum: 或者 

  • 乘积 Prod: 或者 

  • 极值 Max: 或者 ;

  • 门控 Last-Only: 或者 

上述聚合方式实际上包含了不同的偏置,例如求和策略认为不同参数的贡献是独立且可叠加的,乘积策略则假设不同层的重要性会相互影响,最大值策略的偏置在于层的重要性由某一层主导。最后,门控策略则认为组内的最后一层主导了整个组的重要性,因为通过将该层设为 0 我们可以使得整个组不再参与网络预测。在评估每个组的重要性之后,我们根据预定义的修剪比例对每个组的重要性进行排序,并修剪重要性较低的组。

3.4 剪枝模型的低秩近似快速恢复

为了加速模型的压缩后训练,同时提高有限数据下的训练效率,我们需要降低优化的参数量。为了实现这一目标,我们将 LoRA 与剪枝模型相结合。模型中的每个可学习的权重矩阵,表示为 ,包含 LLM 中所有剪枝和未剪枝的线性投影。 的更新值 可以被分解为 ,其中 and 。前向计算现在表达为:

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

其中 b 是稠密层中的偏置。仅训练 P 和 Q 减少了整体训练复杂性,从而减少了对大规模训练数据的需求。此外,额外的参数 P 和 Q 可以被重新参数化为 ,这不会在最终压缩模型中造成额外的参数。

3.5 算法总结

上述过程给出了 LLM 模型的依赖分析、重要性评估以及后训练的完整方案,通过聚合一阶和二阶泰勒展开,我们可以得到更加鲁棒的重要性评估策略。对于大模型而言,重要性评估指标是尤其重要的,因为剪枝造成的性能损失越大,后训练恢复所需要的数据量、训练时间也就越多

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

实验

本文对三种开源的 LLM 进行剪枝实验,包括 LLaMA-7B,Vicuna-7B 和 ChatGLM-6B,剪枝前后的模型参数量、MACs 和内存占用如表所示。

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

4.1 LLaMA-7B剪枝后模型的Zero-shot能力验证

对于大模型而言,保留原始的多任务处理以及零样本能力是尤其重要的,我们完整评测了不同多种方案,包括权重剪枝、随机剪枝以及本文方法的剪枝效果。我们发现在剪枝 20% 参数的情况下,大模型依旧能保持一定的 zero-shot 能力,同时经过少量微调,zero-shot 性能可以快速提升,约达到基座模型的 94%。

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

4.2 Vicuna-7B剪枝后模型的Zero-shot能力验证

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

4.3 ChatGLM-6B剪枝后模型的Zero-shot能力验证

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

4.4 剪枝后模型的生成结果

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

更多分析结果请参考论文。

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

总结

在本文中,我们提出了 LLM-Pruner,一种用于大型语言模型的结构化剪枝方法。LLM-Pruner 旨在以任务无关的方式压缩庞大的语言模型,同时尽量减少对原始训练语料库的依赖,并保留 LLM 的语言能力。LLM-Pruner 通过迭代地检查模型中的每个神经元作为识别依赖组的触发器,从而构建 LLM 的依赖图。随后,LLM-Pruner 使用参数级和权重级估计来评估这些组的重要性。

最后,我们利用 LoRA 对被剪枝模型进行快速恢复和调整。我们使用多个 zero-shot 数据集评估了 LLM-Pruner 在三个不同模型(LLaMA,Vicuna 和 ChatGLM)上的有效性。我们的实验结果表明,LLM-Pruner 成功地剪枝了模型,在保留 zero-shot 能力的同时减轻了计算负担。

欢迎试用我们的项目:

https://github.com/horseee/LLM-Pruner

更多阅读

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

#投 稿 通 道#

 让你的文字被更多人看到 

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析科研心得竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。

📝 稿件基本要求:

• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注 

• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题

• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算

📬 投稿通道:

• 投稿邮箱:hr@paperweekly.site 

• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者

• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿

△长按添加PaperWeekly小编

🔍

现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧

·

·

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩文章来源地址https://www.toymoban.com/news/detail-474227.html

到了这里,关于LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 神经网络随记-参数矩阵、剪枝、模型压缩、大小匹配、、

    在神经网络中,参数矩阵是模型学习的关键部分,它包含了神经网络的权重和偏置项。下面是神经网络中常见的参数矩阵: 权重矩阵(Weight Matrix):权重矩阵用于线性变换操作,将输入数据与神经元的连接权重相乘。对于全连接层或线性层,每个神经元都有一个权重矩阵。

    2024年02月16日
    浏览(36)
  • 剪枝基础与实战(4):稀疏训练及剪枝效果展示

    稀疏训练是通过在 损失loss 中增加 BN 的 γ gamma γ 参数的L1 正则, 从而让绝大多数通道对应的 γ gamma γ 值趋近与 0 , 从而使得模型达到稀疏化的效果:

    2024年02月11日
    浏览(33)
  • LLM Data Pipelines: 解析大语言模型训练数据集处理的复杂流程

    编者按:在训练大语言模型的过程中,构建高质量的训练数据集是非常关键的一步,但关于构建大模型训练所需数据集的通用数据处理流程(Data pipelines)的相关资料极为稀少。 本文主要介绍了基于Common Crawl数据集的数据处理流程。首先,文章概述了Common Crawl的不同数据格式WAR

    2024年02月15日
    浏览(51)
  • 【llm 微调code-llama 训练自己的数据集 一个小案例】

    根据情况改就行了,jsonl格式,三个字段:context, answer, question 主要参考 https://zhuanlan.zhihu.com/p/660933421

    2024年01月21日
    浏览(64)
  • 现有的通用模型中融入少量中文数据没有太大意义&少量的数据就能影响整个大模型

    相关链接:只修改一个关键参数,就会毁了整个百亿参数大模型? | 新程序员-CSDN博客 现象 1:mBERT 模型的跨语言迁移 现象 2:大语言模型同样存在显著的语言对齐 现象 3:知识与语言分离 现象 4:语义和词形对齐 现象 5:少量的数据就能影响整个大模型 现象 6:大语言模型

    2024年02月20日
    浏览(37)
  • 递归专题训练详解(回溯,剪枝,深度优先)

    在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制: (1) 每次只能移动一个盘子; (2) 盘子只能从柱子顶端滑出

    2024年02月07日
    浏览(46)
  • 【YOLOv7/YOLOv5系列算法改进NO.49】模型剪枝、蒸馏、压缩

    作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv7的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程

    2024年02月08日
    浏览(37)
  • 剪枝与重参第二课:修剪方法和稀疏训练

    手写AI推出的全新模型剪枝与重参课程。记录下个人学习笔记,仅供自己参考。 本次课程主要讲解修剪方法和稀疏训练。 课程大纲可看下面的思维导图 修剪方法 主要包含训练后剪枝和训练时剪枝两种方法。 下图展示了这两种常见的剪枝方法的流程: 1.1 经典框架:训练-剪枝

    2023年04月11日
    浏览(37)
  • 第八章:AI大模型的部署与优化8.1 模型压缩与加速8.1.2 量化与剪枝

    作者:禅与计算机程序设计艺术 8.1.1 背景介绍 随着深度学习技术的不断发展,人工智能模型的规模越来越庞大。然而,这也带来了新的问题:大模型需要更多的计算资源和存储空间,同时在移动设备上运行效率较低。因此,模型压缩与加速成为了当前研究的热点。 8.1.2 核心

    2024年03月08日
    浏览(47)
  • QLoRA:量化 LLM 的高效微调

    此 repo 支持论文“QLoRA:量化 LLM 的高效微调”,旨在使对 LLM 研究的访问民主化。 QLoRA 使用bitsandbytes进行量化,并与 Hugging Face 的PEFT和transformers库集成。QLoRA 由华盛顿大学 UW NLP 小组的成员开发。 我们介绍了 QLoRA,这是一种有效的微调方法,可以减少内存使用量,足以在单个

    2024年02月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包