Intel Sapphire Rapidsを使用してPyTorch Transformersを高速化する – パート2
Intel Sapphire Rapidsを使用してPyTorch Transformersを高速化する - パート2 (no change)
最近の投稿では、第4世代のIntel Xeon CPU(コードネーム:Sapphire Rapids)とその新しいAdvanced Matrix Extensions(AMX)命令セットについて紹介しました。Amazon EC2上で動作するSapphire Rapidsサーバーのクラスタと、Intel Extension for PyTorchなどのIntelライブラリを組み合わせることで、スケールでの効率的な分散トレーニングを実現し、前世代のXeon(Ice Lake)に比べて8倍の高速化とほぼ線形スケーリングを達成する方法を紹介しました。
この投稿では、推論に焦点を当てます。PyTorchで実装された人気のあるHuggingFaceトランスフォーマーと共に、Ice Lakeサーバーでの短いおよび長いNLPトークンシーケンスのパフォーマンスを測定します。そして、Sapphire RapidsサーバーとHugging Face Optimum Intelの最新バージョンを使用して同じことを行います。Hugging Face Optimum Intelは、Intelプラットフォームのハードウェアアクセラレーションに特化したオープンソースのライブラリです。
さあ、始めましょう!
CPUベースの推論を検討すべき理由
CPUまたはGPUで深層学習の推論を実行するかどうかを決定する際には、いくつかの要素を考慮する必要があります。最も重要な要素は、モデルのサイズです。一般に、より大きなモデルはGPUによって提供される追加の計算能力からより多くの利益を得ることができますが、より小さいモデルはCPU上で効率的に実行することができます。
考慮すべきもう一つの要素は、モデルと推論タスクの並列性のレベルです。GPUは大規模な並列処理に優れているため、効果的に並列化できるタスクに対してより効率的です。一方、モデルや推論タスクが非常に高いレベルの並列性を持っていない場合、CPUがより効果的な選択肢になる場合があります。
コストも考慮すべき重要な要素です。GPUは高価な場合があり、CPUを使用する方がコスト効果が高い選択肢になることがあります。特にビジネスユースケースが極めて低いレイテンシを必要としない場合は、CPUの使用がより柔軟なオプションになる可能性があります。さらに、推論ワーカーの数を簡単にスケールアップまたはスケールダウンする必要がある場合や、さまざまなハードウェア上で推論を実行できる必要がある場合も、CPUの使用がより柔軟なオプションになる場合があります。
それでは、テストサーバーのセットアップを行いましょう。
テストサーバーのセットアップ
前の投稿と同様に、Amazon EC2インスタンスを使用します:
- Ice Lakeアーキテクチャに基づくインスタンス
- Sapphire Rapidsアーキテクチャに基づくインスタンス。新しいr7izファミリについてはAWSのウェブサイトで詳細を読むことができます。
両方のインスタンスは物理コア数32(したがって、vCPU数は64)を持っています。以下のように同じ方法でセットアップします:
- Linux 5.15.0を搭載したUbuntu 22.04()
- PyTorch 1.13およびIntel Extension for PyTorch 1.13
- Transformers 4.25.1
唯一の違いは、r7izインスタンスにOptimum Intel Libraryを追加することです。
以下はセットアップ手順です。通常のように、きちんと整理するために仮想環境を使用することをおすすめします。
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]
これらの手順を2つのインスタンスで完了したら、テストを実行できます。
人気のあるNLPモデルのベンチマーク
この例では、テキスト分類タスクでいくつかのNLPモデル(distilbert-base-uncased、bert-base-uncased、roberta-base)のベンチマークを行います。完全なスクリプトはGithubで入手できます。ご自身のモデルで試してみてください!
モデル = ["distilbert-base-uncased", "bert-base-uncased", "roberta-base"]
16トークンと128トークンの文を使用して、単一の推論とバッチ推論の平均とp99の予測レイテンシを測定します。これにより、実際のシナリオで期待できる高速化の概要が得られます。
sentence_short = "これは本当に素敵な靴のペアで、購入に完全に満足しています"
sentence_short_array = [sentence_short] * 8
sentence_long = "これらのAdidas Lite Racerシューズは、快適な靴にはちょうどいいスイートスポットをつかんでいます。つま先のボックスが少しきつくても、履いている間はとても快適で、いいサポートを提供しています。これらは、一般的なランニングシューズやクロストレーナーとは言えませんが、そのようなタイプの靴に望まれる足首やアーチのサポートが不足しており、トレッドもかなり早く摩耗しますが、確かに快適です。実際、これらの靴でディズニーワールドを一日中歩き回っても問題ありませんでした。つまり、これらは最高の靴として使っています。汎用性があり、安価で快適であり、高級アスレチックスニーカーのパフォーマンスを期待したり、お気に入りのスリッパの快適さを期待したりすることはありません。"
sentence_long_array = [sentence_long] * 8
ベンチマーク関数は非常にシンプルです。いくつかのウォームアップイテレーションの後、パイプラインAPIで1,000回の予測を実行し、予測時間を記録し、その平均値とp99値を計算します。
import time
import numpy as np
def benchmark(pipeline, data, iterations=1000):
# ウォームアップ
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パイプラインのみを使用します。
from transformers import pipeline
for model in models:
print(f"{model} のベンチマーク")
pipe = pipeline("sentiment-analysis", model=model)
result = benchmark(pipe, sentence_short)
print(f"Transformersパイプライン、短い文: {result}")
result = benchmark(pipe, sentence_long)
print(f"Transformersパイプライン、長い文: {result}")
result = benchmark(pipe, sentence_short_array)
print(f"Transformersパイプライン、短い文の配列: {result}")
result = benchmark(pipe, sentence_long_array)
print(f"Transformersパイプライン、長い文の配列: {result}")
r7iz (Sapphire Rapids)インスタンスでは、バニラパイプラインとOptimumパイプラインの両方を使用します。Optimumパイプラインでは、AMX命令を利用するために<bfloat16モードを有効にします。また、モデルをジャストインタイムコンパイルでさらに最適化するために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パイプライン、短い文: {result}")
result = benchmark(opt_pipe, sentence_long)
print(f"Optimumパイプライン、長い文: {result}")
result = benchmark(opt_pipe, sentence_short_array)
print(f"Optimumパイプライン、短い文の配列: {result}")
result = benchmark(opt_pipe, sentence_long_array)
print(f"Optimumパイプライン、長い文の配列: {result}")
簡潔さのために、distilbert-base-uncasedのp99結果のみを見てみましょう。すべての時間はミリ秒で表されます。詳細な結果は投稿の最後にあります。
上のグラフでわかるように、単一の予測は前世代のXeon CPUと比較して60-65%高速です。言い換えると、Intel Sapphire RapidsとHugging Face Optimumの組み合わせにより、コードをほんのわずかに変更するだけで予測を3倍高速化できます。
これにより、長いテキストシーケンスでも単桁の予測レイテンシを達成できるようになりました。これまでにはGPUのみで可能でした。
結論
インテルの第4世代Xeon CPUは、特にHugging Face Optimumと組み合わせることで優れた推論パフォーマンスを提供します。これは、ディープラーニングをよりアクセスしやすく、コスト効果の高いものにするためのさらなる一歩であり、私たちはインテルとの協力を続けることを楽しみにしています。
以下は、始めるのに役立つ追加のリソースです:
- GitHub上のIntel IPEX
- GitHub上の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
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles