​在英特尔至强 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 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 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 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())
  • 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 模型在各模态数据上的应用及大规模模型的训练推理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE精炼宝库】计算机是如何工作的

目录 前言: 一、冯诺依曼体系 二、CPU基本知识 2.1 硬盘|内存|CPU关系: 2.2 指令: 2.3 CPU是如何执行指令的(重点): 2.4 小结: 三、编程语言 3.1 程序: 3.2 编程语言发展&a…

游戏全自动打金搬砖,单号收益300+ 轻松日入1000+

详情介绍 游戏全自动打金搬砖,单号收益300左右,多开收益更多,轻松日入1000 可矩阵操作。 项目长期稳定,全自动挂机无需人工操作,小白,宝妈,想做副业的都可以。

【链表-双向链表】

链表-双向链表 1.链表的分类1.1 分类依据1.2 常用类型 2.双向链表的2.1 双向链表的结构2.2 双向链表的操作2.2.1 **初始化**2.2.2 **尾插**2.2.3 **头插**2.2.4 **尾删**2.2.5 **头删**2.2.6 在pos位置之后插入数据2.2.7 删除pos节点2.2.8 查找2.2.9 销毁 1.链表的分类 1.1 分…

翻译技巧早操练-(减译法)

hello,大家好,今天继续来学习翻译的技巧篇第二个-减译法。 往期回顾 翻译早操练-(增译法)-CSDN博客 减译法的目的就是为了译入语表达的通顺,如果原文的一些表达直接翻译到译入语即累赘还不合时宜,那么可以采…

【启明智显技术分享】基于ESP32-S3方案的彩屏固件烧录指南

前言: 【启明智显】专注于HMI(人机交互)及AIoT(人工智能物联网)产品和解决方案的提供商,我们深知彩屏显示方案在现代物联网应用中的重要性。为此,我们一直致力于为客户提供彩屏显示方案相关的技…

主播美颜技术探秘:计算机视觉赋能的直播美颜SDK

今天,我们将深入探讨直播美颜技术背后的计算机视觉原理,以及赋能这一技术的直播美颜SDK。 一、计算机视觉与直播美颜 计算机视觉是一门研究如何使机器“看”的学科,它利用数字图像处理和模式识别等技术,使计算机能够模拟人类视觉…

STL速查

容器 (Containers) 图解容器 支持随机访问 stringarrayvectordeque支持支持支持支持 string 类 构造函数 string(); ------创建一个空的字符串 例如: string str;string(const char* s); ------使用字符串s初始化string(const string& str); ------拷贝构造 赋值操作…

打破次元壁!Stable Diffusion将现实影像转成二次元动画,推特转赞10k+,网友:都可以重做《神奇宝贝》动漫了

破次元壁计划已启动! 就在最近,有网友分享了一个用Stable Diffusion打造二次元动画的工具,直接在网上爆火。 先快来看一波效果。 万物皆可妙化为二次元,耳机也可蜕变成小兔兔: 瞧!连易拉罐的拉环也化身成…

【GPT调用】本地使用python调用GPT接口

python调用GPT接口 环境变量设置主调用方法执行结果 环境变量设置 .env文件中配置GPT环境变量 api_key"你的GPT-API-KEY" urlhttps://ai-proxy.ksord.com/wps.openai.azure.com/openai/deployments/gpt-4-32k/chat/completions?api-version2023-09-01-preview主调…

Oracle SQL Developer导出数据库表结构,表数据,索引以及序列号等对象

通过Oracle SQL Developer软件将指定oralce数据库中的表结构,表数据,索引以及序列号等对象导出成SQL文件。 数据库版本:Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production 软件版本:Oracle SQL Develo…

【千帆平台】使用AppBuilder零代码创建应用,Excel表格数据转为Markdown格式文本

欢迎来到《小5讲堂》 这是《千帆平台》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言创建应用应用名称应用描述应用头像角色指令组件能力开场白推…

【Python】一道字典题目

题目:输入一段文本,统计每个字符的个数 in_inputinput(“输入:”) dic{} for char in in_input: if char in dic: dic[char]1 # 字典添加键值对的方法,给字典给键和值的方法 else: dic[char]1 print(dic) 输出台:

构建一个快速数据分析(boruta+shap+rcs)的shiny APP

构建一个快速数据分析(borutashaprcs)的shiny APP 之前提出了一个快速数据分析的流程,包括: 变量筛选,使用Boruta等变量筛选的方法来找出相关的变量;发现规律,使用SHAP分析的散点图、交互作用图…

如何使用Python下载哔哩哔哩(Bilibili)视频字幕

在本文中,我将向大家展示如何使用Python下载哔哩哔哩(Bilibili)视频的字幕。通过这个方法,你可以轻松地获取你喜欢的视频的字幕文件,方便学习和交流。 准备工作 在开始之前,我们需要安装一些必要的库&…

第一个C++项目

文章目录 一、新建项目1.打开软件,选择“创建新项目”2.新建项目栏中,按自己的需求来设置项目模板,项目名称和文件存放位置,设置好后点击“确认”3. 点击“Next”4. 按照自己需求设置,设置完后,点击“Next”…

【Linux 性能详解】CPU性能篇

目录 平均负载(Load Average) CPU上下文切换 进程上下文切换 线程上下文切换 中断上下文切换 中断 硬中断 软中断 CPU使用率 性能分析工具 平均负载(Load Average) 平均负载?这个词对很多人来说&#xff0c…

【新三个数排序的自创算法,这是我厉年来很满意的一次排序算法设计,最好小于O(N)最坏O((NN/3)/2)。】2024-5-7

缘由如何用C&#xff0b;&#xff0b;解决一下问题_编程语言-CSDN问答 int a[]{1, 4, 7, 8, 5, 2, 3, 6, 9, 7}, n 10, x n, jh 0, j 0;px:if (j < n) {//缘由https://ask.csdn.net/questions/8099444if (--x < 2 j)x n - 1, j 3;if (x < n - 1 && a[x…

【强训笔记】day14

NO.1 思路&#xff1a;用一个哈希表&#xff0c;先遍历s1&#xff0c;统计哈希表内的字符个数&#xff0c;在遍历s2&#xff0c;s2中的字符在哈希表中减去&#xff0c;如果哈希表中的字符个数小于0那么就输出No。 代码实现&#xff1a; #include <iostream> #include&…

湘潭大学数据库作业题完整答案

作业一&#xff1a; 考虑如下所示的关系数据库。这些关系上适当的主码是什么&#xff1f; 职工&#xff08;姓名&#xff0c;街道&#xff0c;城市&#xff09; 工作&#xff08;姓名&#xff0c;公司名&#xff0c;工资&#xff09; 公司&#xff08;公司名&#xff0c;城市&a…

UVa1376/LA3661 Animal Run

UVa1376/LA3661 Animal Run 题目链接题意输入格式输出格式 分析AC 代码 题目链接 UVA - 1376 Animal Run 题意 由于控制程序出了 bug&#xff0c;动物园的笼子无缘无故被打开&#xff0c;所有动物展开了一次大逃亡。整个城市是一个网格&#xff0c;另外每个单位方格都有一条从…