共计 4153 个字符,预计需要花费 11 分钟才能阅读完成。
引言
近来,随着 BigCode 的 StarCoder 以及 Meta AI 的 Code Llama 等诸多先进模型的公布,代码生成模型变得煊赫一时。同时,业界也涌现出了大量的致力于优化大语言模型 (LLM) 的运行速度及易用性的工作。咱们很快乐可能分享咱们在英特尔至强 CPU 上优化 LLM 的最新后果,本文咱们次要关注 StarCoder 这一风行的代码生成 LLM。
StarCoder 模型是一个专为帮忙用户实现各种编码工作而设计的先进 LLM,其可用于代码补全、谬误修复、代码摘要,甚至依据自然语言生成代码片段等用处。StarCoder 模型是 StarCoder 模型家族的一员,该系列还有 StarCoderBase。这些代码大模型 (代码 LLM) 应用 GitHub 上的许可代码作为训练数据,其中涵盖了 80 多种编程语言、Git 提交、GitHub 问题以及 Jupyter Notebook。本文,咱们将 8 比特、4 比特量化以及 辅助生成 联合起来,在英特尔第四代至强 CPU 上对 StarCoder-15B 模型实现了 7 倍以上的推理减速。
欢送到 Hugging Face Spaces 上尝试咱们的 演示利用,其运行在第四代英特尔至强可扩大处理器上。
第 1 步: 基线与评估办法
首先,咱们在 PyTorch 和 Intel Extension for PyTorch (IPEX) 上运行 StarCoder (15B),并将其作为基线。
至于评估办法,目前已有不少数据集可用于评估主动代码补全的品质。本文,咱们应用风行的 [Huggingface.co/datasets/openai_humaneval] 数据集来评估模型的品质和性能。HumanEval 由 164 个编程问题组成,其内容为函数接口及其对应的函数性能的文档字符串,须要模型基于此补全函数体的代码。其提醒的均匀长度为 139。咱们应用 Bigcode Evaluation Harness 运行评估并报告 pass@1 指标。咱们通过测量 HumanEval 测试集上的首词元提早 (Time To First Token,TTFT) 和每词元提早 (Time Per Output Token,TPOT) 来度量模型性能,并报告均匀 TTFT 和 TPOT。
第四代英特尔至强处理器内置人工智能加速器,称为英特尔® 高级矩阵扩大 (Intel® Advanced Matrix Extensions,英特尔® AMX) 指令集。具体来说,其在每个 CPU 核中内置了 BFloat16 (BF16) 和 Int8 GEMM 加速器,以减速深度学习训练和推理工作负载。AMX 推理减速已集成入 PyTorch 2.0 及 Intel Extension for PyTorch (IPEX),同时这两个软件还针对其余 LLM 中常见的操作 (如层归一化、SoftMax、缩放点积等) 进行了更多的优化。
咱们应用 PyTorch 和 IPEX 对 BF16 模型进行推理,以确定基线。图 1 展现了模型推理提早的基线,表 1 展现了提早及其对应的准确率。
LLM 量化
LLM 中的文本生成是以自回归的形式进行的,因而在生成每个新词元时都须要把整个模型从内存加载到 CPU。咱们发现内存 (DRAM) 和 CPU 之间的带宽是词元生成的最大性能瓶颈。量化是缓解这一问题的通用办法,其可减小模型尺寸,进而缩小模型权重加载工夫。
本文,咱们关注两种量化办法:
- 仅权重量化 (Weight Only Quantization,WOQ) – 仅量化模型的权重,但不量化激活值,且应用高精度 (如 BF16) 进行计算,因而在计算时须要对权重进行反量化。
- 动态量化 (Static Quantization,SQ) – 对权重和激活都进行量化。量化过程包含通过校准事后计算量化参数,从而使得计算可能以较低精度 (如 INT8) 执行。图 2 所示为 INT8 动态量化的计算流程。
第 2 步: 8 比特量化 (INT8)
SmoothQuant 是一种训后量化算法,其能以最小的精度损失把 LLM 量化至 INT8。因为激活的特定通道存在大量异样值,惯例动态量化办法在 LLM 上体现不佳。这是因为激活是按词元量化的,因而惯例动态量化会导致大的激活值截断以及小的激活值下溢。SmoothQuant 算法通过引入预量化解决了这个问题,其引入了一个额定的平滑缩放因子,将其利用于激活和权重能达到平滑激活中的异样值的作用,从而最大化量化阶数的利用率。
咱们利用 IPEX 对 StarCoder 模型进行 SmoothQuant 量化。咱们应用 MBPP 的测试子集作为校准数据集,并基于此生成了 Q8-StarCoder。评估表明,Q8-StarCoder 绝对于基线没有精度损失 (事实上,甚至还有轻微的改良)。在性能方面,Q8-StarCoder 的 TTFT 有 ~2.19x 的减速,TPOT 有 ~2.20x 的减速。图 3 展现了 Q8-StarCoder 与 BF16 基线模型的提早 (TPOT) 比照。
第 3 步: 4 比特量化 (INT4)
只管与 BF16 相比,INT8 将模型尺寸减小了 2 倍 (每权重 8 比特,之前每权重 16 比特),但内存带宽依然是最大的瓶颈。为了进一步缩小模型的内存加载工夫,咱们应用 WOQ 将模型的权分量化为 4 比特。请留神,4 比特 WOQ 须要在计算之前反量化回 16 比特 (图 4),这意味着存在额定的计算开销。
张量级的非对称最近舍入 (Round To Nearest,RTN) 量化是一种根本的 WOQ 技术,但它常常会面临精度升高的挑战。这篇论文 (Zhewei Yao,2022) 表明对模型权重进行分组量化有助于放弃精度。为了防止精度降落,咱们沿输出通道将若干个间断值 (如 128 个) 分为一组,对分组后的数据执行 4 比特量化,并按组计算缩放因子。咱们发现分组 4 比特 RTN 在 HumanEval 数据集上足以放弃 StarCoder 的准确性。与 BF16 基线相比,4 比特模型的 TPOT 有 3.35 倍 的减速 (图 5),但因为在计算之前须要将 4 比特反量化为 16 比特,该操作带来的额定开销使得其 TTFT 呈现了 0.84 倍的加速 (表 1),这也是合乎预期的。
首词元和后续词元的性能瓶颈不同
生成首词元时会波及到对整个输出提醒的并行处理,当提醒长度很长时,须要大量的计算资源。因而,计算成为这一阶段的瓶颈。此时,与基线 (以及引入反量化计算开销的 4 比特 WOQ) 相比,将精度从 BF16 切至 INT8 能进步性能。然而,从第二个词元开始,零碎需以自回归的形式逐个生成剩下的词元,而每新生成一个词元都须要从内存中再次加载模型。此时,内存带宽变成了瓶颈,而不再是可执行操作数 (FLOPS),此时 INT4 优于 INT8 和 BF16。
第 4 步: 辅助生成 (Assisted Generation,AG)
另一种能进步推理提早、缓解内存带宽瓶颈的办法是 辅助生成 (Assisted Generation,AG),其实际上是 投机解码 的一种实现。AG 通过更好地均衡内存和计算来缓解上述压力,其基于如下假如: 更小、更快的辅助草稿模型生成的词元与更大的指标模型生成的词元重合的概率比拟高。
AG 先用小而快的草稿模型基于贪婪算法生成 K 个候选词元。这些词元的生成速度更快,但其中一些可能与原始指标模型的输入词元不统一。因而,下一步,指标模型会通过一次前向流传并行查看所有 K 个候选词元的有效性。这种做法放慢了解码速度,因为并行解码 K 个词元的提早比自回归生成 K 个词元的提早要小。
为了减速 StarCoder,咱们应用 bigcode/tiny_starcoder_py 作为草稿模型。该模型与 StarCoder 架构类似,但参数量仅为 164M – 比 StarCoder 小 ~95 倍,因而速度更快。为了实现更大的减速,除了量化指标模型之外,咱们还对草稿模型进行了量化。咱们对草稿模型和指标模型均试验了两种量化计划: 8 比特 SmoothQuant 和 4 比特 WOQ 量化。评估结果表明,对草稿模型和指标模型均采纳 8 比特 SmoothQuant 量化失去的减速最大: TPOT 减速达 ~7.30 倍 (图 6)。
咱们认为该后果是正当的,剖析如下:
- 草稿模型量化: 当应用 164M 参数的 8 比特量化 StarCoder 作为草稿模型时,大部分权重均可驻留在 CPU 缓存中,内存带宽瓶颈失去缓解,因为在生成每个词元时无需反复从内存中读取模型。此时,已不存在内存瓶颈,所以进一步量化为 4 比特意义已不大。同时,与量化为 4 比特 WOQ 的 StarCoder-164M 相比,咱们发现量化为 8 比特的 StarCoder-164M 减速比更大。这是因为,4 比特 WOQ 尽管在内存带宽成为瓶颈的状况下具备劣势,因为它的内存占用较小,但 其会带来额定的计算开销,因为须要在计算之前执行 4 比特到 16 比特的反量化操作。
- 指标模型量化: 在辅助生成场景下,指标模型须要解决草稿模型生成的 K 个词元序列。通过指标模型一次性 (并行) 对 K 个词元进行推理,而不是一个一个程序地进行自回归解决,工作负载已从内存带宽瓶颈型转变成了计算瓶颈型。此时,咱们察看到,应用 8 比特量化的指标模型比应用 4 比特模型减速比更高,因为从 4 比特到 16 比特的反量化会产生额定的计算开销。
StarCoder | 量化计划 | 精度 | HumanEval (pass@1) | TTFT (ms) | TTFT 减速 | TPOT (ms) | TPOT 减速 |
---|---|---|---|---|---|---|---|
基线 | 无 | A16W16 | 33.54 | 357.9 | 1.00x | 181.0 | 1.00x |
INT8 | SmoothQuant | A8W8 | 33.96 | 163.4 | 2.19x | 82.4 | 2.20x |
INT4 | RTN (g128) | A16W4 | 32.80 | 425.1 | 0.84x | 54.0 | 3.35x |
INT8 + AG | SmoothQuant | A8W8 | 33.96 | 183.6 | 1.95x | 24.8 | 7.30x |
表 1: 在英特尔第四代至强处理器上测得的 StarCoder 模型的准确率及提早
英文原文: https://hf.co/blog/intel-starcoder-quantization
原文作者: Ofir Zafrir,Ella Charlaix,Igor Margulis,Daniel Korat,Jonathan Mamou,Guy Boudoukh,Oren Pereg,Moshe Wasserblat,Haihao Shen,Ahmad Yasin,Fan Zhao
译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的利用及大规模模型的训练推理。