Why we need to compress LLMs?

LLM在多种任务上表现优异,这种优势的原因之一在于其巨大的参数量.

以GPT-3 175B为例,其参数量高达1750亿,如果以FP16精度进行存储,在部署和推理阶段需要320GB内存,这使得LLM的部署和推理代价极高,难以实现广泛应用.为了实现LLM的应用,需要减少LLM的参数量,降低LLM的推理时内存占用与推理时间,所以需要对LLM进行模型压缩. ## Methods to compress LLMs? 目标: - 使得模型在轻量级设备上可以存储运行,这里的轻量级设备包括个人级PC以及移动设备 - 使得模型提升推理速度/降低推理延迟 - 实现速度、内存、表现的trade-off

阶段: - 推理优化 - 训练优化

方法: - 剪枝 - 知识蒸馏 - 模型量化 - 低秩分解

剪枝

剪枝方法可以视作移除网络中对于输出贡献较小的组件,可以减少存储需求,提高计算效率

  1. 非结构化剪枝 非结构化剪枝在去除参数时没有考虑模型本身的结构,简单的说,可以认为单纯对每个参数的值进行评判,如果\(\vert \text{value}\vert< \text{threshold}\)则将该参数的值置\(0\).

    非结构化剪枝存在的问题:

    • 没有考虑到模型的实际结构,以对卷积神经网络的剪枝为例,假设在一个\(3\times 3\)的卷积核之中某一参数绝对值很小,且其他的参数绝对值很大不可忽略,这会导致剪枝过程只将一个值置为\(0\),模型之中会出现不规则的稀疏结构,需要额外设计结构对其进行存储,另一方面,同以卷积神经网络为例,即使将卷积核内的一个参数设为\(0\),也要对整个卷积核进行运算,并没有降低运算量
    • 剪枝过后可能需要finetune,本身LLM的训练成本就很高,再进行finetune可能会造成更大的成本

    对于LLM的非结构化剪枝的改进:

    • 实现无需finetune的非结构化剪枝
    • 调整参数重要性评判标准,不以数值作为评判标准,而是寻找一个更为合适的评判标准以提高非结构化剪枝的性能
  2. 结构化剪枝 在保持整体网络结构的情况下将部分连接或者分层结构移除,还是以卷积神经网络为例,相当于以卷积核为单位整体移除,这样不必为网络重新设计存储结构,并降低了内存占用和运算复杂度.

  3. Conclusion

    基于剪枝的llm压缩方法与基于剪枝的其他类型方法是基本一致的,重点在于对参数重要性的评估、预定义规则的设定以及如何避免重复训练llm

蒸馏

蒸馏方法是从复杂模型向简单模型转移知识的过程,对于LLM的蒸馏过程统一将LLM作为教师

LLM模型相比于其他类型的模型,不同的一点是LLM模型具有“涌现能力”,即从原始训练数据中自动学习并发现新的、更高层次的特征和模式的能力.根据在蒸馏过程之中是否将涌现能力蒸馏到小语言模型进行分类,可以分为Standard KD和 EA-based KD.

  • Standard KD: 和普通的KD方法一致,只是将LLM作为教师
  • EA-based KD
    • 上下文学习(in-context learning, ICL)ICL采用了一个结构化的自然语言提示,其中包含任务描述和可能的一些演示示例.通过这些任务示例,LLM可以在不需要显式梯度更新的情况下掌握和执行新任务.
    • 思维链 (Chain of Thought, CoT) CoT与ICL相比,在提示中加入了中间推理步骤,这些步骤可以导致最终的输出,而不是使用简单的输入-输出对.
    • 指令跟随 (Instruction Following,IF) IF仅依赖于任务描述而不依赖于少量示例.通过使用一系列以指令形式表达的任务进行微调,语言模型展现出能够准确执行以前未见过的指令描述的任务的能力.

量化

在模型的存储过程之中,采用FP16/FP32进行存储,所需要的内存空间较大,量化方法将复杂的浮点数存储转化为整除存储,如INT8/INT4,量化的方法一定可以降低存储空间占用/推理时内存占用,但是不一定能够实现加速.

根据具体量化操作所在的步骤可以分为三种:

  1. Quantization-Aware Training

    在训练阶段就开始进行量化,使得LLM适应低精度表示,可以在量化之后获得更好的性能.LLM-QAT利用预训练模型生成的结果来实现无数据蒸馏,不仅量化权重和激活,还量化键-值(Key-Value)缓存,并能够将带有量化权重和KV缓存的大型LLaMA模型蒸馏为仅有4位的模型.

  2. Quantization-Aware Finetuning

    在微调过程之中进行量化,确保LLM在微调之后对于任务仍保有较好的性能,是性能保留与节约内存的trade-off.

  3. Post-Training Quantization

    在训练之后对参数进行量化,减少LLM的存储和计算复杂性,实现简单高效,但是会带来精度上的降低.

对于量化问题,关键在于以下几点:

  • 权重参数的重要性评估,对于低影响力的参数,可以选择用低比特存储,除此之外,保护重要权重可以降低量化误差
  • 分层次-分级的量化,对于同一模型,在不同层上,其量化尺度也是不一样的,如何为合适的结果结构选取合适的量化尺度
  • 合适的量化方法,如何尽可能的保持性能
  • 量化的极限在哪里?可使用的最低比特是多少.

低秩分解

低秩分解将权重矩阵\({W}\)分解为两个矩阵的乘积: \[W\in \mathbb{R}^{m\times n}\approx UV,U\in \mathbb{R}^{m\times k},V\in \mathbb{R}^{k\times n}, k\ll m,n\] 参数量由\(mn\)降低至\((m+n)k\).

低秩分解的提出非常的晚,文章发布在ICLR 2022上,精度损失较小,常与其他方法共同使用

KV Cache & Ensemble learning

Evaluation Metrics

  1. Params: 参数量
  2. Model Size: 模型大小,考虑到量化方法的存在,模型大小和参数量并不完全等价
  3. Compression Ratio: 压缩比例
  4. Inference time: 完成推理所需要的时间
  5. FLOPs: 处理数据时所设计浮点操作数目 (FLoating Point Operations)
  6. FLOPS: 每秒完成的浮点操作数目(Floating Point Operations Per Second)

Future Directions

  1. 更为先进的大语言模型压缩方法,压缩的目标是实现速度,大小和精度的trade-off
  2. 动态模型设计,即使用非手动设计的网络结构(如NAS)
  3. 可解释性:设计可解释的LLM网络
  4. Task-specific llm