在缺少标注数据场景,SetFit 是解决的建模问题的一个有前途的解决方案,其由 Hugging Face 与 Intel 实验室 以及 UKP Lab 合作共同开发。作为一个高效的框架,SetFit 可用于对 Sentence Transformers 模型进行少样本微调。

SetFit 仅需很少的标注数据就能达到较高的准确率,例如,在使用 3-示例提示时,SetFit 优于 GPT-3.5;在使用 5-示例提示时,其在 Banking 77 金融意图数据集上的表现也优于使用 3-示例提示的 GPT-4。

与基于 LLM 的方法相比,SetFit 有两个独特的优势:

无需提示或词-标签映射器:基于 LLM 的少样本上下文学习依赖于人工制作的提示,其对措辞比较敏感,且依赖用户的专业知识,因此效果比较脆弱。SetFit 直接从少量标注文本样本中生成丰富的嵌入,从而完全省去了提示。

训练速度快:SetFit 不依赖 GPT-3.5 或 Llama2 等 LLM 来实现高准确率。因此,训练和推理速度通常要快一个数量级(或更多)。

有关 SetFit 的更多详情,请参阅:论文博客代码及相关数据

Setfit 已被 AI 开发者社区广泛采用,每月下载量约为 10 万次,Hub 上的 SetFit 模型已有 1600 个之多,且平均日增量约为 4 个左右。

加速!

本文,我们将解释如何用 Optimum Intel 优化你的 SetFit 模型,从而在英特尔 CPU 上实现 7.8x 的推理加速。我们还将展示如何轻松对模型进行训后量化,从而实现巨大的吞吐增益。有了这些技术,用户可在英特尔至强 CPU 上部署生产级的 SetFit 解决方案。

Optimum Intel 是一个开源库,可在英特尔硬件上对由 Hugging Face 库构建的端到端流水线进行加速。 Optimum Intel 实现了多种模型加速技术,如低比特量化、模型权重剪枝、蒸馏以及运行时加速。

Optimum Intel 的运行时及各种优化都充分利用了英特尔 AVX-512、矢量神经网络指令 (VNNI) 以及最新的英特尔 先进矩阵扩展(英特尔 AMX)以对模型进行极致加速。具体来说,英特尔在每个 CPU 核中都内置了 bfloat16 (bf16) 和 int8 GEMM 加速器,以加速深度学习训练和推理工作负载。尤其值得一提的是,PyTorch 2.0 和 Intel Extension for PyTorch (IPEX) 中加入了 AMX 优化以进一步加速推理及训练。

使用 Optimum Intel 可以轻松对各种预训练模型进行加速,你可在此处找到很多例子。本文也附有一个 notebook 版,可供大家逐步演练。

第 1 步:使用 Optimum Intel 量化 SetFit 模型

在对 SetFit 模型进行优化时,我们会使用英特尔神经压缩器 (INC) 对模型进行量化,其已集成入 Optimum Intel。

量化是一种非常流行的深度学习模型优化技术,可用于提高推理速度。它通过将一组高精度数值转换为较低位宽的数据类型(如 INT8)。从而最大限度地降低神经网络的权重和/或激活所需的位数。另外,由于位宽较低,其计算速度也可能会更快。

本文,我们将使用训后静态量化(PTQ)。PTQ 仅需少量未标注校准数据,无需任何训练即可在保持模型的准确性的同时减低推理时的内存占用并降低延迟。首先请确保你已安装所有必要的库,同时确保 Optimum Intel 版本至少为 1.14.0(因为 PTQ 功能是从该版本开始引入的):

pip install --upgrade-strategy eager optimum[ipex]

准备校准数据集

校准数据集应能在数据分布上较好代表未见数据。一般来说,准备 100 个样本就足够了。在本例中,我们使用的是 rotten_tomatoes 数据集,其是一个电影评论数据集,与我们的目标数据集 sst2 类似。

首先,我们从该数据集中随机加载 100 个样本。然后,为了准备量化数据集,我们需要对每个样本进行标注。我们不需要 textlabel 列,因此将其删除。

