Diffusers documentation

Metal Performance Shaders (MPS)

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Metal Performance Shaders (MPS)

MPSバッジが付いたPipelinesは、Apple siliconデバイス上でMPSバックエンドを活用して推論を高速化できるモデルであることを示しています。バッジが欠落しているPipelinesに追加するPull Requestを、Pull Requestとしてお気軽に作成してください。

🤗 Diffusers は、MacOS デバイスの GPU を Metal フレームワークを通じて活用する PyTorch の mps デバイスにより、Apple silicon(M1/M2 チップ)と互換性があります。以下の環境が必要です:

  • Apple silicon (M1/M2) ハードウェアを搭載した macOS コンピュータ
  • macOS 12.6 以降(13.0 以降を推奨)
  • arm64版のPython
  • PyTorch 2.0(推奨)または 1.13(mpsの最低サポートバージョン)

mps バックエンドは、PyTorch の .to() インターフェースを使用して、Stable Diffusion パイプラインを M1 または M2 デバイス上に移動します:

from diffusers import DiffusionPipeline

pipe = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5")
pipe = pipe.to("mps")

# Recommended if your computer has < 64 GB of RAM
pipe.enable_attention_slicing()

prompt = "a photo of an astronaut riding a horse on mars"
image = pipe(prompt).images[0]
image

PyTorchのmpsバックエンドは、2**32を超えるNDArrayサイズをサポートしていません。この問題に遭遇した場合は、調査できるようIssueを作成してください。

PyTorch 1.13 を使用している場合、パイプラインを「プライム」するために、追加の一度きりのパスが必要です。これは、最初の推論パスがその後のパスとわずかに異なる結果を生成する問題に対する一時的な回避策です。このパスは一度だけ実行すればよく、1回の推論ステップ後に結果を破棄できます。

  from diffusers import DiffusionPipeline

  pipe = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5").to("mps")
  pipe.enable_attention_slicing()

  prompt = "a photo of an astronaut riding a horse on mars"
  # First-time "warmup" pass if PyTorch version is 1.13
+ _ = pipe(prompt, num_inference_steps=1)

  # Results match those from the CPU device after the warmup pass.
  image = pipe(prompt).images[0]

トラブルシューティング

このセクションでは、mps バックエンドの使用に伴う一般的な問題とその解決策をいくつか紹介します。

アテンションのスライシング

M1/M2 のパフォーマンスはメモリ圧力に対して非常に敏感です。メモリ圧力が高まった場合、システムは必要に応じて自動的にスワップを実行しますが、これによりパフォーマンスが大幅に低下します。

これを防ぐために、推論中のメモリ負荷を軽減し、スワッピングを防止するため、attention slicingの使用を推奨します。これは、システムRAMが64GB未満のコンピューターを使用している場合、または512×512ピクセルを超える非標準の解像度で画像を生成する場合に特に重要です。パイプラインに対してenable_attention_slicing()関数を呼び出してください:

from diffusers import DiffusionPipeline
import torch

pipeline = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16", use_safetensors=True).to("mps")
pipeline.enable_attention_slicing()

Attention slicing は、コストのかかる attention 操作を一度に行うのではなく、複数のステップに分けて実行します。通常、ユニバーサルメモリを備えていないコンピュータではパフォーマンスが約 20% 向上しますが、RAM が 64GB 以上ある場合を除き、ほとんどの Apple silicon 搭載コンピュータでは より良いパフォーマンス が確認されています。

バッチ推論

バッチで複数のプロンプトを生成すると、クラッシュしたり、安定して動作しなかったりする場合があります。その場合は、バッチ処理の代わりにイテレーション(繰り返し処理)を使用してください。

Update on GitHub