翻译原文:Large Transformer Model Inference Optimization | Lil'Log 原文作者:Lilian Weng
目录
- 方法概述
- 蒸馏 Distillation
- 量化 Quantization
- Transformer 量化的挑战
- 训练后量化 (PTQ)
- 混合精度量化 Mixed-precision quantization
- 细粒度量化
- 量化的二阶信息
- 异常值平滑
- 量化感知训练 (QAT)
- 修剪 Pruning
- 如何修剪?
- 如何重新训练?
- 稀疏性 Sparsity
- 通过修剪实现 N:M 稀疏性
- 稀疏化 Transformer
- 混合专家 MoE Mixture-of-Experts
- 路由策略改进
- 内核改进
- 架构优化
- 稀疏注意模式 Sparse Attention
- 循环 Recurrence
- 内存节省设计
- 自适应注意 Adaptive Attention
- 引用
- 参考文献
[Updated on 2023-01-24: add a small section on Distillation.]
大型Transformer模型如今已成为主流,可为各种任务创建SoTA结果。它们功能强大,但训练和使用成本非常高。极高的推理成本(无论是时间成本还是内存成本)是采用强大的 Transformer 大规模解决现实世界任务的一大瓶颈。
为什么大型 Transformer 模型很难运行推理?除了 SoTA 模型的规模不断扩大外,还有两个主要因素导致了推理挑战(Pope 等人,2022 年):
1. 内存占用大。推理时,模型参数和中间状态都需要存储在内存中。例如,
- KV cache应在解码时存储在内存中;例如,对于批处理大小为 512 且上下文长度为 2048 的情况,KV cache总计 3TB,即模型大小的 3 倍(!).
- 注意力机制的推理成本与输入序列长度成二次方关系。
2. 可并行性低。推理生成以自回归方式执行,使解码过程难以并行化。
在这篇文章中,我们将研究几种使 Transformer 推理更高效的方法。一些是通用的网络压缩方法,而另一些则特定于 Transformer 架构。
方法概述
我们通常将以下内容视为模型推理优化的目标:
- 通过使用更少的 GPU 设备和更少的 GPU 内存来减少模型的内存占用;
- 通过降低所需的 FLOPs 数量来降低所需的计算复杂度;
- 减少推理延迟并加快运行速度。
可以使用多种方法使推理在内存中更便宜或/和在时间上更快。
- 应用各种并行性以在大量 GPU 上扩展模型。模型组件和数据的智能并行性使运行数万亿个参数的模型成为可能。
- 内存卸载将暂时未使用的数据卸载到 CPU 并在以后需要时读回它们。这有助于减少内存使用,但会导致更高的延迟。
- 智能批处理策略;例如,EffectiveTransformer 将连续序列打包在一起以在一个批次中去除填充padding.
- 网络压缩技术,例如修剪、量化、蒸馏。就参数数量或位宽而言,较小尺寸的模型需要的内存更少,运行速度更快。
- 针对目标模型架构的改进。许多架构变化(尤其是针对注意力层的架构变化)有助于提高 Transformer 解码速度。
查看上一篇关于大型模型训练的文章,了解不同类型的训练并行性和节省内存的设计,包括 CPU 内存卸载。这篇文章重点介绍网络压缩技术和针对 Transformer 模型的架构特定改进。
蒸馏
知识蒸馏 (KD;Hinton 等人 2015 年,Gou 等人 2020 年) 是一种构建更小、更便宜的模型(“学生模型”)的直接方法,通过将技能从预先训练的昂贵模型(“教师模型”)转移到学生身上来加快推理速度。对于如何构建学生架构没有太多限制,除了与教师匹配的输出空间以构建适当的学习目标。
给定一个数据集,通过蒸馏损失训练学生模型来模仿老师的输出。通常神经网络有一个softmax层;例如,LLM输出token的概率分布。我们将softmax之前的logits层分别表示为Zt和Zs,分别用于教师和学生模型。蒸馏损失用较高的温度T最小化两个softmax输出之间的差异。当已知基本事实ground truth标签y时,我们可以将其与基本事实和学生的soft logits之间的监督学习目标相结合,例如使用交叉熵。
其中是一个超参数,用于平衡软学习目标和硬学习目标。
一个常见选择是 KL 散度/交叉熵。
一个成功的早期试验是 DistilBERT(Sanh 等人,2019 年),它能够将 BERT 的参数减少 40%,同时在微调的下游任务上保持 BERT 97% 的性能,并且运行速度提高 71%。预训练 DistilBERT 的损失是软蒸馏损失、监督训练损失(即 BERT 情况下的掩蔽语言建模损失)和特殊余弦嵌入损失的组合,用于对齐教师和学生之间的隐藏状态向量。
蒸馏可以轻松地与量化、修剪或稀疏化技术相结合,其中教师模型是原始的全精度密集模型,而学生被量化、修剪pruned或修剪trimmed以具有更高的稀疏度。
量化
在深度神经网络上应用量化有两种常见方法:
- 训练后量化 (PTQ):首先训练模型以使其收敛,然后将其权重转换为较低精度而无需更多训练。与训练相比,它通常实施起来相当便宜。
- 量化感知训练 (QAT):量化应用于预训练或进一步微调。QAT 能够获得更好的性能,但需要额外的计算资源和对代表性训练数据的访问。
我们应该意识到理论最佳量化策略与硬件内核支持之间的差距。由于 GPU 内核缺乏对某些类型的矩阵乘法(例如 INT4 x FP16)的支持,因此并非以下所有方法都能加速实际推理。
Transformer 量化的挑战
许多关于 Transformer 模型量化的研究都有相同的观察结果:简单的低精度(例如 8 位)训练后量化会导致性能显着下降,这主要是由于激活的动态范围高,而简单的激活量化策略无法保持容量。