calibration_set = load_dataset("rotten_tomatoes", split="train").shuffle(seed=42).select(range(100)) 

def tokenize(examples):
return tokenizer(examples["text"], padding="max_length", max_length=512, truncation=True) tokenizer = setfit_model.model_body.tokenizer
calibration_set = calibration_set.map(tokenize, remove_columns=["text", "label"])

量化

量化前,先要配置所需的量化方案,本例中为静态训后量化,再使用 optimum.intel 在校准数据集上运行量化:

from optimum.intel import INCQuantizer
from neural_compressor.config import PostTrainingQuantConfig setfit_body = setfit_model.model_body[0].auto_model
quantizer = INCQuantizer.from_pretrained(setfit_body)
optimum_model_path = "/tmp/bge-small-en-v1.5_setfit-sst2-english_opt"
quantization_config = PostTrainingQuantConfig(approach="static", backend="ipex", domain="nlp") quantizer.quantize(
quantization_config=quantization_config,
calibration_dataset=calibration_set,
save_directory=optimum_model_path,
batch_size=1,
)
tokenizer.save_pretrained(optimum_model_path)

就这样!现在,我们有了一个量化版的 SetFit 模型。下面,我们对其进行测试。

第 2 步:推理基准测试

我们在 notebook 中写了一个 PerformanceBenchmark 类,用于计算模型延迟和吞吐量,并用于测量模型准确度。我们现在用它来对以下三种配置进行基准测试:

  • 使用 PyTorch Transformers 库对 fp32 模型进行推理。
  • 使用 Intel Extension for PyTorch (IPEX) 对模型进行 bf16 推理,同时使用 TorchScript 对模型进行图优化。
  • 使用 Optimum Intelint8 量化模型进行推理。

加载测试数据集 sst2,并使用 PyTorch 和 Transformers 库运行基准测试:

from datasets import load_dataset
from setfit import SetFitModel
test_dataset = load_dataset("SetFit/sst2")["validation"] model_path = "dkorat/bge-small-en-v1.5_setfit-sst2-english"
setfit_model = SetFitModel.from_pretrained(model_path)
pb = PerformanceBenchmark(
model=setfit_model,
dataset=test_dataset,
optim_type="bge-small (transformers)",
)
perf_metrics = pb.run_benchmark()

第二个基准测试,我们将使用 bf16 精度和 TorchScript 两种优化手段,并使用 IPEX 优化库。要使用 IPEX,我们只需导入 IPEX 库并对模型应用 ipex.optimize(),在本例中,目标模型是 SetFit 的模型体:

dtype = torch.bfloat16
body = ipex.optimize(setfit_model.model_body, dtype=dtype)

使用 TorchScript 进行图优化时,我们根据模型的最大输入长度生成随机序列,并从分词器的词汇表中采样词汇:

tokenizer = setfit_model.model_body.tokenizer
d = generate_random_sequences(batch_size=1, length=tokenizer.model_max_length, vocab_size=tokenizer.vocab_size) body = torch.jit.trace(body, (d,), check_trace=False, strict=False)
setfit_model.model_body = torch.jit.freeze(body)

最后,我们对量化的 Optimum 模型运行基准测试。我们首先定义一个 SetFit 模型的包装类,该包装类在推理时会自动插入量化模型体(而不是原始模型体)。然后,我们用这个包装类跑基准测试。

from optimum.intel import IPEXModel

class OptimumSetFitModel:
def __init__(self, setfit_model, model_body):
model_body.tokenizer = setfit_model.model_body.tokenizer
self.model_body = model_body
self.model_head = setfit_model.model_head optimum_model = IPEXModel.from_pretrained(optimum_model_path)
optimum_setfit_model = OptimumSetFitModel(setfit_model, model_body=optimum_model) pb = PerformanceBenchmark(
model=optimum_setfit_model,
dataset=test_dataset,
optim_type=f"bge-small (optimum-int8)",
model_path=optimum_model_path,
autocast_dtype=torch.bfloat16,
)
perf_metrics.update(pb.run_benchmark())

