Stable Diffusion web UIをMacBook(M2)にインストールして画像の生成をしてみた記録

[Supership](https://supership.jp/)の名畑です。話題の[ウルトラマンブレーザー](https://m-78.jp/videoworks/ultraman-blazar/)、キャラ設定や台詞回しやSEに至るまでかなり練られていて話題になって当然という感じですが、個人的には馴染みのある池袋サンシャイン周辺推しな第1話にめちゃくちゃ強く心奪われ「[叙庵](https://www.yakiniku-jyoan.com/)だー」とテンション上がりました。

## はじめに

これまで「[Stable Diffusionでの画像生成をPythonとWeb APIで実装してみた記録](https://qiita.com/nabata/items/153ed75192004420c2e2)」などのいくつかの記事で**Stable Diffusion**のWeb API経由での呼び出しを取り上げてきました。

今回はローカルでの**Stable Diffusion web UI**の環境構築について記録に残します。

流れとしては、公式情報である[Installation on Apple Silicon](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Installation-on-Apple-Silicon)通りに構築を進め、発生したエラーコードに対処した上で[stability.ai](https://ja.stability.ai/)による公式モデルを用いて画像生成まで行いました。 
その上でstability.aiによる配布ではないモデルの適用と画像生成もしてみました。

すでに似たような記事は世の中に大量にございますが、GPUの関係でどうしてもMac以外の情報が多いかと思うので、同一環境の方の指針になれば幸いです。

## 環境

[MacBook Pro(Apple M2 Proチップ)](https://support.apple.com/kb/SP889?locale=ja_JP)です。OSは[macOS 13 Ventura](https://www.apple.com/jp/macos/ventura/)です。

**stable-diffusion-webui**の公式に

> Currently most functionality in the web UI works correctly on macOS, with the most notable exceptions being CLIP interrogator and training. Although training does seem to work, it is incredibly slow and consumes an excessive amount of memory. CLIP interrogator can be used but it doesn't work correctly with the GPU acceleration macOS uses so the default configuration will run it entirely via CPU (which is slow).

とありますので、AppleシリコンのMacでも**CLIP interrogator**と**トレーニング**以外の基本機能は無事に動くと期待します。
ちなみに**CLIP interrogator**は画像からプロンプトを生成するというものです。

## Homebrewのインストール

パッケージ管理ソフトである[Homebrew](https://brew.sh)が入っていない方はインストールします。

```console
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

パスも張っておきます。
パスの張り方はインストール完了時に表示されます。「**Run these two commands in your terminal to add Homebrew to your PATH:**」以下の2行をコピペしてコマンド実行します。**ユーザー名**のところは環境に合わせて変わります。

```console
==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
    (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/ユーザー名/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
```

## その他ソフトウェアのインストール

マニュアル通りですと下記です。未インストールのものだけで大丈夫です。

```console
$ brew install cmake protobuf rust python@3.10 git wget
```

## Stable Diffusion web UIのダウンロード

Githubの[stable-diffusion-webui](https://github.com/AUTOMATIC1111/stable-diffusion-webui)から必要なコード諸々を持ってきます。ダウンロード先は自環境のお好きなところにどうぞ。

```console
$ git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
```

この記事執筆時点でのバージョンは**v1.4.0**でした。

## モデルのダウンロード

使用するモデルは[Hugging Face](https://huggingface.co/models?pipeline_tag=text-to-image&sort=downloads)というサイトからダウンロード可能です。もう一つ有名なサイトがあるのですが、それは後述するとし、ここでは公式通りの手順で進めます。

**Stable Diffusion 2.1**のモデルである[v2-1_768-ema-pruned.ckpt](https://huggingface.co/stabilityai/stable-diffusion-2-1/resolve/main/v2-1_768-ema-pruned.ckpt)をダウンロードします。

ダウンロードしたモデルは、先ほどダウンロード済みの**stable-diffusion-webui**配下の**models/Stable-diffusion**に配置します。

## Stable Diffusion web UIの起動

**stable-diffusion-webui**に移動します。/path/to/のところは配置場所に合わせて変更してください。

```console
$ cd /path/to/stable-diffusion-webui
```

**webui.sh**を叩きます。初回は必要な諸々の設定等で少し時間がかかります。

```console
$ ./webui.sh

################################################################
Install script for stable-diffusion + Web UI
Tested on Debian 11 (Bullseye)
################################################################

略

pruned.ckpt: preload_extensions_git_metadata for 7 extensions took 0.00s
Running on local URL:  http://127.0.0.1:7860

略

Model loaded in 16.5s (calculate hash: 2.8s, load weights from disk: 2.0s, find config: 3.3s, create model: 0.1s, apply weights to model: 2.9s, apply half(): 2.2s, move model to device: 0.6s, load textual inversion embeddings: 0.1s, calculate empty prompt: 2.3s).
```

ブラウザで http://127.0.0.1:7860 を開きます。

![image01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/c4aae7c1-d5ec-773e-a4e8-729afc452f7a.png)

無事に起動ができました。

## エラー対応

試しとして**Prompt**に

> 28-year-old Japanese pretty woman with black bobbed hair

**Negative prompt**に

> text, letter, belongings

を入れて**Generate**を押してみました。
するとターミナルにエラーが表示されました。

```console
*** Error completing request

略

    modules.devices.NansException: A tensor with all NaNs was produced in Unet. This could be either because there's not enough precision to represent the picture, or because your video card does not support half type. Try setting the "Upcast cross attention layer to float32" option in Settings > Stable Diffusion or using the --no-half commandline argument to fix this. Use --disable-nan-check commandline argument to disable this check.
```

> there's not enough precision to represent the picture, or because your video card does not support half type

とのことです。

> Try setting the "Upcast cross attention layer to float32" option in Settings > Stable Diffusion or using the --no-half commandline argument to fix this. Use --disable-nan-check commandline argument to disable this check.

という指示通りに、ブラウザ上で**Settings**の**Stable Diffusion**の最下部にある**Upcast cross attention layer to float32**のチェックを入れてみます。

![image02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/bbd0fc9b-53df-9882-84ce-4d2a472269b6.png)

その上で再度**Generate**を押すと、今度は無事、画像が生成されました。
生成先は**stable-diffusion-webui/outputs**配下です。

<img width="50%" alt="image03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/f118024d-01d5-ad83-d2b2-1ffc19f789fa.png">

> 28-year-old Japanese pretty woman with black bobbed hair
Negative prompt: text, letter, belongings
> Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: 458200453, Size: 512x512, Model hash: ad2a33c361, Model: v2-1_768-ema-pruned, Version: v1.4.0
> 
> Time taken: 11.29s

ということでデフォルトの設定で11秒程度でした。
(個人的には)ストレスになる待ち時間ではないです。素晴らしい。

## Civitaiから別モデルのダウンロード

せっかくなので他のモデルも使用してみます。

先述した**Hugging Face**と並ぶ有名なサイトとして[Civitai](https://civitai.com/)がございます。
**Stable Diffusion**特化のサイトで、サンプル画像も一覧で見られて非常に使い勝手が良いです。

**HIGHEST RATED**の先頭にあった[DreamShaper](https://civitai.com/models/4384/dreamshaper)をダウンロードしてみました。

ダウンロードしたファイル**dreamshaper_7.safetensors**をまた**models/Stable-diffusion**に配置します。

リロードすると**Stable Diffusion checkpoint**の一覧に**dreamshaper_7.safetensors**が追加されていることがわかります。

![image04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/6a8aed42-3e68-f91b-2aba-a892300b3cc4.png)

**dreamshaper_7.safetensors**を選んで**Generate**をします。

<img width="50%" alt="image05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/0cbe36c7-0125-5190-5392-f69612fad623.png">

> 28-year-old Japanese pretty woman with black bobbed hair
Negative prompt: text, letter, belongings
> Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: 1766013823, Size: 512x512, Model hash: ed989d673d, Model: dreamshaper_7, Version: v1.4.0
> 
> Time taken: 14.87s

15秒弱で無事に生成されました。

## 終了

ブラウザを閉じてもプロセスは生き続けますので、Ctrl + Cなどで停止してください。

## アップデート

**stable-diffusion-webui**配下で**git pull**してください。

```console
$ git pull
remote: Enumerating objects: 511, done.
remote: Counting objects: 100% (460/460), done.

略

Updating 394ffa7b..f865d3e1
Fast-forward
 CHANGELOG.md       | 5 +++++
 modules/api/api.py | 3 ++-
 2 files changed, 7 insertions(+), 1 deletion(-)
```

**stable-diffusion-webui**配下の**CHANGELOG.md**を見れば更新履歴がわかります。

```console
## 1.4.1

### Bug Fixes:
 * add queue lock for refresh-checkpoints

以下略
```

## 最後に

**CLIP interrogator**と**トレーニング**以外にもMacだと厳しいこともあるのかもしれませんが、今回取り上げた範疇においては想像よりスムーズに快適に動きました。

次回はインストールした**Stable Diffusion**を**ブラウザ経由**ではなく**Python**から**API経由**で呼び出してみようと思います。

## 宣伝

[SupershipのQiita Organization](https://qiita.com/organizations/supership-inc)を合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方は[Supership株式会社 採用サイト](https://supership.jp/recruit/)よりご確認ください。