​在英特尔至强 CPU 上使用 Optimum Intel 实现超快 SetFit 推理

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

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

  • Intel 实验室https://www.intel.com/content/www/us/en/research/overview.html

  • UKP Labhttps://www.informatik.tu-darmstadt.de/ukp/ukphome/index.en.jsp

  • Sentence Transformershttps://sbert.net/

  • SetFit 优于 GPT-3.5https://arxiv.org/pdf/2311.06102.pdf

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

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

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

有关 SetFit 的更多详情,请参阅:论文、博客、代码及相关数据。Setfit 已被 AI 开发者社区广泛采用,每月下载量约为 10 万次,Hub 上的 SetFit 模型约有1500个,平均日增量约为 4 个!

  • 论文https://arxiv.org/abs/2209.11055

  • 博客https://hf.co/blog/setfit

  • 代码https://github.com/huggingface/setfit

  • 数据https://hf.co/SetFit

  • Hugging Face Hub 上的 SetFit 模型https://hf.co/models?library=setfit

加速!

本文,我们将解释如何用 🤗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 Intelhttps://github.com/huggingface/optimum-intel

  • bfloat16https://en.wikipedia.org/wiki/Bfloat16floating-pointformat

  • Intel Extension for PyTorchhttps://github.com/intel/intel-extension-for-pytorch

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

  • Optimum Intel 案例https://hf.co/docs/optimum/main/en/intel/optimizationinc

  • Notebook 版https://github.com/huggingface/setfit/blob/main/notebooks/setfit-optimum-intel.ipynb

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

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

  • 英特尔神经压缩器https://www.intel.cn/content/www/cn/zh/developer/tools/oneapi/neural-compressor.html

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

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

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

准备校准数据集

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

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

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 PostTrainingQuantConfigsetfit_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 PyTorchhttps://github.com/intel/intel-extension-for-pytorch(IPEX) 对模型进行 bf16 推理,同时使用 TorchScript 对模型进行图优化。

  • 使用 Optimum Intel 对 int8 量化模型进行推理。

加载测试数据集 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 IPEXModelclass OptimumSetFitModel:def __init__(self, setfit_model, model_body):model_body.tokenizer = setfit_model.model_body.tokenizerself.model_body = model_bodyself.model_head = setfit_model.model_headoptimum_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())
  • Notebook 网址https://github.com/huggingface/setfit/blob/main/notebooks/setfit-optimum-intel.ipynb

  • IPEXhttps://github.com/intel/intel-extension-for-pytorch

结果

95ab9f65f6a21cc0d4f5d035b2d4b550.png
精度与延迟关系图 (batch size=1)

bge-small (transformers)bge-small (ipex-bfloat16)bge-small (optimum-int8)
模型大小127.32 MB63.74 MB44.65 MB
测试集准确率88.4%88.4%88.1%
延迟 (bs=1)15.69 +/- 0.57 ms5.67 +/- 0.66 ms4.55 +/- 0.25 ms

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

415363ca7821d750d204d1c545f08107.png

我们将焦点转向不同 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 模型在各模态数据上的应用及大规模模型的训练推理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/687735.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

融资融券概念和操纵流程,案例解析

融资融券是一种金融工具,它允许投资者在证券市场上进行杠杆交易。简单来说,融资就是借钱买股票,融券就是借股票卖出。这种交易方式可以帮助投资者在短期内获得更高的收益,但同时也伴随着较高的风险。 案例背景: 假设…

素数判定的优化

常规写法亲民,高效写法炼人。用素数的基本特性写,易读易懂;用6k1特性写,高效但却得有学过《数论》。 (笔记模板由python脚本于2024年05月09日 19:47:00创建,本篇笔记适合初通Python,熟悉六大基本数据(str字…

打开linux内核的企鹅log

Linux 内核启动的时候可以选择显示小企鹅 logo,只要这个小企鹅 logo 显示没问题那么我 们的 LCD 驱动基本就工作正常了。这个 logo 显示是要配置的,不过 Linux 内核一般都会默认 开启 logo 显示。 打开 Linux内核图形化配置界面,按下路径找到…

【错题集-编程题】最大子矩阵(二维前缀和)

牛客对应题目链接:最大子矩阵_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 ⼆维前缀和矩阵 的应用。 初始化⼆维前缀和矩阵。枚举所有的子矩阵,求出最大子矩阵。 这道题的输入规模最大为 100,用动态规划可以做到 O(n^3)。 下面的做法虽然…

C语言/数据结构——(链表的回文结构)

一.前言 今天在牛客网上刷到了一道链表题——链表的回文结构https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?,巧合的是它的解题思路恰好是我们一起分享过两道链表题的汇总。这两道题分别是反转链表和链表的中间节点。废话不多数&#xff0c…

回炉重造java----单列集合(List,Set)

体系结构: 集合主要分为两种,单列集合collection和双列集合Map,区别在于单列集合一次插入一条数据,而双列的一次插入类似于key-value的形式 单列集合collection 注:红色的表示是接口,蓝色的是实现类 ①操作功能: 增加: add()&am…

Java中的maven的安装和配置

maven的作用 依赖管理 方便快捷的管理项目依赖的资源,避免版本冲突问题 统一项目管理 提供标准,统一的项目结构 项目构建 标准跨平台(Linux、windows、MacOS)的自动化项目构建方式 maven的安装和配置 在maven官网下载maven Ma…

嵌入式学习<2>:EXTI、ADC、NVIC和AFIO

嵌入式学习_part2 本部分笔记用于学习记录,笔记源头 >>b站江科大_STM32入门教程_EXTI EXTI、ADC、NVIC和AFIO 开发环境:keil MDK、STM32F103C8T6 1 )EXTI STM32F10xxx参考手册(中文)-> 中断与事件 ->…

文本三剑客grep与正则表达式、元字符

正则表达式 正则表达式又称为正规表达式、常规表达式、在代码中常简写为regex、regex或RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串的方法,通过一些特殊符号,实现快速查…

OPC-UA open62541 C++测试代码

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 这是之前写的open62541测试代码…

Mac电脑安装打开APP显示问题已损坏 问题解决

当MAC电脑安装完软件打开时,显示文件已损坏,无法打开。搜了很多教程终于找到解决方案,记录下方便以后再用。 我的mac电脑是intel芯片的,如果你遇到这个问题,可以参考我的这个方案。 1.首先当打开软件后出现 “xx软件已…

【话题】你用过最好用的AI工具有那些

大家好,我是全栈小5,欢迎阅读小5的系列文章,这是《话题》系列文章 目录 背景一、C知道二、CSDN工具集三、AI工具的普及与受欢迎程度四、AI工具的实际应用与影响五、总结与展望文章推荐 背景 探讨人们在使用AI工具时,最喜欢的和认…