使用 🤗 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 |
实现工作流
要实现这些优化,过程包括两个主要步骤:
- 量化:使用
optimum.intel中的INCQuantizer,并将PostTrainingQuantConfig设置为 “static” 方法和 “ipex” 后端。 - 部署:使用
IPEXModel包装量化后的模型主体,并将其集成到 SetFit 模型结构中进行推理。