WindowsでPython知らないレベルの私でもStable Diffusionを動かせたメモ

## 概要
Stable Diffusionがオープンソース化されたのが話題に。
pythonやAI気になっているけれど、触る機会がなかったので、このビッグウェーブで試してみた。
自作TRPGの[LOSTRPG~廃墟の森の子供たち~](https://lostrpg-751c1.firebaseapp.com/lost/index.html)に使えないかなという試み。
結論からいうと、以下のような画像が生成できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/142bc917-fb44-4299-70e1-6a6e1364e5bd.png)


## 環境
- Windows10 21H2 19044.1889
  - メモリ: 32G
  - NVIDIA GeForce GTX 1050 Ti
      - グラフィックスメモリの使用可能容量: 20438MB
      - 専用ビデオメモリ 4096MB GDDR5
      - 共有システムメモリ 16342 MB
- python 3.10.6

今回の方法だとグラボほとんど使っていないので、グラボ関係なさそう？

## やったことの簡単まとめ

* miniconda3のインストール
* 最新グラボでなくても動く、[速度を犠牲に省メモリなリポジトリ](https://github.com/CompVis/stable-diffusion/issues/39)をclone
* [https://huggingface.co/](https://huggingface.co/)に登録
* [モデル](https://huggingface.co/CompVis/stable-diffusion-v-1-4-original)をダウンロードして、リポジトリ下の`models\ldm\stable-diffusion-v1\model.ckpt`に置く
* インストールしたcondaを起動。クローンしてきたリポジトリに`cd`で移動
* 仮想環境`ldm`を`activate`
  * `conda env create -f environment.yaml`
  * `conda activate ldm`
* 以下のコマンドを入力。
  * `>python optimizedSD/optimized_txt2img.py --prompt "lost life of survival little odyssey last offspring lovable our strage time" --n_samples 10`
* コーヒーを飲みながら10分待って完成


## 画像生成するまでの足跡
[話題のStable Diffusionがオープンソース化されたのでローカルで動かしてみる](https://zenn.dev/koyoarai_/articles/02f3ed864c6127bb2049)をなぞる形で行った。

### clone
[github](https://github.com/CompVis/stable-diffusion)からclone。

### condaのインストール
python開発をしていないので、anacondaを持っていない。
chocolateyでインストールした。

```
cinst -y  miniconda3
```

- miniconda3 4.12.0 がインストールされる

### 初期環境構築

readmeに従い、condaのプロンプトを開いて以下を実行。

```
conda env create -f environment.yaml
conda activate ldm
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/d8c81e55-b797-41bb-ec0a-2fff579b2ffa.png)

### 動かしてみる
[話題のStable Diffusionがオープンソース化されたのでローカルで動かしてみる](https://zenn.dev/koyoarai_/articles/02f3ed864c6127bb2049)に従い、実行。

```
(ldm) D:\develop\develop\project\stable-diffusion>python scripts/txt2img.py --prompt "a photograph of an astronaut riding a horse" --plms
```

以下のエラーとなった。

```
    super(_open_file, self).__init__(open(name, mode))
FileNotFoundError: [Errno 2] No such file or directory: 'models/ldm/stable-diffusion-v1/model.ckpt'
```

モデルが足りない模様

### モデルの準備

[https://huggingface.co/](https://huggingface.co/)にサインアップ。

[CompVis/stable-diffusion-v-1-4-original](https://huggingface.co/CompVis/stable-diffusion-v-1-4-original)から`sd-v1-4.ckpt`ファイルをダウンロード。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/1c8d83c8-ab93-fb22-3da6-ff1ae8b2e2a3.png)

ライセンスについて、翻訳ソフトを通して確認。
問題なさそうなので`Accept Repository`。

> このモデルにアクセスするには、連絡先情報を共有する必要があります。
このリポジトリは誰でもアクセスできますが、 そのコンテンツにアクセスするには登録する必要があります
下の [Access Repository] をクリックすると、連絡先情報 (電子メール アドレスとユーザー名) がリポジトリの作成者と共有されることに同意したことになります。これにより、たとえば、ライセンス上の理由でリポジトリのコンテンツの一部を削除する必要がある場合に、作成者が連絡を取ることができます。
 **
CreativeML OpenRAIL-M ライセンスの上で、このモデルはオープン アクセスで誰でも利用できます。
CreativeML OpenRAIL ライセンスの概要:
1.モデルを使用して、違法または有害な出力またはコンテンツを意図的に作成または共有することはできません
2.当社は、お客様が生成した出力に対していかなる権利も主張しません。お客様はそれらを自由に使用することができ、ライセンスに設定された条項に違反してはならない使用について説明責任を負います。
3. Weightを再配布し、モデルを商用および/またはサービスとして使用することができます。その場合、ライセンスと同じ使用制限を含め、CreativeML OpenRAIL-M のコピーをすべてのユーザーと共有する必要があることに注意してください (ライセンスを完全に注意深く読んでください)。
ここで完全なライセンスをお読みください: https://huggingface.co/spaces/CompVis/stable-diffusion-license


### ファイルの配置
準備したモデルの名前を`model.ckpt`に変更し、
`models/ldm/stable-diffusion-v-1`ディレクトリを作成、その中に入れる。ソースコードを見ると、実行時引数を指定しないときのデフォルトのパスの模様。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/2676a5fa-6514-a9ec-b652-3774919a188b.png)

### 失敗

配置しても、同様のエラーとなる。

### windows用のパスを与える。
ファイルがみつからないときの心当たりとして、linuxとwindowsのパス解釈の違いがよくある。
下記のように、パスをデフォルトの`/`ではなく、`\`で区切ることにより`File Not Found`のエラーは解消した。

```
(ldm) D:\develop\develop\project\stable-diffusion>python scripts/txt2img.py --prompt "a photograph of an astronaut riding a horse" --plms --ckpt models\ldm\stable-diffusion-v-1\model.ckpt
```

### 次なるエラー
グラボのメモリが足りないっぽい。


```
RuntimeError: CUDA out of memory. Tried to allocate 20.00 MiB (GPU 0; 4.00 GiB total capacity; 3.46 GiB already allocated; 0 bytes free; 3.52 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
```

メモリが足りないらしい。

`nvidia-smi`コマンドで確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/bcf4e2c8-fb3f-5f29-4ff2-ce1dfcc8d6e0.png)

[話題のStable Diffusionがオープンソース化されたのでローカルで動かしてみる](https://zenn.dev/koyoarai_/articles/02f3ed864c6127bb2049)でも、メモリ不足から、少ないメモリで動く、フォークされたリポジトリで試していた。それに倣うことにする。

### フォークされたリポジトリを使ってみる

同様に、model.ckptを配置する。

今回は`optimizedSD/optimized_txt2img.py`を実行する。
windows用にパスを指定するためのargsが足りなかったので追加した。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/7f0d7b51-b025-fc7f-4408-e405c8a42c09.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/f751d098-e545-cf19-6a62-588db36d7d2d.png)


```
python optimizedSD/optimized_txt2img.py --prompt "a photograph of an astronaut riding a horse" --ckpt models\ldm\stable-diffusion-v-1\model.ckpt --n_samples 3
```

以下のエラー。

```
  File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'optimizedSD'
```

パッケージがない模様。

```
(ldm) D:\develop\develop\project\stable-diffusion-for-little-vram>pip show optimizedSD
WARNING: Package(s) not found: optimizedSD
```

### 開発環境再構築
そういえば、リポジトリが変わったのに開発環境を再構築していないことに気づく。

```
conda remove -n ldm --all
conda env create -f environment.yaml
conda activate ldm
```

### 再度実行。。。行けた！
```
python optimizedSD/optimized_txt2img.py --prompt "a photograph of an astronaut riding a horse" --ckpt models\ldm\stable-diffusion-v-1\model.ckpt --n_samples 3
```

馬要素があるのが一枚だけですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/a435da41-25ae-4457-5162-d21282995456.png)



## やったことの簡単まとめ(旧）

* miniconda3のインストール
* 最新グラボでなくても動く、[速度を犠牲に省メモリなリポジトリ](https://github.com/CompVis/stable-diffusion/issues/39)をclone
* [https://huggingface.co/](https://huggingface.co/)に登録
* [モデル](https://huggingface.co/CompVis/stable-diffusion-v-1-4-original)をダウンロードして、リポジトリ下の`models\ldm\stable-diffusion-v-1\model.ckpt`に置く
* パスを指定できるようにソースコードを微修正
* インストールしたcondaを起動。クローンしてきたリポジトリに`cd`で移動
* 仮想環境`ldm`を`activate`
  * `conda env create -f environment.yaml`
  * `conda activate ldm`
* 以下のコマンドを入力。
  * `>python optimizedSD/optimized_txt2img.py --prompt "lost life of survival little odyssey last offspring lovable our strage time" --ckpt models\ldm\stable-diffusion-v-1\model.ckpt --n_samples 10`
* コーヒーを飲みながら10分待って完成

ソースコード修正
```diff:optimizedSD/optimized_txt2img.py

 config = "optimizedSD/v1-inference.yaml"
-ckpt = "models/ldm/stable-diffusion-v1/model.ckpt"
+# ckpt = "models\ldm\stable-diffusion-v1\model.ckpt"
 device = "cuda"
 
 parser = argparse.ArgumentParser()
-
+parser.add_argument(
+    "--ckpt",
+    type=str,
+    default="models/ldm/stable-diffusion-v1/model.ckpt",
+    help="path to checkpoint of model",
+)
 parser.add_argument(
     "--prompt",
     type=str,
@@ -150,7 +155,7 @@ parser.add_argument(
     default="autocast"
 )
 opt = parser.parse_args()
-
+ckpt = opt.ckpt
 tic = time.time()
 os.makedirs(opt.outdir, exist_ok=True)
 outpath = opt.outdir
```

## デフォルトのフォルダとパスが違うことに気づく。

デフォルトは`models\ldm\stable-diffusion-v1\model.ckpt`で、自分が置いていたところは`models\ldm\stable-diffusion-v-1\model.ckpt`。お恥ずかしい。。。

## 調査

[Google Colab で、お手軽 Text-to-Image](https://zenn.dev/k41531/articles/2459bbbe8e5cf3)
[話題のStable Diffusionがオープンソース化されたのでローカルで動かしてみる](https://zenn.dev/koyoarai_/articles/02f3ed864c6127bb2049)
[Git Bashでcondaを有効にする方法](https://tropicbird.hatenablog.com/entry/2020/09/15/150400)
[midjourneyより高性能だけど入口の敷居が高すぎるStable Diffusionについて、かわなえさんによる導入方法解説まとめ＋他の人の補足など](https://togetter.com/li/1934571)
[Stable Diffusionをローカルマシンで実行する(VSCodeとDevcontainerを使用)](https://zenn.dev/hayatok/articles/6141a9a46e4f48)
[PyTorch : CUDAのメモリ不足によるエラーを解決する](https://qiita.com/nyunyu122/items/720718cbf17bf84a5c82)
[No module namedが出た時の対処手順](https://qiita.com/ymto/items/e00e95543aab2d4d45ee)
[conda 仮想環境の作成・削除](https://wakatta.xyz/i180/)
[Stable Diffusionをローカルで動かす](https://www.sleepingmonster.dev/2022/08/223.html)
[世界変革の前夜は思ったより静か](https://note.com/fladdict/n/n13c1413c40de)