结果

精度与延迟关系图(batch size=1)

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

batch size 为 1 时,我们的优化模型将延迟降低了 3.45 倍。请注意,此时准确率几乎没有下降!另外值得一提的是,模型大小缩小了 2.85x

我们将焦点转向不同 batch size 下的吞吐量。这里,我们获得了更大的加速。如果比较最高吞吐量(不限 batch size),优化后的模型比原始 transformers fp32 模型高 7.8 倍!

总结

本文,我们展示了如何使用 Optimum Intel 中的量化功能来优化 SetFit 模型。在轻松快速地对模型完成训后量化后,我们观察到在准确度损失很小的情况下,推理吞吐量增加了 7.8 倍。用户可以使用这种优化方法在英特尔至强 CPU 上轻松部署任何现有 SetFit 模型。

参考文献

  • Lewis Tunstall, Nils Reimers, Unso Eun Seo Jo, Luke Bates, Daniel Korat, Moshe Wasserblat, Oren Pereg, 2022. "Efficient Few-Shot Learning Without Prompts". https://arxiv.org/abs/2209.11055

英文原文: https://hf.co/blog/setfit-optimum-intel

原文作者:Daniel Korat,Tom Aarsen,Oren Pereg,Moshe Wasserblat,Ella Charlaix,Abirami Prabhakaran

译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。

在英特尔至强 CPU 上使用 🤗 Optimum Intel 实现超快 SetFit 推理的更多相关文章

  1. 基于英特尔® 至强™ 处理器 E5 产品家族的多节点分布式内存系统上的 Caffe* 培训

    原文链接 深度神经网络 (DNN) 培训属于计算密集型项目,需要在现代计算平台上花费数日或数周的时间方可完成. 在最近的一篇文章<基于英特尔® 至强™ E5 产品家族的单节点 Caffe 评分和 ...

  2. [转帖]迎战AMD 7nm 64核EPYC 英特尔至强也玩起了胶水以及性价比

    迎战AMD 7nm 64核EPYC 英特尔至强也玩起了胶水以及性价比 Intel 最强CPU 从最开始的双核 到现在的 28核 发展迅猛. https://www.cnbeta.com/article ...

  3. 英特尔与 Facebook 合作采用第三代英特尔® 至强® 可扩展处理器和支持 BFloat16 加速的英特尔® 深度学习加速技术,提高 PyTorch 性能

    英特尔与 Facebook 曾联手合作,在多卡训练工作负载中验证了 BFloat16 (BF16) 的优势:在不修改训练超参数的情况下,BFloat16 与单精度 32 位浮点数 (FP32) 得到了 ...

  4. 基于英特尔® 至强 E5 系列处理器的单节点 Caffe 评分和训练

    原文链接 在互联网搜索引擎和医疗成像等诸多领域,深度神经网络 (DNN) 应用的重要性正在不断提升. Pradeep Dubey 在其博文中概述了英特尔® 架构机器学习愿景. 英特尔正在实现 Prad ...

  5. 【转帖】漏洞数量242:15,英特尔和AMD CPU谁更安全?

    漏洞数量242:15,英特尔和AMD CPU谁更安全? http://www.eetop.cn/cpu_soc/6946340.html 越来越多的用户开始怀疑哪种处理器可以最好地保护他们的计算机,数 ...

  6. 英特尔® 至强® 平台集成 AI 加速构建数据中心智慧网络

    英特尔 至强 平台集成 AI 加速构建数据中心智慧网络 SNA 通过 AI 方法来实时感知网络状态,基于网络数据分析来实现自动化部署和风险预测,从而让企业网络能更智能.更高效地为最终用户业务提供支撑. ...

  7. 英特尔 Android* 开发者指南上的对等应用

    简单介绍 当没有 Wi-Fi 訪问点或互联网訪问时,Android* 应用可能须要对等连接在两台或多台 Android* 设备之间建立连接. 比方,文件共享应用和多人游戏. 该功能可使用 NFC.蓝牙 ...

  8. 使用英特尔 Sapphire Rapids 加速 PyTorch Transformers 模型

    大约一年以前,我们 展示 了如何在第三代 英特尔至强可扩展 CPU (即 Ice Lake) 集群上分布式训练 Hugging Face transformers 模型.最近,英特尔发布了代号为 Sa ...

  9. 在英特尔 CPU 上加速 Stable Diffusion 推理

    前一段时间,我们向大家介绍了最新一代的 英特尔至强 CPU (代号 Sapphire Rapids),包括其用于加速深度学习的新硬件特性,以及如何使用它们来加速自然语言 transformer 模型的 ...

  10. 现代英特尔® 架构上的 TensorFlow* 优化——正如去年参加Intel AI会议一样,Intel自己提供了对接自己AI CPU优化版本的Tensorflow,下载链接见后,同时可以基于谷歌官方的tf版本直接编译生成安装包

    现代英特尔® 架构上的 TensorFlow* 优化 转自:https://software.intel.com/zh-cn/articles/tensorflow-optimizations-on- ...

