Stable DiffusionをAWSのEC2インスタンスで動かすまでの手順

# 概要
2022年8月22日に、Stable Diffusionという画像生成AIがオープンソースで公開されました。これをAWSのEC2インスタンスで動かすまでのセットアップ手順書です。

# 注意事項
:::note warn
この手順書ではAWSの**p3.2xlarge**というハイスペックタイプのインスタンスを使います。料金は東京リージョンのオンデマンドで**4.194 USD/hour**、執筆時点での円ドル相場が136.5円なので、**1カ月間稼働させると41.2万円**になります。**1分あたりだと9.5円**です。お財布にとって大変危険ですので、**遊び終わったら必ずインスタンスのシャットダウンをするのを忘れないようにしてください。**
:::
なお、この手順書を通しでやってみたところ35分ほどかかりました。1,000円くらいを遊び代だと思って投げ捨てるくらいの気持ちで手順を進めることをお勧めします。

# 事前準備
## HuggingFaceのユーザー登録
Stabie Diffusionで使うモデルデータをcloneするときにHuggingFaceのアカウント情報が必要になります。以下のURLからユーザー登録を済ませておきましょう。
+ HuggingFace　https://huggingface.co/join

## NVIDIAのユーザー登録
cuDNNのライブラリをダウンロードする際に必要となります。以下のURLからユーザー登録をします。
+ NVIDIA Developer https://developer.nvidia.com/login

## NVIDIA cuDNNライブラリのダウンロード
+ ダウンロードURLを開く: https://developer.nvidia.com/rdp/cudnn-download
+ "I Agree To the Terms of the cuDNN Software License Agreement" にチェックを入れる
+ "Download cuDNN v8.5.0 (August 8th, 2022), for CUDA 11.x" をクリックしてサブメニューを展開する
+ "Local Installer for Linux x86_64 (Tar)" をクリックしてダウンロードする
+ ダウンロードしたファイルはいったんローカルPCへ保存する

# サーバーセットアップ手順

## EC2インスタンスの起動
EC2インスタンスを以下の設定で１つ起動します。
なお、これより前の手順であるVPCやセキュリティグループの設定については省略します。
+ インスタンスタイプ: p3.2xlarge
+ AMI: "Amazon Linux" > "Deep Learning AMI GPU PyTorch 1.12.0 (Amazon Linux 2) 20220817"
+ ストレージ: 汎用SSD(GP3) 100GiB **※デフォルトの45GiBでは足りません**
+ その他、キーペアやセキュリティグループ、パブリックIP自動割り当て等の基本項目は適切に設定してください。

起動が完了したらSSHで接続してサーバーセットアップ作業へ進みます。

## サーバーセットアップ作業
ここからの作業手順では特に明記のない限り全て ec2-user で行います。

### git LFSのインストール
Stable Diffusionのモデルデータはgit lfsで管理されているため、git lfsを事前にセットアップしておきます。
```bash
# epelをインストール
sudo amazon-linux-extras install -y epel

# git lfsをインストール
sudo yum install -y git-lfs

# git lfsを有効化
git lfs install
```

### NVIDIA CUDA Toolkitをインストール
以下のURLで案内されているインストール方法をもとに、セットアップを進めます。
https://developer.nvidia.com/cuda-11-3-1-download-archive?target_os=Linux&target_arch=x86_64&Distribution=RHEL&target_version=8&target_type=runfile_local
```bash
# ここからrootで作業
sudo su -

# NVIDIA CUDA Toolkitをインストール
# ※何度かプロンプトが出るので全てAccept、OKまたはYesで答える
mkdir ~/install
cd ~/install
wget https://developer.download.nvidia.com/compute/cuda/11.3.1/local_installers/cuda_11.3.1_465.19.01_linux.run
sudo sh cuda_11.3.1_465.19.01_linux.run
```

インストールに成功すると以下のログが表示されます。
```
===========
= Summary =
===========
 
Driver:   Installed
Toolkit:  Installed in /usr/local/cuda-11.3/
Samples:  Installed in /root/, but missing recommended libraries
 
Please make sure that
 -   PATH includes /usr/local/cuda-11.3/bin
 -   LD_LIBRARY_PATH includes /usr/local/cuda-11.3/lib64, or, add /usr/local/cuda-11.3/lib64 to /etc/ld.so.conf and run ldconfig as root
 
To uninstall the CUDA Toolkit, run cuda-uninstaller in /usr/local/cuda-11.3/bin
To uninstall the NVIDIA Driver, run nvidia-uninstall
Logfile is /var/log/cuda-installer.log
```

続いてcuDNNライブラリのインストールを行います。以下のURLに書かれたガイドに従い、ファイルの移動を行います。
https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#installlinux-tar
```bash
# ※引き続きrootで作業します

# cuDNNのインストール
# ※事前準備でダウンロードしてきたものをSFTP等で以下のパスに転送する
# 転送先パス: /root/install/cudnn-linux-x86_64-8.5.0.96_cuda11-archive.tar.xz

# ファイルを解凍
cd ~/install
tar Jxfv cudnn-linux-x86_64-8.5.0.96_cuda11-archive.tar.xz
cd cudnn-linux-x86_64-8.5.0.96_cuda11-archive/

# デプロイ
cp include/cudnn*.h /usr/local/cuda/include 
cp -P lib/libcudnn* /usr/local/cuda/lib64 
chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

# root作業を終了してec2-userに戻ります
exit
```

### StableDiffusion本体のインストール
```bash
# StableDiffusion本体をダウンロード
cd ~/
git clone https://github.com/CompVis/stable-diffusion

# condaの初期化
conda init bash

# 環境設定
cd ~/stable-diffusion
conda env create -f environment.yaml

# 学習モデルをダウンロード
# ※ここでHuggingFaceアカウント情報の入力を求められるので入力する(なぜか2回入力を求められます)
cd ~/
git clone https://huggingface.co/CompVis/stable-diffusion-v-1-4-original

# ~/stable-diffusion-v-1-4-original/sd-v1-4.ckpt のファイルサイズを確認する。
# ファイルサイズが4.0GBほどあればOK。サイズが異常に小さい場合はGit LFSの設定を疑う
# なお、この警告↓がでても気にしなくてOKです
# Encountered 1 file(s) that may not have been copied correctly on Windows: 

# 学習モデルを導入
cd ~/stable-diffusion/models/ldm
mkdir stable-diffusion-v1
mv ../../../stable-diffusion-v-1-4-original/sd-v1-4.ckpt stable-diffusion-v1/model.ckpt
```
ここで一度bashを再起動してください。condaが有効化され、プロンプトの先頭に(base)とつけばOKです。

### テスト実行
```bash
# conda環境を切り替える（プロンプトの先頭が (ldm) に変わります）
conda activate ldm

# 実行（初回のみ、いくつかのダウンロード処理が行われます）
cd ~/stable-diffusion
python3 scripts/txt2img.py --prompt "a photograph of an astronaut riding a horse" --plms
```
実行が終わると、以下のディレクトリに画像が出力されます。
```
~/stable-diffusion/outputs/txt2img-samples/grid-0000.png
~/stable-diffusion/outputs/txt2img-samples/samples/00000.png ～ 00005.png
```
これらの画像をSFTP等でローカルPCへ転送し、中身を確認してみてください。
grid-0000.pngには生成された6枚のサムネイルが、samples/*.pngにはそれぞれの画像が1枚づつ格納されています。

それでは楽しんでください！

# 参考にした記事
https://zenn.dev/koyoarai_/articles/02f3ed864c6127bb2049