Intel Sapphire Rapids CPUでのStable Diffusion推論の高速化
TL;DR
Hugging Faceは、Optimum Intel/OpenVINO、システムレベルのメモリとスレッドの最適化、BF16/AMXを使用したIntel Extension for PyTorch (IPEX)、およびDPMSolverMultistepSchedulerを組み合わせることで、Intel Sapphire Rapids (Xeon Sapphire Rapids) CPU上でStable Diffusion推論を 32.3 s から ~5 s に高速化できることを示しています。
Diffusersライブラリ – ベースライン性能
diffusers ライブラリは、Stable Diffusion 用のシンプルな Python API を提供します。Amazon EC2 r7iz.metal-16xl インスタンス(64 vCPU、512 GB RAM、Ubuntu 20.04)でデフォルトの float32 パイプラインを使用すると、画像1枚あたりの平均レイテンシは 32.3 seconds となります(推論ステップ20)。同じハードウェア世代(Sapphire Rapids)は、前世代の Ice Lake Xeon よりもすでに高速で、同一ワークロードで約45 seconds かかります。
Optimum Intel と OpenVINO – 2倍のスピードアップ
Optimum Intel は、StableDiffusionPipeline の代替として OVStableDiffusionPipeline を提供します。pip install optimum[openvino] でインストールすると、PyTorchモデルを自動的にOpenVINO形式に変換し、bfloat16 で推論できます。
from optimum.intel.openvino import OVStableDiffusionPipeline
ov_pipe = OVStableDiffusionPipeline.from_pretrained(model_id, export=True)
latency = elapsed_time(ov_pipe, prompt)
print(latency) # → ~16.7 s
OpenVINO パイプラインはレイテンシを 16.7 s に削減し、ベースラインの Diffusers に比べて2倍の改善となります。
固定形状最適化 – さらに3.5倍
OpenVINO は静的入力形状もサポートしています。パイプラインを固定解像度(例:512 × 512)にリシェイプすることで、レイテンシはさらに 4.7 seconds に低下します。
ov_pipe.reshape(batch_size=1, height=512, width=512, num_images_per_prompt=1)
latency = elapsed_time(ov_pipe, prompt)
Sapphire Rapids と組み合わせると、Ice Lake と比較してほぼ 10× のスピードアップになります。
システムレベルの最適化 – コード変更なしで3倍高速化
メモリ割り当てとスレッドは、Stable Diffusion が使用する大規模なマルチギガバイトモデルに影響します。以下のシステム調整が同じ EC2 インスタンスで適用されました:
- jemalloc をインストールし、プリロードして高性能メモリ管理を実現します。
- intel‑mkl をインストールし、
libiomp5.soをプリロードして Intel OpenMP ランタイムを有効にします。 OMP_NUM_THREADS=32を設定してコア数に合わせます。numactl -C 0-31を使用して Python プロセスをコアのサブセットに固定します。
sudo apt-get install -y libjemalloc-dev intel-mkl
export LD_PRELOAD=$LD_PRELOAD:/usr/lib/x86_64-linux-gnu/libjemalloc.so
export LD_PRELOAD=$LD_PRELOAD:/usr/lib/x86_64-linux-gnu/libiomp5.so
export OMP_NUM_THREADS=32
numactl -C 0-31 python sd_blog_1.py
これらの変更により、ベースラインの Diffusers のレイテンシは 32.3 s から 11.8 s に削減され、約3倍の向上となります。
IPEX と BF16 – さらに2倍のブースト
Intel Extension for PyTorch (IPEX) は、Sapphire Rapids に搭載された AVX‑512 VNNI と AMX(Advanced Matrix Extensions)を活用します。intel_extension_for_pytorch==1.13.100 をインストールした後、各パイプラインコンポーネント(UNet、VAE、テキストエンコーダ、セーフティチェッカー)は channels‑last レイアウトに変換され、bfloat16 モードで IPEX によって最適化されます。
import torch, intel_extension_for_pytorch as ipex
# Convert modules to channels‑last
pipe.unet = pipe.unet.to(memory_format=torch.channels_last)
# ... repeat for vae, text_encoder, safety_checker
# Optimize with IPEX
pipe.unet = ipex.optimize(pipe.unet.eval(), dtype=torch.bfloat16, inplace=True, sample_input=input_example)
# Run under autocast
with torch.cpu.amp.autocast(enabled=True, dtype=torch.bfloat16):
latency = elapsed_time(pipe, prompt)
print(latency) # → ~5.4 s
レイテンシは 11.8 s から 5.4 seconds に改善し、BF16 と AMX により2倍以上の加速が得られます。
高速スケジューラ – 最終的に6.5倍の総合スピードアップ
Diffusers は、ノイズ除去ステップのスケジュールを制御する交換可能なスケジューラをサポートしています。DPMSolverMultistepScheduler は、わずか20ステップで最高の速度/品質のトレードオフを提供します。
from diffusers import DPMSolverMultistepScheduler
scheduler = DPMSolverMultistepScheduler.from_pretrained(model_id, subfolder="scheduler")
pipe = StableDiffusionPipeline.from_pretrained(model_id, scheduler=scheduler)
latency = elapsed_time(pipe, prompt)
print(latency) # → ~5.05 s
このスケジューラを使用すると、最終的なレイテンシは 5.05 seconds となり、元の Sapphire Rapids ベースライン(32.3 s)に対して 6.5× の改善、そして Ice Lake に比べて約 10× の高速化を示します。
完全な環境スナップショット
- インスタンス: Amazon EC2 r7iz.metal-16xl(64 vCPU、512 GB RAM)
- OS: Ubuntu 20.04、Linux カーネル 5.15.0-1031-aws
- ライブラリ: libjemalloc‑dev 5.2.1‑1、intel‑mkl 2020.0.166‑1、PyTorch 1.13.1、Intel Extension for PyTorch 1.13.1、Transformers 4.27.2、Diffusers 0.14、Accelerate 0.17.1、OpenVINO 2023.0.0.dev20230217、Optimum 1.7.1、Optimum‑Intel 1.7
意味合いと次のステップ
一般的な CPU で Stable Diffusion の推論を数秒に短縮することで、新たなユースケースが広がります:
- GPU インフラなしで、顧客向けアプリケーションにおけるリアルタイム画像生成。
- 他のモデルのトレーニング用にコスト効果の高い合成データ生成。
- データプライバシーやレイテンシ制約によりクラウド GPU が利用できないオンプレミス展開。
開発者は、ブログ記事で使用されたフルスクリプトが含まれる提供された GitLab デモリポジトリに従って開始できます。さらにスケールするために、今後の Hugging Face 記事では Sapphire Rapids クラスタ上での拡散モデルの分散ファインチューニングについて取り上げる予定です。
リソース
- Diffusers ドキュメント – https://huggingface.co/docs/diffusers
- Optimum Intel ドキュメント – https://huggingface.co/docs/optimum/main/en/intel/inference
- Intel IPEX GitHub – https://github.com/intel/intel-extension-for-pytorch
- Intel‑Hugging Face 開発者ポータル – https://www.intel.com/content/www/us/en/developer/partner/hugging-face.html
- ディスカッションフォーラム – https://discuss.huggingface.co/