MacOSでStable Diffusion XLを最適化して使用する方法

## はじめに

Stable Diffusionは、AI生成画像の世界に革命をもたらしました。しかし、macOS上で効率的に実行するのは必ずしも簡単ではありません。

この記事では、Hugging Face Diffusersライブラリを使用して、macOS上でStable Diffusion（特にXLモデル）を最適化する方法を詳しく解説します。

## なぜDiffusersライブラリを選ぶのか？

Hugging Face Diffusersライブラリには、macOSユーザーにとって以下のような利点があります：

1. Apple Silicon Mac上でのMPSの効率的な利用
2. 生成プロセスのより細かな制御
3. 様々なモデルとスケジューラーを試せる柔軱性

## 環境のセットアップ

まずは、Pythonの仮想環境を作成し、必要なライブラリをインストールしましょう：

```bash
python3 -m venv venv
source venv/bin/activate
pip install torch transformers diffusers
```

## Stable Diffusion XLの実装

以下は、macOS上でMPSを使用してStable Diffusion XLを実行するPythonスクリプトです：

```python
import torch
from diffusers import StableDiffusionXLPipeline, EulerDiscreteScheduler

# 設定
WIDTH, HEIGHT = 512, 896
NUM_INFERENCE_STEPS = 30
NUM_IMAGES_PER_PROMPT = 4
MODEL_PATH = "./sd_xl_base_1.0.safetensors" # .safetensorsチェックポイントファイルへのパス

# パイプラインの初期化
def create_pipeline(model_path, scheduler=None):
    return StableDiffusionXLPipeline.from_single_file(
        model_path,
        torch_dtype=torch.float32,
        variant="fp32",
        use_safetensors=True,
        scheduler=scheduler
    )

# パイプラインのセットアップ
pipe = create_pipeline(MODEL_PATH)
scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config)
pipe = create_pipeline(MODEL_PATH, scheduler)

# macOS向けに最適化
pipe.to("mps")
pipe.enable_attention_slicing()

# 画像生成
def generate_images(prompt, negative_prompt=""):
    return pipe(
        prompt=prompt,
        negative_prompt=negative_prompt,
        height=HEIGHT,
        width=WIDTH,
        num_inference_steps=NUM_INFERENCE_STEPS,
        num_images_per_prompt=NUM_IMAGES_PER_PROMPT,
        generator=torch.Generator(device="mps")
    ).images

# 使用例
prompt = "a photo of an astronaut riding a horse on mars"
negative_prompt = "blurry, dark photo, blue"
images = generate_images(prompt, negative_prompt)

# 画像の保存
for i, image in enumerate(images):
    image.save(f"./output-{i:02d}.png")
```

## 主要コンポーネントの説明

1. **パイプラインの初期化**: `StableDiffusionXLPipeline`を使用して、カスタムモデル（.safetensorsファイル）をロードします。MPSがfp16をサポートしていないため、`torch_dtype=torch.float32`を設定しています。

2. **スケジューラー**: Stable Diffusionで高品質な結果を生成することで知られる`EulerDiscreteScheduler`を使用しています。

3. **MPSの利用**: `pipe.to("mps")`でパイプラインをMPSデバイスに移動します。

4. **プロンプトエンジニアリング**: 画像生成をガイドするための正のプロンプトとネガティブプロンプトの両方を定義します。

5. **画像生成**: 定義したパラメータ（寸法、推論ステップ、プロンプトごとの画像数など）でパイプラインを呼び出します。

## StableDiffusionXLPipelineと.safetensorsファイルの使用

Stable Diffusion XLモデルを.safetensors形式で使用する場合、通常の`StableDiffusionPipeline`ではなく`StableDiffusionXLPipeline`を使用することが重要です。

`StableDiffusionXLPipeline`で.safetensorsファイルを使用するには：

1. `MODEL_PATH`でファイルパスを指定
2. `from_single_file()`メソッドを使用してモデルをロード
3. パイプラインの初期化時に`use_safetensors=True`を設定

## .safetensorsファイルの入手先

.safetensorsファイルは様々なソースから入手可能です。以下は人気のあるリソースです：

1. **Civitai.com**: アーティストや開発者がカスタムモデルを共有するコミュニティ駆動型プラットフォーム。
2. **Hugging Face Model Hub**: 公式およびコミュニティ提供のモデルが多数あるリポジトリ。

ダウンロード時の注意点：
- ライセンスと使用条件を常に確認し、尊重してください。
- 非公式のソースからダウンロードする際は、セキュリティに注意してください。
- モデルカードやドキュメントを確認し、特別な使用方法があるか確認してください。

## カスタマイズと実験

以下の項目を自由に実験してみてください：

- `MODEL_PATH`を変更して異なるモデルを試す
- Diffusersライブラリの他のスケジューラーを試す
- `WIDTH`、`HEIGHT`、`NUM_INFERENCE_STEPS`、`NUM_IMAGES_PER_PROMPT`を調整する
- さまざまなプロンプトとネガティブプロンプトを作成する

## まとめ

Hugging Face Diffusersライブラリと適切な`StableDiffusionXLPipeline`を活用することで、macOS上でStable Diffusion XLを効率的に実行し、Metal Performance Shadersの性能を最大限に引き出すことができます。

このアプローチにより、生成プロセスを細かく制御し、異なるモデル、スケジューラー、パラメータを簡単に試すことが可能になります。使用するモデルのライセンスに気をつけて、MacでもAI画像生成を楽しみましょう！