cpu推理|使用英特尔sapphirerapids加速pytorchtransformers(代码片段)

HuggingFace博客 HuggingFace博客     2023-02-24     781

关键词:

最近的一篇文章 中,我们介绍了代号为 Sapphire Rapids 的第四代英特尔至强 CPU 及其新的先进矩阵扩展 (AMX) 指令集。通过使用 Amazon EC2 上的 Sapphire Rapids 服务器集群并结合相应的英特尔优化库,如 英特尔 PyTorch 扩展 (IPEX),我们展示了如何使用 CPU 进行高效的分布式大规模训练,与上一代至强 (Ice Lake) 相比,Sapphire Rapids 实现了 8 倍的加速,取得了近线性的扩展比。

本文我们将重点关注推理。使用基于 PyTorch 的 Hugging Face transformers 模型,我们首先在 Ice Lake 服务器上分别测量它们在长、短两种文本序列上的性能。然后,我们在 Sapphire Rapids 服务器和最新版本的 Hugging Face Optimum Intel 上执行相同的测试,并比较两代 CPU 的性能。这里,Optimum Intel 是一个专用于英特尔平台的硬件加速开源库。

让我们开始吧!

为什么你应该考虑使用 CPU 推理

在决定使用 CPU 还是 GPU 进行深度学习推理时需要考虑多个因素。最重要的当然是模型的大小。一般来说,较大的模型能更多地受益于 GPU 提供的强大算力,而较小的模型可以在 CPU 上高效运行。

另一个需要考虑的因素是模型和推理任务本身的并行度。GPU 为大规模并行处理而设计,因此它们可能对那些可以高度并行化的任务更高效。而另一方面,如果模型或推理任务并没有特别高的并行度,CPU 可能是更有效的选择。

成本也是一个需要考虑的重要因素。GPU 可能很昂贵,而使用 CPU 可能是一种性价比更高的选择,尤其是在业务应用并不需要极低延迟的情况下。此外,如果你需要能够轻松扩缩推理实例的数量,或者如果你需要能够在各种平台上进行推理,使用 CPU 可能是更灵活的选择。

现在,让我们开始配置我们的测试服务器。

配置我们的测试服务器

和上一篇文章一样,我们将使用 Amazon EC2 实例:

  • 一个基于 Ice Lake 架构 c6i.16xlarge 实例,
  • 一个基于 Sapphire Rapids 架构的 r7iz.16xlarge-metal 实例。你可以在 AWS 网站上获取有关新 r7iz 系列的更多信息。

两个实例都有 32 个物理核 (因此有 64 个 vCPU)。我们将用相同的方式来设置它们:

  • Ubuntu 22.04 和 Linux 5.15.0 (ami-0574da719dca65348),
  • PyTorch 1.13 与 IPEX (Intel Extension for PyTorch) 1.13,
  • Transformers 4.25.1。

唯一的区别是在 r7iz 实例上我们多装一个 Optimum Intel 库。

以下是设置步骤。像往常一样,我们建议使用虚拟环境来保证环境纯净。

sudo apt-get update

# 安装 libtcmalloc,获取更好性能
sudo apt install libgoogle-perftools-dev -y
export LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libtcmalloc.so"

sudo apt-get install python3-pip -y
pip install pip --upgrade
export PATH=/home/ubuntu/.local/bin:$PATH
pip install virtualenv
virtualenv inference_env
source inference_env/bin/activate

pip3 install torch==1.13.0 -f https://download.pytorch.org/whl/cpu
pip3 install intel_extension_for_pytorch==1.13.0 -f https://developer.intel.com/ipex-whl-stable-cpu
pip3 install transformers

# 仅需在 r7iz 实例上安装
pip3 install optimum [intel]

在两个实例上完成上述步骤后,我们就可以开始运行测试了。

对流行的 NLP 模型进行基准测试

