M1 ProでStable Diffusionを動かしてみた。

# はじめに
※2022/09/11時点

話題の文字から画像を生成するツール。

原理わかっていなく、pythonとか機械学習周りとかもさっぱりでしたが、こちらの記事を参考にそのまま作業した所、結構あっさりいけました。
https://vivinko.com/inoue/blog/2022/09/01/162730.html

※参考サイトはM1 Maxで、スペックは少し下です。とはいえM2とかでも可能そう

# 環境
- MacBook Pro（14インチ、2021)
    - M1 Pro 10CPU/14GPU
    - メモリ 32GB
- asdf
    - python (miniforge3-4.10.3-10 :python3.9.7)
        - conda
            - python 3.9.13
    - cmake (latest :3.24.1)
    - rust  (latest :1.25.1)
- brew
    - protobuf

# 概要
ツール本体と実行に必要なモデルをそれぞれダウンロードして、ツール実行をする

# 流れ
1. ローカルPCに環境構築 （python etc...)
1. gitからツール本体のソースをダウンロード
    1. m1用のブランチがあるので切り替える
        1. ブランチ切り替えないで、protobuf入れれたらwin環境でもできそう
1. 実行に必要なモデルのダウンロード（git） & 指定階層に配置
    1. サイトでアカウント登録と、ダウンロードするページでユーザー情報共有のチェックが必要。（共有されるのは、メールアドレスと名前くらいかと）
1. 事前処理用のpythonを実行
1. 文字 to 画像のpythonを実行


# ローカル環境構築
## 実行用のフォルダ作成
```
mkdir workspace; cd workspace
```

## 各種インストール
※ asdf、gitは入ってる前提
```
# python
asdf plugin add python
## condaが最初から入っているバージョン
asdf install miniforge3-4.10.3-10
asdf local miniforge3-4.10.3-10
python -V

# cmake
asdf plugin add cmake
asdf install cmake latest
asdf local cmake latest
cmake -V

# rust
asdf plugin add rust
asdf install rust latest
asdf local rust latest
rustup -V

# protobuf
brew install protobuf
# brew doctor見て, brew update等で、先に環境を綺麗にする必要あった。


conda init
# .bash_profileにコマンドが入るっぽい、ターミナル起動時に勝手にbaseって環境になる。
# この時点ではconda環境に入らないまま
```

# ツール整備
## 本体ダウンロード
> git clone https://github.com/magnusviri/stable-diffusion.git
> cd stable-diffusion
> 
> git checkout apple-silicon-mps-support

## conda環境設定
.zprofileに下記追加　（参考サイトの手順通り、おまじないみたいな感じで入れた）
> export GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1
> export GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1


yamlをベースにconda環境構築
※ターミナル立ち上げ直す。

> conda env create -f environment-mac.yaml
> conda activate ldm

切り替わると下記みたいなターミナルの表示になるはず
```
(ldm) ~/workspace/stable-diffusion $ 
```

## モデル取得
- 下記サイトのSign Upと、リンクのページでのチェックが必要
https://huggingface.co/CompVis/stable-diffusion-v-1-4-original

> cd models/ldm
> git clone https://huggingface.co/CompVis/stable-diffusion-v-1-4-original

７GBほど、結構待つ。（バージョン上がるほど軽くなってくとか）
公式はAPIが先行リリースとかで、クローズドでは1.5はもうありそう。（詳細は末尾のリンク）

> mv stable-diffusion-v-1-4-original stable-diffusion-v1
> cd stable-diffusion-v1
> ln -s sd-v1-4.ckpt model.ckpt

これで準備がほぼ完了。

# 実行
## 事前準備
参考記事にはないけど、最初に1回これが必要だった
```
python scripts/preload_models.py
```

# 画像生成
記事や公式とは違うけど、下記パスで実行できた
※デフォ512、指定わかりやすいように例では入れた
```
python scripts/orig_scripts/txt2img.py --prompt "coffee" --W 512 --H 512 --plms
```
他のパラメータは公式参照
https://github.com/CompVis/stable-diffusion

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247263/189a8276-c7db-6b33-3466-d2b4eb546757.png)


## 出力先
- ルートのoutputsフォルダ内に生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247263/5096b1c2-84bd-ab1a-7ff9-d14935302140.png)


# まぁまぁ、綺麗に描けたワード
※有志のチートシート参考
https://moritz.pm/posts/parameters
```
# 城 (3D)
A mysterious Western-style castle floating in the sky | unreal engine, depth of field, 4k, fantasy, lumen reflections, studio quality

# 古民家的(実写)
old house in the mountains | cliff top | Around the Meiji era | Fujifilm XT3

```
- 被写体＋属性で綺麗になっていきそう。
- チートシートのワード使って色々試すと面白そうです。
- パイプやカンマの有効性はイマイチ分かってないですが、前に書くほど優先度が高いみたいです。

# 実行エビデンス
- 512x512の生成で
    - 実行時間：6分ほど
    - メモリを20GBくらい使ってた
    - 描画枚数：４〜６枚 (指定なし時)
    - サイズ：512x512(default)
        - 64の倍数で指定できるっぽい
        - 大きいサイズも指定できたけど、メモリ足りないと実行エラーになる
- 同じワードで同じ画像は生成されなかった
- ファンが回ってくれた

# その他
執筆後に類似記事を探したら、ほぼ同じ内容のものがありました。
https://qiita.com/hevo2/items/c9c611a5f918d36732f3
※記事内にはcliで１枚生成の方法のパラメータ指定方法の記述もあり。

また、この中でweb uiを使う方法が書いてあり、これ使うとすごく便利でした。1枚生成を1分くらいでやってくれました！
> python scripts/dream.py --web

localhost:9090
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247263/1743a69d-8191-dc02-3ade-e8e741162661.png)


# まとめ
もやもやしたイメージを形にするのとか、こういう感じのが欲しいって場合に今のところ活きそうでした。
（テスト用の画像生成とか）
よりツール化されると、仕事とかでも使いやすいかもです。
※このモデルを元にアイコンまとめて生成、とかサイトデザインを作成とか。そういう時代も来そう。。。

ソースの更新頻度が激しそうで、この手順はそのうち使えなくなりそうですが、現時点の利用例を参考までにって感じです。


最後に、開発会社のインタビュー記事見つけたので、こちらも興味ある方は参考までに。
https://signal.diamond.jp/articles/-/1407