随机推荐

  1. KingbaseES 等待事件之LWLock lock_manager

    背景 相信我们不止一次遇到过一个等待事件:LWLock lock_manager.下面我们聊聊这个等待事件的含义,产生原因,以及解决方法. 等待事件含义 当数据库维护共享锁的内存区域以在无法实现以fa ...

  2. HarmonyOS SDK,赋能开发者实现更具象、个性化开发诉求

    随着移动互联网的逐步成熟,用户的需求越来越细化.鸿蒙生态为开发者提供的HarmonyOS SDK开放能力,高效赋能美团外卖等合作伙伴实现更具象.个性化的开发诉求,给用户提供更丰富便捷的体验. 点击链接 ...

  3. 实验1产品原型设计-YHealth健康APP

    一.实验题目:原型设计 二.实验目的:掌握产品原型设计方法和相应工具使用. 三.实验要求: (1)对比分析墨刀.Axure.Mockplus等原型设计工具的各自的适用领域及优缺点 --墨刀 适用领域: ...

  4. 重新整理数据结构与算法(c#系列)—— 树的前中后序遍历查找[十七]

    前言 树的前中后序遍历 是根据前中后序的顺序来查找,找到了则弹出. 正文 节点模型: public class HeroNode { private int no; private string na ...

  5. Typora图床配置(Typora+PicGo+Github)

    Typora图床配置(Typora+PicGo+Github) 一.Github配置 登录github:https://github.com/ 新建仓库 生成私人令牌 Settings->Dev ...

  6. 吴恩达机器学习课后作业ex1

    题目大体意思就是输入的是某地的人口,输出的是某地方的收益. 题目及数据集下载: https://wwa.lanzous.com/b054sprza 密码:ba3w 大体模型如下图:现在X前边加一列值为 ...

  7. APISIX 简单的自定义插件开发步骤

    本文基于 APISIX 3.2 版本进行插件开发并运行通过. APISIX 目前开发插件比较简单,只需要编写 Lua 源代码并放到默认的插件目录下,然后通过配置文件开启插件即可,我们如果使用 Dock ...

  8. 力扣142(Java)-环形链表Ⅱ(中等)

    题目: 给定一个链表的头节点  head ,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示 ...

  9. 力扣612(MySQL)-平面上的最近距离(中等)

    题目: 表 point_2d 保存了所有点(多于 2 个点)的坐标 (x,y) ,这些点在平面上两两不重合.写一个查询语句找到两点之间的最近距离,保留 2 位小数. 最近距离在点 (-1,-1) 和( ...

  10. 力扣299(java)-猜数字游戏(中等)

    题目: 你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下: 写出一个秘密数字,并请朋友猜这个数字是多少.朋友每猜测一次,你就会给他一个包含下述信息的提示: 猜测数字中有多少 ...