在这个例子中,我们将在文本分类任务上对几个 NLP 模型进行基准测试: distilbert-base-uncased, bert-base-uncasedroberta-base。你可以在 Github 上找到 完整脚本。当然,你也可以用你自己的模型随意尝试!

models = ["distilbert-base-uncased", "bert-base-uncased", "roberta-base"]

我们使用序列长度分别为 16 和 128 的两种句子来测试,同时我们也将在这两种句子上分别测量单句推理和批量推理的平均预测延迟和 p99 预测延迟。该测试方案模拟了真实场景,因此可以较好地近似在真实场景中的预期加速比。

sentence_short = "This is a really nice pair of shoes, I am completely satisfied with my purchase"
sentence_short_array = [sentence_short] * 8

sentence_long = "These Adidas Lite Racer shoes hit a nice sweet spot for comfort shoes. Despite being a little snug in the toe box, these are very comfortable to wear and provide nice support while wearing. I would stop short of saying they are good running shoes or cross-trainers because they simply lack the ankle and arch support most would desire in those type of shoes and the treads wear fairly quickly, but they are definitely comfortable. I actually walked around Disney World all day in these without issue if that is any reference. Bottom line, I use these as the shoes they are best; versatile, inexpensive, and comfortable, without expecting the performance of a high-end athletic sneaker or expecting the comfort of my favorite pair of slippers."
sentence_long_array = [sentence_long] * 8

基准测试功能非常简单。在几次预热迭代后,我们使用 pipeline API 运行 1000 次预测,把预测时间存下来,并计算它们的均值和 p99 值。

import time
import numpy as np

def benchmark (pipeline, data, iterations=1000):
    # 预热 100 次
    for i in range (100):
        result = pipeline (data)
    times = []
    for i in range (iterations):
        tick = time.time ()
        result = pipeline (data)
        tock = time.time ()
        times.append (tock - tick)
    return ":.2f".format (np.mean (times) * 1000), ":.2f".format (
        np.percentile (times, 99) * 1000
    )

在 c6i (Ice Lake) 实例上,我们只使用普通的 Transformers pipeline

from transformers import pipeline

for model in models:
    print (f"Benchmarking model")
    pipe = pipeline ("sentiment-analysis", model=model)
    result = benchmark (pipe, sentence_short)
    print (f"Transformers pipeline, short sentence: result")
    result = benchmark (pipe, sentence_long)
    print (f"Transformers pipeline, long sentence: result")
    result = benchmark (pipe, sentence_short_array)
    print (f"Transformers pipeline, short sentence array: result")
    result = benchmark (pipe, sentence_long_array)
    print (f"Transformers pipeline, long sentence array: result")

在 r7iz (Sapphire Rapids) 实例上,我们同时使用普通 pipeline 和 Optimum pipeline。在 Optimum pipeline 中,我们启用 bfloat16 模式以利用到 AMX 指令,并将 jit 设置为 True 以使用即时编译进一步优化模型。

   import torch
	from optimum.intel import inference_mode
	
	with inference_mode (pipe, dtype=torch.bfloat16, jit=True) as opt_pipe:
	    result = benchmark (opt_pipe, sentence_short)
	    print (f"Optimum pipeline, short sentence: result")
	    result = benchmark (opt_pipe, sentence_long)
	    print (f"Optimum pipeline, long sentence: result")
	    result = benchmark (opt_pipe, sentence_short_array)
	    print (f"Optimum pipeline, short sentence array: result")
	    result = benchmark (opt_pipe, sentence_long_array)
	    print (f"Optimum pipeline, long sentence array: result")

为简洁起见,我们先看下 distilbert-base-uncased 的 p99 结果。你可以在文章末尾找到所有测例的完整结果。

如上图所示,与上一代至强 CPU 相比,Sapphire Rapids 上单个句子的预测延迟加速了 60-65%。也就是说,由于结合了英特尔 Sapphire Rapids 平台以及 Hugging Face Optimum 的优化,你只需对代码进行很少改动就可将预测速度提高 3 倍。

