CPU 推理 | 使用英特爾 Sapphire Rapids 加速 PyTorch Transformers

在?最近的一篇文章?中,我們介紹了代號為 Sapphire Rapids 的第四代英特爾至強 CPU 及其新的先進矩陣擴展 (AMX) 指令集。通過使用 Amazon EC2 上的 Sapphire Rapids 服務器集群并結合相應的英特爾優(yōu)化庫,如?英特爾 PyTorch 擴展 (IPEX),我們展示了如何使用 CPU 進行高效的分布式大規(guī)模訓練,與上一代至強 (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 上執(zhí)行相同的測試,并比較兩代 CPU 的性能。這里,Optimum Intel 是一個專用于英特爾平臺的硬件加速開源庫。
Hugging Face Optimum Intel 倉庫地址:
https://github.com/huggingface/optimum-intel
讓我們開始吧!
為什么你應該考慮使用 CPU 推理
在決定使用 CPU 還是 GPU 進行深度學習推理時需要考慮多個因素。最重要的當然是模型的大小。一般來說,較大的模型能更多地受益于 GPU 提供的強大算力,而較小的模型可以在 CPU 上高效運行。
另一個需要考慮的因素是模型和推理任務本身的并行度。GPU 為大規(guī)模并行處理而設計,因此它們可能對那些可以高度并行化的任務更高效。而另一方面,如果模型或推理任務并沒有特別高的并行度,CPU 可能是更有效的選擇。
成本也是一個需要考慮的重要因素。GPU 可能很昂貴,而使用 CPU 可能是一種性價比更高的選擇,尤其是在業(yè)務應用并不需要極低延遲的情況下。此外,如果你需要能夠輕松擴縮推理實例的數量,或者如果你需要能夠在各種平臺上進行推理,使用 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。
唯一的區(qū)別是在 r7iz 實例上我們多裝一個 Optimum Intel 庫。
以下是設置步驟。像往常一樣,我們建議使用虛擬環(huán)境來保證環(huán)境純凈。
在兩個實例上完成上述步驟后,我們就可以開始運行測試了。
對流行的 NLP 模型進行基準測試
在這個例子中,我們將在文本分類任務上對幾個 NLP 模型進行基準測試: distilbert-base-uncased, bert-base-uncased 和 roberta-base。你可以在 Github 上找到 完整腳本。當然,你也可以用你自己的模型隨意嘗試!
distilbert-base-uncased 介紹:
https://hf.co/distilbert-base-uncasedbert-base-uncased 介紹:
https://hf.co/bert-base-uncasedroberta-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
?以使用即時編譯進一步優(yōu)化模型。
為簡潔起見,我們先看下 distilbert-base-uncased 的 p99 結果。你可以在文章末尾找到所有測例的完整結果。

如上圖所示,與上一代至強 CPU 相比,Sapphire Rapids 上單個句子的預測延遲加速了?60-65%。也就是說,由于結合了英特爾 Sapphire Rapids 平臺以及 Hugging Face Optimum 的優(yōu)化,你只需對代碼進行很少改動就可將預測速度提高 3 倍。
這讓我們即使在長文本序列上也可以達到?個位數的預測延遲。在 Sapphire Rapids 之前,這樣的性能只有通過 GPU 才能實現。
結論
第四代英特爾至強 CPU 提供了出色的推理性能,尤其是在與 Hugging Face Optimum 結合使用時。這是深度學習在更易得和更具成本效益的道路上的又一個進步,我們期待與英特爾的朋友們在這條道路上繼續(xù)合作。
以下是一些可幫助你入門的其他資源:
英特爾 IPEX GitHub
https://github.com/intel/intel-extension-for-pytorchHugging Face?Optimum GitHub
https://github.com/huggingface/optimum
如果你有任何問題或反饋,我們很樂意在 Hugging Face 論壇上與你交流。
在線論壇地址:
https://discuss.huggingface.co/
感謝閱讀!
附錄: 完整結果

基準測試軟件環(huán)境:
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 模型在各模態(tài)數據上的應用及大規(guī)模模型的訓練推理。
審校、排版: zhongdongy (阿東)