使用 🤗 Optimum Intel 在 Xeon 上加速 SetFit 推理

TL;DR

Hugging Face 已经展示,SetFit 模型通过 🤗 Optimum Intel 库的后训练静态量化,在 Intel Xeon CPU 上可实现 推理吞吐量提升最高 7.8 倍。此优化使得少样本学习模型能够以生产级别部署,并且对准确率的影响极小。

SetFit:高效的 Few-Shot 学习

SetFit 是一个专为少样本微调 Sentence Transformers 而设计的框架,专注于解决标记训练数据有限的挑战。相较于基于大型语言模型(LLM)的方法,它提供了两个主要优势:

  • 消除 Prompt:不同于需要脆弱、手工编写 Prompt 的 LLM 上下文学习,SetFit 直接从少量标记示例生成嵌入。
  • 训练效率:SetFit 的训练和推理速度通常比 GPT-3.5 或 Llama 2 等 LLM 快一个数量级。

在性能方面,使用 5 次样本时,SetFit 已被证明在 3-shot 提示下优于 GPT-3.5,并且在 Banking 77 金融意图数据集上优于 3-shot GPT-4。

使用 🤗 Optimum Intel 加速推理

为了在 Intel CPU 上加速 SetFit 推理,Hugging Face 使用 Optimum Intel,这是一款开源库,利用 Intel 的高级向量扩展 512(AVX-512)、向量神经网络指令(VNNI)和高级矩阵扩展(AMX)。这些硬件加速在每个核心中都内置了 BFloat16(bf16)和 int8 GEMM 加速器。

后训练静态量化 (PTQ)

核心优化技术是通过 Intel Neural Compressor(INC)实现的 后训练静态量化(PTQ)。量化通过降低权重和激活的位数(例如,将高精度数值转换为 INT8),从而减少内存占用并加速计算。

PTQ 尤其有效,因为它在无需额外训练的情况下降低延迟和内存使用,只需一个小规模的未标记校准集(通常约 100 条样本)即可代表未见数据的分布。

基准测试与性能结果

使用 bge-small 模型在 sst2 数据集上进行性能评估,比较原始 PyTorch/Transformers fp32 实现、IPEX-bfloat16 版本以及量化的 Optimum-int8 版本。

延迟与模型大小

在 batch size 为 1 时,优化后的 Optimum-int8 模型展示了显著提升:

  • 延迟降低:延迟降低了 3.45 倍(4.55 ms 对比 fp32 模型的 15.69 ms)。
  • 模型大小缩减:模型大小缩小了 2.85 倍(44.65 MB 对比 127.32 MB)。
  • 准确率保持:准确率几乎未变,从 88.4%(fp32)降至 88.1%(int8)。

吞吐量提升

虽然延迟提升已相当可观,但最显著的收益体现在吞吐量上。对比不同 batch size 下的最高可达吞吐量,Optimum-int8 模型的速度是原始 transformers fp32 模型的 7.8 倍

指标 bge-small (transformers) bge-small (ipex-bfloat16) bge-small (optimum-int8)
模型大小 127.32 MB 63.74 MB 44.65 MB
准确率(测试集) 88.4% 88.4% 88.1%
延迟(bs=1) 15.69 +/- 0.57 ms 5.67 +/- 0.66 ms 4.55 +/- 0.25 ms

实现工作流

要实现这些优化,过程包括两个主要步骤:

  1. 量化:使用 optimum.intel 中的 INCQuantizer,并将 PostTrainingQuantConfig 设置为 “static” 方法和 “ipex” 后端。
  2. 部署:使用 IPEXModel 包装量化后的模型主体,并将其集成到 SetFit 模型结构中进行推理。

Sources