当你听到「剪枝」二字,或许会联想到园丁修整枝叶的情景。而在AI大模型领域,这个词有着特殊的含义——它是一种通过“精简”来提升大模型效率的关键技术。随着GPT、LLaMA等大模型规模的持续膨胀,如何在保持性能的同时降低资源消耗,已成为亟待解决的难题。本文将揭示大模型剪枝技术的原理与发展,带你一次性读懂剪枝。
作者|谭帅
当今大模型的“身躯”越来越庞大,对资源的需求也日益增加。如LLaMA3.1,且不说其训练算力高达24000块H100,训练数据量高达15Ttokens(Qwen2.5在18Ttokens的数据集上进行了预训练,成为目前训练数据最多的开源大模型),单看表1和表2中LLaMA3.1在推理和微调时的内存需求,对普通用户而言就是难以承受之重。这些庞大的需求不仅对硬件资源提出了极高的要求,也限制了模型的可扩展性和实用性。大模型剪枝技术通过减少模型中的参数数量,旨在降低这些需求,同时尽量保持模型的性能。
表1LLaMA3.1推理内存需求(不包括KV缓存)
表2LLaMA3.1微调内存需求
剪枝“流派”的开山鼻祖是图灵奖得主、深度学习“三巨头”之一YannLeCun,他在1989年NeurIPS会议上发表的《OptimalBrainDamage》[1]是第一篇剪枝工作。后来剪枝“流派”逐渐开枝散叶,如今可主要分为两大类:非结构化剪枝和结构化剪枝。非结构化剪枝通过移除单个权重或神经元得到稀疏权重矩阵,这种方法易于实现且性能指标较高,但需要专门的硬件或软件支持来加速模型;结构化剪枝通过去除基于特定规则的连接来实现,如层级剪枝、块级剪枝等,这种方法不需要专门的软硬件支持,但算法更为复杂。
权重向量级别的重要性公式如下所示,代表每个神经元的权重向量,H是Hessian矩阵,表示next-tokenpredictionloss。一般来说由于模型在训练数据集上已经收敛,即,所以一阶项通常为0。然而,由于LLM-Pruner所用数据集D并不是原始训练数据,故。同时,由于Hessian矩阵的计算复杂度过高,所以只计算了一阶项。
单个参数级别的重要性公式如下所示,内的每个参数都被独立地评估其重要性,其中Hessian矩阵用Fisher信息矩阵进行了近似。在LLM-Pruner的源码中,这两个公式被如图3所示的代码片段表示。
图3评估重要性的源码
最后,通过对每组内权重向量或参数的重要性进行累加/累乘/取最大值/取最后一层值,就得到了每组的重要性,再按剪枝率剪去重要性低的组即可。
①在模型的特定层中用Wd×k+ΔWd×k替换原有的权重矩阵Wd×k,并把矩阵Wd×k分解成降维矩阵Ad×r和升维矩阵Br×k,r< ②将A随机高斯初始化,B置为0,冻结预训练模型的参数W,只训练矩阵A和矩阵B。 ③训练完成后,将B矩阵与A矩阵相乘再与矩阵W相加,作为微调后的模型参数。 图4LoRA基本步骤 根据表3的实验结果,剪枝20%后,模型的性能为原模型的89.8%,经过LoRA微调后,性能可提升至原模型的94.97%。在大多数数据集上,剪枝后的5.4BLLaMA甚至优于ChatGLM-6B,所以如果需要一个具有定制尺寸的更小的模型,理论上用LLM-Pruner剪枝一个比再训练一个成本更低效果更好。 然而,根据表4的数据显示,剪枝50%后模型表现并不理想,LoRA微调后综合指标也仅为原模型77.44%,性能下降幅度较大。如何进行高剪枝率的大模型结构化剪枝,仍是一个具有挑战性的问题。