一文读懂剪枝(Pruner):大模型也需要“减减肥”?

当你听到「剪枝」二字,或许会联想到园丁修整枝叶的情景。而在 AI 大模型领域,这个词有着特殊的含义 —— 它是一种通过“精简”来提升大模型效率的关键技术。随着 GPT、LLaMA 等大模型规模的持续膨胀,如何在保持性能的同时降低资源消耗,已成为亟待解决的难题。本文将揭示大模型剪枝技术的原理与发展,带你一次性读懂剪枝。

随着人工智能的快速发展,大模型以其卓越的性能在众多领域中占据了重要地位。然而,大模型惊人的参数规模也带来了一系列挑战,如高昂的训练成本、巨大的存储需求和推理时的计算负担。为了解决这些问题,大模型剪枝技术应运而生,成为压缩大模型的关键手段。本文将简要介绍大模型剪枝技术的背景及原理、代表性方法和研究进展。

背景及原理

当今大模型的“身躯”越来越庞大,对资源的需求也日益增加。如 LLaMA 3.1,且不说其训练算力高达 24000 块 H100,训练数据量高达 15T tokens(Qwen 2.5 在 18T tokens 的数据集上进行了预训练,成为目前训练数据最多的开源大模型),单看表 1 和表 2 中 LLaMA 3.1 在推理和微调时的内存需求,对普通用户而言就是难以承受之重。这些庞大的需求不仅对硬件资源提出了极高的要求,也限制了模型的可扩展性和实用性。大模型剪枝技术通过减少模型中的参数数量,旨在降低这些需求,同时尽量保持模型的性能。

表 1 LLaMA 3.1 推理内存需求(不包括 KV 缓存)

表 2 LLaMA 3.1 微调内存需求

剪枝“流派”的开山鼻祖是图灵奖得主、深度学习“三巨头”之一 Yann LeCun,他在 1989 年 NeurIPS 会议上发表的《Optimal Brain Damage》[1]是第一篇剪枝工作。后来剪枝“流派”逐渐开枝散叶,如今可主要分为两大类:非结构化剪枝结构化剪枝。非结构化剪枝通过移除单个权重或神经元得到稀疏权重矩阵,这种方法易于实现且性能指标较高,但需要专门的硬件或软件支持来加速模型;结构化剪枝通过去除基于特定规则的连接来实现,如层级剪枝、块级剪枝等,这种方法不需要专门的软硬件支持,但算法更为复杂。

两类剪枝方法在大模型上都有很多的尝试和应用,但考虑到通用性,我们主要关注结构化剪枝,本文的第二部分也将主要介绍 LLM 结构化剪枝的经典文章 LLM-Pruner。

下面谈一谈剪枝的理论基础。首先,所谓的理论基础只是暂时的,在一个高速发展的学科中,很难确保今天的理论不会被明天的实验推翻。在传统上,人们一直认为剪枝的基础是 DNN 的过参数化,即深度神经网络参数比拟合训练数据所需参数更多,可以剪去一部分以降低网络复杂度而尽量不影响其性能。

在 2019 年,有学者提出了彩票假设(ICLR 2019 best paper)[2]:一个随机初始化的神经网络里包括一个子网络,当该子网络被单独训练时,能在最多相同迭代次数后达到原始网络训练后的性能——就好比一堆彩票中存在一个中奖子集,只要买了这个子集就能获得最大收益。

随后,又有学者在《What’s Hidden in a Randomly Weighted Neural Network?》中提出了“近似加强版”彩票假设(CVPR 2020)[3]:在一个随机权重的足够过参数化的神经网络中,存在一个子网络,无需训练,其性能与相同参数量训练过的网络相当。

