Waifu DiffusionをAWS Lambdaで動かしたい

# はじめに
本記事は以下の記事の内容を補足するものです。

https://qiita.com/densenkouji/items/4db5a29f539b87de91e3

---
AWS LambdaでStable Diffusionを動かす場合、「数GBもあるモデルをどこに格納するのか？」という課題があります。
当初はモデルを任意に変えられるようオリジナルである「stable_diffusion.openvino」から特に変更せず、パラメータでモデルを指定可能にしていたのですが、これだと以下の問題がありました。
* モデルのダウンロードが都度発生する
* ダウンロードしたモデルを保存するためのエフェメラルストレージのサイズを増やす必要がある(モデルのサイズ分+α)

これらはLambdaの特性に起因する問題で致し方ないのですが、どちらもコスト増につながるため、現在はモデルをDockerイメージに含めるようにしています(これはこれでDockerイメージの増大になり、別の問題が発生しますが…)。
そのためモデルを変更したい場合はDockerfileを修正する必要があります。

そこで本記事では人物イラスト向けで人気のWaifu Diffusionを使用するよう修正してみたいと思います。
なお、Waifu Diffusionはopenvino版の「ShadowPower/waifu-diffusion.openvino」を使用させてもらいます。

# 実行結果
prompt、seedなどのパラメータは同じ設定でモデルのみ異なります。
* bes-dev/stable-diffusion-v1-4-openvino (デフォルト)
![sd_3651706584_2022-09-22-08-11-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741318/48b7d071-554d-ea3d-8722-260630b36431.png)

* ShadowPower/waifu-diffusion.openvino
![sd_3651706584_2022-09-22-08-06-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741318/ff46d38d-77a0-9e76-02ee-37da3bf01776.png)

同じ設定ではありますが、時計？などの小物で共通点はあるもののだいぶ印象の異なる画像が生成されました。
画像自体はどちらがイイ/ワルイというものではありませんが。

なおLambda関数の実行結果として、それなりの確率でエラーとなることがあります。
元々Lambdaには重い処理のため、エラーが発生した場合はpromptやその他のパラメータを見直してみてください。

# Dockerfile
「ShadowPower/waifu-diffusion.openvino」をモデルとして使用するDockerfileは次のとおりです。
* Dockerfile.waifu
```Dockerfile
FROM public.ecr.aws/lambda/python:3.9 as builder
COPY openvino-2022.repo /etc/yum.repos.d
RUN yum -y update && yum -y install openvino-2022.1.0 gcc make gcc-c++ zlib-devel bison bison-devel gzip glibc-static wget tar git
RUN wget https://ftp.gnu.org/gnu/glibc/glibc-2.27.tar.gz && tar zxvf glibc-2.27.tar.gz && rm glibc-2.27.tar.gz && mv ./glibc-2.27/ /opt/glibc-2.27/
RUN curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh | bash
RUN yum install -y git-lfs && git lfs install && git clone https://huggingface.co/ShadowPower/waifu-diffusion.openvino
ENV GIT_LFS_SKIP_SMUDGE=1
RUN git clone https://huggingface.co/openai/clip-vit-large-patch14
WORKDIR /opt/glibc-2.27/build
RUN /opt/glibc-2.27/configure --prefix=/var/task && make && make install

FROM public.ecr.aws/lambda/python:3.9 as production
COPY requirements.txt  ./
RUN pip install -r requirements.txt
RUN yum -y update && yum -y install mesa-libGL
# model
COPY --from=builder \
    /var/task/waifu-diffusion.openvino/text_encoder.bin \
    /var/task/waifu-diffusion.openvino/text_encoder.xml \
    /var/task/waifu-diffusion.openvino/unet.bin \
    /var/task/waifu-diffusion.openvino/unet.xml \
    /var/task/waifu-diffusion.openvino/vae_decoder.bin \
    /var/task/waifu-diffusion.openvino/vae_decoder.xml \
    /var/task/waifu-diffusion.openvino/vae_encoder.bin \
    /var/task/waifu-diffusion.openvino/vae_encoder.xml /var/task/model/
# tokenizer
COPY --from=builder \
    /var/task/clip-vit-large-patch14/tokenizer_config.json \
    /var/task/clip-vit-large-patch14/vocab.json \
    /var/task/clip-vit-large-patch14/merges.txt \
    /var/task/clip-vit-large-patch14/special_tokens_map.json \
    /var/task/clip-vit-large-patch14/tokenizer.json /var/task/tokenizer/

COPY --from=builder /opt/intel/openvino_2022/runtime/lib/intel64/* /var/task/
COPY --from=builder /opt/intel/openvino_2022/runtime/3rdparty/tbb/lib/* /var/task/
COPY --from=builder /opt/intel/openvino_2022/python/python3.9/ /var/task/python3.9/
COPY --from=builder /var/task/lib/libm.so.6 /lib64/

COPY app.py ./
COPY stable_diffusion_engine.py ./
CMD [ "app.handler" ]
```
「stable_diffusion.openvino.lambda」のDockerfileをこちらの内容に差し替えてください。

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


以上です。