Stable Diffusionをローカルで動かす【2023年12月版】

:::note info
この記事は「[mofmof Advent Calendar 2023](https://qiita.com/advent-calendar/2023/mofmof)」6日目の記事です。
:::

[昨年のアドベントカレンダーではM1 MacBook Proを使った環境構築の方法](https://www.deg84.com/try-stable-diffusion/)を書きました。

今年になって環境が結構変わったので、そのあたりの話をしていこうと思います。

# 前提
## 必要なもの

- そこそこ早いCPU
- 出来るだけグラフィックメモリーが多いGPU（NVIDIA推奨）
- そこそこのメモリ
- そこそこのデータドライブ
- WSL 2（Windowsの場合）
- [Docker](https://www.docker.com/)
- Git

### 実際に使ってる環境
#### Windows
- CPU：AMD Ryzen 9 5950X
- GPU：NVIDIA GeForce RTX 3080 Ti（12GB）
- メモリ：64GB

#### Mac
昨年と変わらずM1 Max MacBook Pro。

# 環境構築

今回の環境構築にはDockerを使用します。

昨年はPythonを直接マシンにインストールして構築しましたが、Docker上に作ることができたので、流れ等をまとめます。
直接Pythonを入れるのもよいのですが、プロジェクトごとにバージョンを切り替えたりするのにDockerのような仮想化を行っている方が扱いやすいです。

以降、特に断りがない限り、Windows、Macどちらも同じ作業が必要になります。

まずは全体の流れです。

1. WSL 2の設定（Windowsのみ）
1. Dockerの環境構築
1. Stable Diffusion Web UI Dockerの設定

1つずつ見ていきます。

##  WSL 2の設定（Windowsのみ）

WindowsでDockerを動かすので、WSL 2をセットアップする必要があります。

PowerShellまたはコマンドプロンプトを管理者モードで開き、以下のコマンドを実行すればOKです。

```shell
wsl --install
```

## Dockerの環境構築

続いてDockerです。[Docker Desktop](https://www.docker.com/products/docker-desktop/)を使います。

ページを開いてダウンロード、インストールしましょう。

### ちょっと設定を変えます（Windowsの場合）

インストール出来たら起動します。　

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1872/8e4dd31b-c38e-704c-6188-4e2b4767c222.png)

設定を開いて、「Use the WSL 2 based engine」にチェックが付いてる確認します。付いてなかったら付けましょう。

続いて、`.wslconfig`を編集します。

`C:\Users\<UserName>\.wslconfig`を開きます。

私の設定を置いておきます。

```.wslconfig
[wsl2]
memory=16GB
swap=0
```

`memory`は全体の半分か8GBの小さい方の値が初期値になっています。
もし私のように多めのメモリを搭載しているのであれば、ここの値を16GB以上に変更するのをおすすめします。

Macについても同様です。メモリに余裕があるなら増やした方が良いかと思います。

`swap`については、Cドライブに何を使っているかなどで異なります。私はSSDを使っているのもあり、あまりswapしてほしくないなということで0に設定しています。

下準備は以上です。

## Stable Diffusion Web UI Dockerの設定

それでは本題に入ります。

昨年はStable DiffusionをCLIから利用していましたが、今時はAUTOMATIC1111のWeb UIを使うのがスタンダードだと思います。

これをDockerで動かすようにしたものが今回使う[Stable Diffusion WebUI Docker](https://github.com/AbdBarho/stable-diffusion-webui-docker)です。

`git clone`して使います。

```shell
git clone https://github.com/AbdBarho/stable-diffusion-webui-docker.git
```

また、Windowsの場合はGPUを使って画像を生成したいので、[CUDA Toolkit](https://developer.nvidia.com/cuda-toolkit)をインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1872/0e021848-3962-d180-ac5e-bc55fd71b447.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1872/7d2da193-84ec-6cc1-aab6-6bd04af23f96.png)

あとは以下のコマンドを実行することでWeb UIが起動します。

```shell
docker compose --profile download up --build
docker compose --profile auto up --build
```

Macの場合は、`auto`では動きません。`auto-cpu`を起動します。
```shell
docker compose --profile download up --build
docker compose --profile auto-cpu up --build
```
おそらく、GPU周りの問題だと思います。

起動出来たら http://localhost:7860/ にアクセスします。

もし、起動しなかったらマシンを再起動してみてください。

ここまで来ればあとは、プロンプト（呪文）を入力して生成するだけです。

# おわりに

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1872/332ff6b1-4e24-216a-cf96-4d43f85e2f9c.png)

設定が終わればこのような画面が表示されます。是非いろいろ生成してみてください。

画面では、いつも使っている「a photograph of an astronaut riding a horse in desert」をプロンプトに入れて生成してみました。

実は拡張機能をいろいろ入れているので、少しUIが異なるかもしれません。そのあたりはまた別の機会に紹介できたらと思います。

それでは良い画像生成ライフを！

# おまけ

## モデルについて

Stable Diffusionに標準で使われているモデルは正直イマイチなので、出したい絵に合わせて適切なものを選ぶ必要があります。

モデルは[Civitai](https://civitai.com/)というサイトにまとまりつつあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1872/afa62eb5-702f-c3bd-8e0f-a8fd4078d542.png)

基本英語ですが、検索機能を使って出したい絵のイメージに合ったモデルを探せます。

ちなみに、日本人を含むアジア系の人物を出すなら[Beautiful Realistic Asians (BRA)](https://civitai.com/models/25494/beautiful-realistic-asians)というモデルが有名ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1872/7cbaa5d2-5dd2-95d4-6152-bef6d79c2df4.png)

ダウンロードから`safetensors`ファイルをダウンロードして、Stable Diffusion Web UI Dockerが読み込む場所に配置する必要があります。

Dockerのコンテナを起動した状態でDocker Desktopを使って`/data/models/Stable-diffusion`にダウンロードしたモデルのファイルをドラッグアンドドロップすればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1872/3f00c5e5-fd38-3cfd-bfc1-d453509e35be.png)

あとは、Stable Diffusion Web UIの画面からモデルを再読み込みします。