再随后,又有学者声称自己证明了这个“近似加强版”的彩票假设,并在标题里宣称 Pruning is all you need(ICML 2020)[4]。也就是说,如图 1 所示,以后不需要训练了,我们只用找一个足够大的网络,剪啊剪啊就能得到一个性能很好的子网络。这个说法如果成立当然是极好的,因为基于梯度的优化算法训练时间长,且是次优的,但问题在于缺乏有效的纯剪枝算法,所以目前剪枝的基本流程还是:训练、剪枝、微调。另外,作者是用二值小网络+推广证明的,太过理想化,而且没有考虑非线性的情况。近年来,虽然彩票假设及其衍生理论在一些研究领域取得了进展,例如图中奖彩票(KDD 2023)[5]和对偶彩票假设(ICLR 2022)[6],但在大模型领域,我们尚未观察到具有显著影响力的研究工作。

图 1 LLaMA 3.1 微调内存需求

针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈

代表性方法:LLM-Pruner

本节将以首个针对大模型的结构化剪枝框架 —— LLM-Pruner(NeurIPS 2023)[7]为例,介绍大模型剪枝的基本流程。该框架特点为任务无关的压缩、数据需求量少、快速和全自动操作,主要包括以下三个步骤:

(1)分组阶段

本阶段的主要工作是根据依赖性准则,将 LLM 中互相依赖的神经元划分为一组。依赖性准则为:若 i 是 j 的唯一前驱,则 j 依赖于 i;若 j 是 i 的唯一后继,则 i 依赖于 j。在具体操作中,需要分别将网络中每个神经元作为初始节点,依赖关系沿方向传导,传导过程中遍历的神经元为一组,一组需同时剪枝。以图 2 中 Group Type B(即 MHA,多头注意力)为例,从 Head 1 开始传导,Head 1 是上面两个虚线圈神经元的唯一前驱,是下面六个虚线圈神经元的唯一后继,它们都依赖于 Head 1,故被划分为一组。

图 2 LLaMA 中耦合结构的简化示例

(2)评估阶段

本阶段的主要工作是根据重要性准则评估每个组对模型整体性能的贡献,贡献小的组将被修剪。常见的重要性准则有:L1 范数(向量中各元素绝对值之和)、L2 范数(向量中各元素平方和的开平方)、损失函数的 Taylor 展开一阶项、损失函数的 Taylor 展开二阶项等。LLM-Pruner 采用损失函数的 Taylor 展开来计算重要性,并提出了两条计算组重要性的路径:权重向量级别和单个参数级别。

权重向量级别的重要性公式如下所示, 代表每个神经元的权重向量,H 是 Hessian 矩阵, 表示 next-token prediction loss。一般来说由于模型在训练数据集上已经收敛,即 , 所以一阶项通常为 0 。然而,由于 LLM-Pruner 所用数据集 D 并不是原始训练数据,故 。同时,由于 Hessian 矩阵的计算复杂度过高, 所以只计算了一阶项。

单个参数级别的重要性公式如下所示, 内的每个参数都被独立地评估其重要性,其中 Hessian 矩阵用 Fisher 信息矩阵进行了近似。在 LLM-Pruner 的源码中,这两个公式被如图 3 所示的代码片段表示。

图 3 评估重要性的源码

最后,通过对每组内权重向量或参数的重要性进行累加/累乘/取最大值/取最后一层值,就得到了每组的重要性,再按剪枝率剪去重要性低的组即可。

(3)微调阶段

本阶段的主要工作是使用 LoRA 微调模型中每个可学习的参数矩阵 W,以减轻剪枝带来的性能损失。LoRA 的公式为 W + ∆W = W + BA,其具体步骤如图 4 所示:

① 在模型的特定层中用 Wd×k + ΔWd×k 替换原有的权重矩阵 Wd×k,并把矩阵 ∆Wd×k 分解成降维矩阵 Ad×r 和升维矩阵 Br×k,r << min(d, k)。

② 将 A 随机高斯初始化,B 置为 0,冻结预训练模型的参数 W,只训练矩阵 A 和矩阵 B。

③ 训练完成后,将 B 矩阵与 A 矩阵相乘再与矩阵 W 相加,作为微调后的模型参数。

图 4 LoRA 基本步骤