这让我们即使在长文本序列上也可以达到 个位数的预测延迟。在 Sapphire Rapids 之前,这样的性能只有通过 GPU 才能实现。

结论

第四代英特尔至强 CPU 提供了出色的推理性能,尤其是在与 Hugging Face Optimum 结合使用时。这是深度学习在更易得和更具成本效益的道路上的又一个进步,我们期待与英特尔的朋友们在这条道路上继续合作。

以下是一些可帮助你入门的其他资源:

如果你有任何问题或反馈,我们很乐意在 Hugging Face 论坛 上与你交流。

感谢阅读!

附录: 完整结果

基准测试软件环境:

  • Ubuntu 22.04 with libtcmalloc
  • Linux 5.15.0 patched for Intel AMX support
  • PyTorch 1.13 with Intel Extension for PyTorch
  • Transformers 4.25.1
  • Optimum 1.6.1
  • Optimum Intel 1.7.0.dev0

英文原文: https://hf.co/blog/intel-sapphire-rapids-inference

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

审校、排版: zhongdongy (阿东)

ncnn模型推理详解及实战(代码片段)

...Linux系统终端下输入以下命令,查看cpu架构。uname-m#我的英特尔服务器输出x86_64,m1pro苹果电脑输出arm64OpenMPOpenMP(OpenMulti-Processing)是一种基于共享内存的并行编程API,用于编写多线程并行程序。使用OpenMP,程序员可以通过在程... 查看详情

yolov5labview+openvino让你的yolov5在cpu上飞起来

...能感受丝滑的实时物体识别。一、OpenVINO是什么OpenVINO是英特尔针对自家硬件平台开发的一套深度学习工具库,用于快速部署应用和解决方案,包含推断库,模型优化等等一系列与深度学习模型部署相关的功能。特点&#... 查看详情

coreml 推理结果与 cpu 和 gpu 不同

】coreml推理结果与cpu和gpu不同【英文标题】:coremlinferenceresultsaredifferentwithcpuandgpu【发布时间】:2020-05-0713:27:32【问题描述】:操作系统:macosCatalina10.15.2xcode:11.3coreml3.0我将相同的模型输入提供给相同的mlmodel。但是使用cpu设备和... 查看详情

cpu也能速刷alphafold2?英特尔:请收下这份23倍通量优化指南

丰色明敏发自凹非寺量子位|公众号QbitAI搅翻计算生物界的AlphaFold2一开源,各种加速方案就争相涌现。妹想到啊,现在居然有了个CPU的推理优化版本,不用GPU,效果也出人意料的好——端到端的通量足足提升到原... 查看详情

如何访问英特尔 CPU 计数器

