最近的一篇文章 中,我们介绍了代号为 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 (阿东)

CPU推理|使用英特尔 Sapphire Rapids 加速 PyTorch Transformers的更多相关文章

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

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

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

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

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

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

  4. 面向英特尔® x86 平台的 Unity* 优化指南: 第 1 部分

    原文地址 目录 工具 Unity 分析器 GPA 系统分析器 GPA 帧分析器 如要充分发挥 x86 平台的作用,您可以在项目中进行多种性能优化,以最大限度地提升性能. 在本指南中,我们将展示 Uni ...

  5. [转帖]英特尔的 ME 或侵犯 Minix3 的自由软件许可证

    英特尔的 ME 或侵犯 Minix3 的自由软件许可证 [日期:2017-12-11] 来源:Linux公社  作者:非非然 [字体:大 中 小] https://www.linuxidc.com/L ...

  6. 英特尔® 图形性能分析器(Intel® GPA)

    英特尔图形性能分析器概述 英特尔 GPA 是一套软件工具,它能提供平台级游戏性能分析功能,优化应用性能. 英特尔 GPA 包含以下组件: 英特尔 GPA 监控器 - 将英特尔 GPA 连接至应用(处于 ...

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

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

  8. 国产CPU走到十字路口:谁来取代英特尔芯片?(少写了一个OpenPower)

    国内的几支CPU研发力量各自选择的指令体系都有自己的优点和问题,选择其中的哪一支都会有对应的成本和风险.最终谁能担大任,且拭目以待. 文 | 瞭望智库特约科技观察员 王强 用上内置国产CPU的个人电脑 ...

  9. 【硬件】- 英特尔CPU命名中的产品线后缀

    产品线后缀是CPU命名体系里最复杂最难懂的,在英特尔冗长的产品线中,CPU的后缀也是千变万化.不带后缀的CPU一般就是最普通的桌面级处理器,不管是性能还是价格都比较中庸,比如当前性价比较高的Core  ...

  10. 【硬件】- 英特尔CPU命名规则

    前言 一款Intel CPU的命名,一般由5个部分组成:品牌,品牌标识符,Gen标识,SKU数值,产品线后缀. 以下图为例: 品牌 英特尔旗下处理器有许多子品牌,包括我们熟悉的凌动(ATOM).赛扬( ...

随机推荐

  1. Ubuntu 20.04 开启局域网唤醒(WoL)

    打开主板相关设置 创建 systemd 自启动设置文件 vim /etc/systemd/system/wol@.service 放入以下内容: [Unit] Description=Wake-on- ...

  2. 微信小程序-敏感内容检测 文本过滤 图片检测 https

    一.获取access_token wx.request({ url: 'https://api.weixin.qq.com/cgi-bin/token', method : 'GET', data : ...

  3. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-35-处理web页面定位toast-上篇

    1.简介 在使用appium写app自动化的时候介绍toast的相关元素的定位,在Web UI测试过程中,也经常遇到一些toast(出现之后一闪而过,不留下一点点痕迹),那么这个toast我们这边如何 ...

  4. ELT安装

    前言: ETL是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程, 目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提供分析依据, ETL是BI(商业智能)项目重要的一个 ...

  5. Mongodb数据增删改查

    RDB:数据库 → 表(列) → 行 Mongo:数据库 → 集合 → 文档 SQL和Mongodb的关系映射表(里面还有一些增删改查等等操作与SQL的对应的语句): https://www.mong ...

  6. 数字孪生结合GIS能给物流行业带来怎样的改变

    随着科技的不断发展和创新,数字孪生技术和地理信息系统(GIS)正日益在各个行业中发挥重要作用.其中,物流行业作为一个复杂而庞大的系统,也能从数字孪生和GIS的结合中获得许多益处和改变. 数字孪生是指通 ...

  7. 万界星空科技电子电器装配行业云MES解决方案

    电子电器装配属于劳动密集型.科技含量较高的行业,产品零部件种类繁多,生产组装困难,生产过程存在盲点,同时也决定了生产流水线多且对自动化水平要求较高. 万界星空科技提供的电子行业解决方案,从仓储管理.生 ...

  8. beanshell导入java文件

    beanshell导入java文件 beanshell可以读取class格式的文件 步骤: a.添加BeanShell预处理程序 b.请求调用 beanshell可以读取java格式的文件 步骤: a ...

  9. 新报: 根据IP获取物理地址不需要调用接口啦

    一. 复制data文件夹到自己的项目当中 可以进行加载到这个文件即可 博主放入在项目的根目录当中 请移步Gitee pull 该文件 https://gitee.com/yangbuyi/ip_fil ...

  10. 【经典问题】mysql和redis数据一致性问题

    前言 MySQL和Redis数据一致性算是个很经典的问题,在之前也看到过很多相关的文章,最近心血来潮,想把一致性问题的解决方案和存在问题都总结一下. 不推荐方案 1 先更新MySQL,再更新Redis ...