AWS Lambdaで動かすStable Diffusion/Waifu Diffusionをちょっと効率的に使うTips

# はじめに
LambdaでStable Diffusion/Waifu Diffusionを動かすと、画像生成に1枚当たり約3分かかります(パラメータで前後します)。
基本的な作業の流れとしては次のとおりですが、、

**prompt等のパラメータの設定→Lambda実行→【画像生成[3分待機]】→画像ダウンロード→チェック→パラメータの・・・（略）**

面倒です。特に3分待機が。煩雑です。
ということで本記事はこの辺りの状況を少しだけ改善するための小ネタです。
なお、AWS LambdaでStable Diffusion/Waifu Diffusionを動かすためのプロジェクトは次のものを使用します。
最新版のソースコード一式をクローン or ダウンロードしてご利用ください。

https://github.com/densenkouji/stable_diffusion.openvino.lambda

# 前提
- AWS CLI、Docker、Pythonはインストール済み
- 「aws configure」でAWS Access Key ID、AWS Secret Access Key、Default region nameの3つについて設定済み

当方で動作確認しているバージョンは次のとおりです。参考まで。
```terminal:AWS CLI
$ aws --version
aws-cli/2.7.31 Python/3.9.11 Linux/5.10.16.3-microsoft-standard-WSL2 exe/x86_64.debian.11 prompt/off
```
```terminal:Docker (Serverは省略)
$ docker version
Client:
 Version:           20.10.17+azure-1
 API version:       1.41
 Go version:        go1.17.11
 Git commit:        100c70180fde3601def79a59cc3e996aa553c9b9
 Built:             Mon Jun  6 21:36:39 UTC 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true
```
```terminal:python
$ python -V
Python 3.9.13
```
# Tips：生成枚数を指定してまとめて作成＆ダウンロード
画像生成の待ち時間で他の作業がぶつ切りになったり、生成した画像をS3からダウンロードするのが面倒ではないでしょうか？
次のスクリプトを使用することで画像生成と生成した画像のダウンロードを一括で行うことができます。
```terminal:demo.py
demo.py：画像生成のLambda関数を指定してpromptやseedなどのパラメータを引き渡すことで、画像生成および画像ダウンロードを行う
```
## 使い方
以下は3枚連続して作成する例です。
```terminal:demo.pyの使い方（例）
$ python demo.py --lambda myWaifuFunc-umqammvlngu5nwiw --n 3 --prompt "interior design, open kitchen and living room,california style, modular furniture with cotton textiles, wooden floor, high ceiling, large steel windows viewing a city"
```
指定しているパラメータは次のとおり。
- --lambda : Lambda関数名を指定します(必須)。
- --prompt : どのような画像を生成するか指定する文字列です(実質必須)。いわゆる呪文です。
- --n : 何枚作成するかを指定します(オプション)。指定しない場合は1枚作成します。

これら以外にも、
- --seed : seedを指定します。未指定時はランダムなseed値が使われます。seed値はファイル名の一部として使用されます。
- --strength : img2imgの初期画像にどの程度準拠するかを指定します。0.0～1.0の範囲で指定。
- --limit : 最大何枚まで作成するか。未指定の場合は100。この指定は--nよりも優先するため、100枚以上作成したい場合は指定します。
- --save  : 画像を保存するディレクトリ。例）--save tmp

などのパラメータがあります。
生成された画像はS3に格納されますが、ローカルにも自動でダウンロードされます。
10枚などある程度の単位でまとめて作成するように設定し、その時間は別の作業を行うなどすると効率的かと思います。

## スクリプト実行結果について
スクリプトの実行結果はJSON形式にて以下のような情報を含んで出力されます。
seedとpromptは再現に必要となるため、適宜保存しておくとよいかと思います。
- 画像を保存したバケット名
- 画像のファイル名
- 画像を生成した際のseed
- 画像を生成した際のprompt
```JSON:スクリプト実行結果例
{
  "0": {
    "statusCode": 200,
    "body": {
      "bucket": "mywaifufunc1-umqammvlngu5nwiw-bucket",
      "output": "sd_2611145733_2022-09-23-03-54-59.png",
      "seed": 2611145733,
      "prompt": "interior design, open kitchen and living room,california style, modular furniture with cotton textiles, wooden floor, high ceiling, large steel windows viewing a city"
    }
  }
}
```

## 生成した画像例
![sd_2895259456_2022-09-23-23-21-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741318/21e294e3-afd9-3854-a0a3-1e7865861b16.png)

![sd_1199287407_2022-09-23-23-24-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741318/59d374f3-2147-7971-4a1f-c781ff7b4092.png)

![sd_2676537229_2022-09-23-23-26-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741318/d63b7d11-57c2-f6a5-fab4-e60df2ddb779.png)

以上です。