# 概要

Diffusionの推論は計算コストが高く、[DiffusionPipeline](/docs/diffusers/main/ja/api/pipelines/overview#diffusers.DiffusionPipeline)を複数回実行して初めて満足のいく結果が得られることがよくあります。このページでは、Diffusersの主な最適化技術、その機能、および使用タイミングについて概要を説明します。

## スターターパス

モデルが1つのGPUに収まる場合は、このベースラインの読み込みから開始してください。`dtype`を設定し、パイプラインをアクセラレーターに配置します。メモリが逼迫している場合のみ、モデルのCPUオフロードを使用してください。また、ステップ数を減らすか、より高速なスケジューラを使用することで、推論を高速化することもできます。

`dtype`を省略すると、Diffusersはコンポーネントを`float32`で読み込みます。`dtype=torch.bfloat16`（bfloat16がサポートされていない場合は`torch.float16`）を渡し、その後`pipeline.to("cuda")`でパイプラインをアクセラレーターに配置します。

```py
import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.bfloat16,
)
pipeline.to("cuda")  # or "mps", "xpu"

prompt = """
cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
"""
pipeline(prompt).images[0]
```

パイプラインが収まらない場合、またはメモリが逼迫している場合は、すべてを GPU に保持する代わりに [enable_model_cpu_offload()](/docs/diffusers/main/ja/api/pipelines/overview#diffusers.DiffusionPipeline.enable_model_cpu_offload) を呼び出してください。これにより、アクティブなモデルは GPU に配置され、その他のコンポーネントは CPU に保持されます。

モデルがメモリに収まる場合はスキップしてください。オフローディングは、必要がない場合に実行すると遅くなります。

オフロードのその他のオプションについては、[メモリ使用量の削減](./memory#offloading)を参照してください。

```py
pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.bfloat16,
)
pipeline.enable_model_cpu_offload()
```

`num_inference_steps`を減らすか、[DPMSolverMultistepScheduler](/docs/diffusers/main/ja/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler)のような高速なスケジューラを使用することで、レイテンシを低減できます。これにより生成速度が向上する傾向がありますが、低速で高品質なスケジューラと比較して画像の品質が低下する可能性があります。その他の高速化テクニックについては、以下の[最適化テクニック](#optimization-techniques)を参照してください。

```py
import time
from diffusers import DPMSolverMultistepScheduler

pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config)

start_time = time.perf_counter()
image = pipeline(prompt, num_inference_steps=25).images[0]
end_time = time.perf_counter()

print(f"Image generation took {end_time - start_time:.3f} seconds")
```

## 最適化技術

スターターパスが不十分な場合は、これらの技術を使用してください。推論が遅すぎる場合は、`torch.compile`、キャッシュ、またはアテンションバックエンドから始めてください。メモリ不足の場合は、オフローディングまたは量子化から始めてください。

より高速な推論:

- [torch.compile](./fp16#torchcompile) — UNet、transformer、またはVAEを最適化されたカーネルにコンパイルします。
- [リージョナルコンパイル](./fp16#regional-compilation) — 繰り返しブロックをコンパイルして`torch.compile`のコールドスタート遅延を削減し、コンパイル済み成果物を再利用します。
- [キャッシュ](./cache) — 速度を優先し、メモリを消費できる場合に、デノイジングステップ間で中間結果を再利用します。
- [Attentionバックエンド](./attention_backends) — attentionがボトルネックになっている場合、統一されたAPIを通じてDiffusersのattention実装を切り替えます。
- [Kernels](./fp16#kernels) — 標準のPyTorchを超えるハードウェア固有の高速化が必要な場合、最適化されたHubの計算カーネル（attentionやRMSNorm、RoPEなどのカスタムCUDAオペレーション）を読み込みます。

メモリ使用量の削減:

- [オフローディング](./memory#offloading) — CPU、モデル、またはグループのオフローディングにより、非アクティブなモデルやレイヤーをCPUに移動します。
- [量子化](../quantization/overview) — メモリを削減するために、より小さい重みを読み込みます（一部のバックエンドでは推論の高速化も可能です）。[GGUF](../quantization/gguf) は一般的な出発点です。
- [VAEスライシング](./memory#vae-slicing)と[VAEタイルリング](./memory#vae-tiling) — 大きなバッチや高解像度の画像を分割してデコードし、ピークメモリを低減します。

両方:

- [量子化、コンパイル、オフロード](./speed-memory-optims) — 1つの手法だけでは不十分な場合、量子化、`torch.compile`、オフロードを組み合わせます。