根据表 3 的实验结果,剪枝 20% 后,模型的性能为原模型的 89.8%,经过 LoRA 微调后,性能可提升至原模型的 94.97%。在大多数数据集上,剪枝后的 5.4B LLaMA 甚至优于 ChatGLM-6B,所以如果需要一个具有定制尺寸的更小的模型,理论上用 LLM-Pruner 剪枝一个比再训练一个成本更低效果更好。

然而,根据表 4 的数据显示,剪枝 50% 后模型表现并不理想,LoRA 微调后综合指标也仅为原模型 77.44%,性能下降幅度较大。如何进行高剪枝率的大模型结构化剪枝,仍是一个具有挑战性的问题。

表 3 LLaMA-7B 剪枝 20% 前后性能对比

表 4 LLaMA-7B 剪枝 50% 前后性能对比

研究进展

大模型剪枝技术已经成为近两年的研究热点,无论是在工业界还是学术界,都有许多研究人员投身于这一领域——这一点从表 5 和表 6 中可以明显看出,而表格中列出的论文只是众多大模型剪枝研究工作中的一小部分。除此之外,还有学者提出了介于结构化剪枝和非结构化剪枝之间的半结构化剪枝,如 Nvidia 的 N:M 稀疏化,就是每 M 个连续元素留下 N 个非零元素,但与前两者相比目前相关探索较少。随着研究的不断深入和技术的持续进步,我们有理由相信,剪枝将继续在大模型领域扮演重要的角色,并推动大模型技术的创新和发展。

表 5 大模型非结构化剪枝

表 6 大模型结构化剪枝

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/59993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单的人脸识别签到程序 python笔记

简单的人脸识别签到程序 这是我自己根据之前的文章《简单的签到程序》修改出来签到程序&#xff0c;还在学习之中&#xff0c;代码还有很多可以优化的地方。 UI代码 有不少地方可以优化一下&#xff0c;但是不想改了。 import PySimpleGUI as sg from MYSQL1 import * impo…

单词反转和数组去重,附经典面试题一份

博彦科技笔试&#xff1a; 给定字符&#xff0c;拼接成单词进行反转单词&#xff1b; package org.example;public class Main {public static void main(String[] args) {char[] input {h, e, l, l, o, , w, o, r, l, d, , J, a, v, a};String inputToString new String(…

【51单片机】UART串口通信原理 + 使用

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 串口硬件电路UART串口相关寄存器 编码单片机通过串口发送数据电脑通过串口发送数据控制LED灯 串口 串口是一种应用十分广泛的通讯接…

构建智能防线 灵途科技光电感知助力轨交全向安全防护

10月27日&#xff0c;在南京南站至紫金山东站间的高铁联络线上&#xff0c;一头野猪侵入轨道&#xff0c;与D5515次列车相撞&#xff0c;导致设备故障停车。 事故不仅造成南京南站部分列车晚点&#xff0c;还在故障排查过程中导致随车机械师因被邻线限速通过的列车碰撞而不幸身…

不使用递归的决策树生成算法

不使用递归的决策树生成算法 利用队列 queue &#xff0c;实现层次遍历&#xff08;广度优先遍历&#xff09;&#xff0c;逐步处理每个节点来建立子树结构。再构建一个辅助队列&#xff0c;将每个节点存储到 nodes_to_process 列表中&#xff0c;以便在树生成完成后可以反向遍…

【PB】 使用for循环,循环次数比较多时,datastore 获取数据异常的问题。

以往在使用datastore时&#xff0c;不注意及时销毁&#xff0c;毕竟一次处理数据&#xff0c;数量很少。 本次碰到一个问题&#xff0c;批量处理数据&#xff0c;for循环次数在1000次左右&#xff0c;每个for循环处理 3 个函数&#xff0c;每个函数中有3-4个datastore&#xff…

自动驾驶系列—自动驾驶如何实现厘米级定位?深入解读GPS/RTK技术与应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

DevOps业务价值流:需求设计最佳实践

DevOps实践正推动着产品快速迭代与高质量交付&#xff0c;但需求设计作为产品开发的关键起点&#xff0c;往往被忽视。它不仅是收集与分析需求的过程&#xff0c;更是将需求转化为可实施产品特性的核心。本文深入探讨DevOps业务价值流中的需求设计&#xff0c;从调研、整理、原…

