# Metal Performance Shaders (MPS)

> [!TIP]
> バッジ付きのパイプラインは、Apple silicon デバイス上で MPS バックエンドを活用して推論を高速化できるモデルであることを示しています。バッジが未付のパイプラインに追加する場合は、[Pull Request](https://github.com/huggingface/diffusers/compare) をお気軽に作成してください。

🤗 Diffusers は、MacOS デバイスの GPU を Metal フレームワークを通じて活用する PyTorch の [`mps`](https://pytorch.org/docs/stable/notes/mps.html) デバイスにより、Apple silicon（M1/M2 チップ）と互換性があります。以下が必要です：

- Apple silicon (M1/M2) ハードウェアを搭載した macOS コンピュータ
- macOS 12.6 以降（13.0 以降を推奨）
- arm64版のPython
- [PyTorch 2.0](https://pytorch.org/get-started/locally/)（推奨）または 1.13（`mps`の最低サポートバージョン）

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

```python
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
```

> [!WARNING]
> PyTorchの[mps](https://pytorch.org/docs/stable/notes/mps.html)バックエンドは、`2**32`を超えるNDArrayサイズをサポートしていません。この問題に遭遇した場合は、調査できるよう[Issue](https://github.com/huggingface/diffusers/issues/new/choose)を作成してください。

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

```diff
  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()](/docs/diffusers/main/ja/api/pipelines/overview#diffusers.DiffusionPipeline.enable_attention_slicing)関数を呼び出してください:

```py
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 搭載コンピュータでは *より良いパフォーマンス* が確認されています。

### バッチ推論

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