】如何访问英特尔CPU计数器【英文标题】:HowcaniaccesstheIntelCPUCounter【发布时间】:2009-08-1213:30:18【问题描述】:是否有任何小工具可以让我访问英特尔CPU计数器收集的数据(例如L1/L2缓存未命中、分支预测失败……您知道现代Cor... 查看详情

使用多处理池在 python 中加速 TFLite 推理

】使用多处理池在python中加速TFLite推理【英文标题】:speedupTFLiteinferenceinpythonwithmultiprocessingpool【发布时间】:2020-03-0319:47:42【问题描述】:我在玩tflite,并在我的多核CPU上观察到它在推理期间没有受到太大压力。我通过预先使... 查看详情

英特尔、amd、英伟达,三大厂商同台竞技混合gpu+cpu

...果说英伟达的GraceCPU超级芯片的架构是CPU+GPU是巧合,那么英特尔和AMD推出的FalconShoresXPU芯片、InstinctMI300芯片同样是CPU+GPU结构时,CPU+GPU一体的架构就很难称之为巧合了。更为“碰巧”的是,以上三种芯片其都是用于数据中心的场... 查看详情

cpu的主要规格

...-7700K[1]为例说明CPU的主要规格(AMD和Intel类似)一、代号 英特尔使用内部代码名称来识别正在开发中尚未向公众发布的产品(和服务)。  一旦英特尔产品向公众公布,它将以商业名称(例如,奔腾处理器)代替。 从定义可... 查看详情

英特尔重磅发布全新数据中心处理器,为数字经济发展增添新动力

...正式推出第四代英特尔®至强®可扩展处理器(代号“SapphireRapids”)、英特尔®至强®CPUMax系列(代号“Sapphir 查看详情

英特尔cpu是至强系列好还是酷睿系列好?

参考技术A英特尔CPU是至强系列好还是酷睿系列好?看具体型号,至强型号比酷睿I5和I7加起来还多。有跟I5和I7性能接近的型号。有核心数远超I7的型号。游戏还是I7更胜一些,至强针对服务器,普遍多核心,低主频。普遍游戏优... 查看详情

使用 Keras 在 GPU 上进行推理

】使用Keras在GPU上进行推理【英文标题】:InferenceonGPUwithKeras【发布时间】:2020-10-2506:30:10【问题描述】:我正在尝试使用我的RTX2060Super对Keras进行预测。由于某种原因,它似乎在我的CPU上运行。这是我用于调试的测试脚本:import... 查看详情

linux6.2已正式发布

...OnDemand驱动程序现在状态良好,适用于第4代Xeon可扩展“SapphireRapids”CPU。其次,Linux6.2初步支持NVIDIAGeForceRTX30系列“Ampere”“使用Nouveau开源代码加速图形,AppleM1Pro/M1Max/M1Ultra支持已上游化。已合并深度呼叫跟踪,可帮助英特尔Sky... 查看详情

linux6.2已正式发布

...OnDemand驱动程序现在状态良好,适用于第4代Xeon可扩展“SapphireRapids”CPU。其次,Linux6.2初步支持NVIDIAGeForceRTX30系列“Ampere”“使用Nouveau开源代码加速图形,AppleM1Pro/M1Max/M1Ultra支持已上游化。已合并深度呼叫跟踪,可帮助英特尔Sky... 查看详情

训练期间 642% 的 CPU 与 GPU 一起使用。正常吗? [关闭]

...间】:2021-04-1818:58:21【问题描述】:我的电脑配置为CPU:英特尔酷睿i79700K@3.60GhzGPU:英伟达GeForceGTX1060当我使用tensorflow-gpu进行训练时,我的CPU和GPU都会被使用。这是正 查看详情

win11安装win11启用tpm2.0的华硕主板m10h使用英特尔cpu设置ptt解决方案全记录

TPM2.0Win11安装的前提是必须启用TPM2.0,所以我们必须开启TPM2.0才可以安装Win11。本机配置主板华硕ROGM10HCPUi78700K设置BIOS开机按F2进入BIOS界面,选择高级->PCH-FWConfiguration点进去的第一个下拉菜单选择PTT保存设置并重新开机... 查看详情

英特尔0000@2.00ghz四核是啥cup

...,说是台湾版外销产品,淘宝买的到了用鲁大师测试CUP是英特尔0000@2.00GHZ四核,这款是i7处理器不知道怎么测试出门时这个,是不是假的啊,性能也不知道好不好是CPU-ES版本。ES版,就是EngineeringSample(这是Intel官网的定义,不是... 查看详情

获取 CPU 或主板序列号?

...Linux。【问题讨论】:安装的网卡的MAC地址呢?请记住,英特尔“处理器序列号”功能仅在Pentium3和一些TransmetaCPU中实现 查看详情

英特尔cpu型号详解

挤了十年牙膏的牙膏厂,第十一代酷睿该何去何从?您的浏览器不支持HTML5视频zymedia(\'video\')参考技术A市场上的主板和cpu也是五花八门,琳琅满目,CPU大大小小的型号、等级、主频、睿频、超频,这些都代表什么意思,有什么用... 查看详情