在 最近的一篇文章 中,我们介绍了代号为 Sapphire Rapids 的第四代英特尔至强 CPU 及其新的先进矩阵扩展 (AMX) 指令集。通过使用 Amazon EC2 上的 Sapphire Rapids 服务器集群并结合相应的英特尔优化库,如 英特尔 PyTorch 扩展 (IPEX),我们展示了如何使用 CPU 进行高效的分布式大规模训练,与上一代至强 (Ice Lake) 相比,Sapphire Rapids 实现了 8 倍的加速,取得了近线性的扩展比。
英特尔 PyTorch 扩展 (IPEX) 项目地址:https://github.com/intel/intel-extension-for-pytorch
(资料图片)
本文我们将重点关注推理。使用基于 PyTorch 的 Hugging Face transformers 模型,我们首先在 Ice Lake 服务器上分别测量它们在长、短两种文本序列上的性能。然后,我们在 Sapphire Rapids 服务器和最新版本的 Hugging Face Optimum Intel 上执行相同的测试,并比较两代 CPU 的性能。这里,Optimum Intel 是一个专用于英特尔平台的硬件加速开源库。
Hugging Face Optimum Intel 仓库地址:https://github.com/huggingface/optimum-intel
让我们开始吧!
在决定使用 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 库。
以下是设置步骤。像往常一样,我们建议使用虚拟环境来保证环境纯净。
在两个实例上完成上述步骤后,我们就可以开始运行测试了。
在这个例子中,我们将在文本分类任务上对几个 NLP 模型进行基准测试: distilbert-base-uncased, bert-base-uncased 和 roberta-base。你可以在 Github 上找到 完整脚本。当然,你也可以用你自己的模型随意尝试!
distilbert-base-uncased 介绍:https://hf.co/distilbert-base-uncased
bert-base-uncased 介绍:https://hf.co/bert-base-uncased
roberta-base 介绍:https://hf.co/roberta-base
原作者在 GitHub 公开的基准测试脚本:https://gist.github.com/juliensimon/7ae1c8d12e8a27516e1392a3c73ac1cc
我们使用序列长度分别为 16 和 128 的两种句子来测试,同时我们也将在这两种句子上分别测量单句推理和批量推理的平均预测延迟和 p99 预测延迟。该测试方案模拟了真实场景,因此可以较好地近似在真实场景中的预期加速比。
基准测试功能非常简单。在几次预热迭代后,我们使用 pipeline
API 运行 1000 次预测,把预测时间存下来,并计算它们的均值和 p99 值。
在 c6i (Ice Lake) 实例上,我们只使用普通的 Transformers pipeline
。
在 r7iz (Sapphire Rapids) 实例上,我们同时使用普通 pipeline
和 Optimum pipeline
。在 Optimum pipeline
中,我们启用 bfloat16
模式以利用到 AMX 指令,并将 jit
设置为 True
以使用即时编译进一步优化模型。
为简洁起见,我们先看下 distilbert-base-uncased 的 p99 结果。你可以在文章末尾找到所有测例的完整结果。
如上图所示,与上一代至强 CPU 相比,Sapphire Rapids 上单个句子的预测延迟加速了 60-65%。也就是说,由于结合了英特尔 Sapphire Rapids 平台以及 Hugging Face Optimum 的优化,你只需对代码进行很少改动就可将预测速度提高 3 倍。
这让我们即使在长文本序列上也可以达到 个位数的预测延迟。在 Sapphire Rapids 之前,这样的性能只有通过 GPU 才能实现。
第四代英特尔至强 CPU 提供了出色的推理性能,尤其是在与 Hugging Face Optimum 结合使用时。这是深度学习在更易得和更具成本效益的道路上的又一个进步,我们期待与英特尔的朋友们在这条道路上继续合作。
以下是一些可帮助你入门的其他资源:
英特尔 IPEX GitHubhttps://github.com/intel/intel-extension-for-pytorch
Hugging Face Optimum GitHubhttps://github.com/huggingface/optimum
如果你有任何问题或反馈,我们很乐意在 Hugging Face 论坛上与你交流。
在线论坛地址:https://discuss.huggingface.co/
感谢阅读!
基准测试软件环境:
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
英文原文: Accelerating PyTorch Transformers with Intel Sapphire Rapids, part 2:https://hf.co/blog/intel-sapphire-rapids-inference
原文作者: Julien Simon
译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。
审校、排版: zhongdongy (阿东)