【MySQL】数据库整合攻略 :表操作技巧与详解

前言&#xff1a;本节内容讲述表的操作&#xff0c; 对表结构的操作。 是对表结构中的字段的增删查改以及表本身的创建以及删除。 ps&#xff1a;本节内容本节内容适合安装了MySQL的友友们进行观看&#xff0c; 实操更有利于记住哦。 目录 创建表 查看表结构 修改表结构 …

python可视化进阶

引用&#xff1a; 首先需要安装 plotnine from plotnine import* import joypy数据可视化进阶操作 3.1 类别数据可视化 【例3-1】——绘制简单条形图 【代码框3-1】——绘制简单条形图 # 图3-1的绘制代码 import pandas as pd import matplotlib.pyplot as plt from cvxpy …

使用 GitHub Actions 部署到开发服务器的详细指南

使用 GitHub Actions 部署到开发服务器的详细指南 在本篇博客中&#xff0c;我们将介绍如何使用 GitHub Actions 实现自动化部署&#xff0c;将代码从 GitHub 仓库的 dev 分支自动部署到开发服务器。通过这种方式&#xff0c;可以确保每次在 dev 分支推送代码时&#xff0c;服…

反汇编命令学习以及分析越界和空指针问题

1,反汇编命令行 (1)move 语法格式:mov destination, source例如: mov eax,0x1 ;将立即数1复制到eax寄存器。立即数到寄存器mov [ebx],eax ;将eax寄存器的值复制到ebx寄存器指向的内存地址,寄存器到内存mov eax,ebx ;将ebx寄存器的值复制到eax,寄存器到寄存器mov ea…

冒泡选择法(c基础)

适合对象c语言初学者。 冒泡选择法 作用对一个数组进行排序。&#xff08;介绍一下数组(c基础)(详细版)-CSDN博客&#xff09; 核心要点 1: 数组元素个数 sz 2: 比较后的交换。 核心思路 进行&#xff08;sz - 1&#xff09;趟&#xff0c;每一趟把最大数的放到末尾。其…

Shell脚本语法随笔

文章目录 1、编写 Shell 脚本文件1_脚本结构2_示例3_执行脚本 2、变量的定义与使用1_定义变量2_只读变量3_接受用户输入4_删除变量名5_变量作用域 3、字符串处理1_双引号 vs 单引号2_示例 4、条件判断&运算符1_数值比较2_case示例3_算数运算符4_逻辑运算符5_字符串运算符6_…

量子计算及其在密码学中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 量子计算及其在密码学中的应用 量子计算及其在密码学中的应用 量子计算及其在密码学中的应用 引言 量子计算概述 定义与原理 发展…

【论文笔记】Wings: Learning Multimodal LLMs without Text-only Forgetting

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Wings: Learning Multimod…

数据类型底层

计算机的工作原理 CPU 找数据 数据通过地址信息来标记 高级语言:在内存中"分配"空间用变量来标识 所以变量一定是存在地址的 例如: int a10; //a就是变量名用来对地址进行标识 0x100对这个地址标识必备常识:8bit1byte 常见的数据类型: char short int long //…

【Leecode】Leecode刷题之路第45天之跳跃游戏II

题目出处 45-跳跃游戏II-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 45-跳跃游戏II-官方解法 这道题是典型的贪心算法&#xff0c;通过局部最优解得到全局最优解。以下两种方法都是…

【Allure】mac下环境配置

安装 1.Mac 可以使用 brew 安装 allure&#xff0c;安装命令如下 brew install allure 2.与 pytest 结合需要安装 allure-pytest 插件&#xff1a; pip install allure-pytest3.查看allure版本 allure --version

conan2 c/c++包管理菜鸟入门

以官网教程为例。 首先下载官网示例&#xff1a; git clone https://github.com/conan-io/examples2.git cd examples2/tutorial/consuming_packages/simple_cmake_project 然后进入该示例教程 先 conan profile detect 检测一下当前编译器环境是否配置&#xff0c; 然后…