ローカルPCのGPUでStable Diffusion Web UIを使って画像生成をしていましたが、高解像度になるとVRAMが足りない・・・このためにビデオカード買うのもなんだかなと思ったので、AWSのGPUを搭載したEC2インスタンスでStable Diffusion Web UIを使ってみました。
AWS 環境設定
セキュリティグループの設定
コンソールから「EC2」と検索→クリックし、左タブのセキュリティグループをクリックします。
右上セキュリティグループを作成をクリックし、インバウンドルールを以下のように設定します。
SSH ポート番号22 0.0.0.0/0
はEC2をAWS コンソール上で接続して操作するのに必要で、
カスタムTCP ポート番号7860 マイIP
はStable Diffusion Web UIを立ち上げたページにアクセスするのに必要です。
インスタンス起動&設定
今回はg5.xlargeインスタンスを用います。
g5 インスタンスはAWS NVIDIA A10G Tensor Core GPUを使用しており、GPUあたり24GBのVRAMが搭載されています。
私はvCPU制限緩和の申請が必要でしたのでそれも行いました。
EC2→制限→制限計算ツールのインスタンスタイプにg5と入れ、現在の制限が4未満だった場合、g5シリーズのインスタンスを立ち上げることができません。
画像右下の「オンデマンド制限の引き上げをリクエスト」からvCPU引き上げをリクエストしてください。
インスタンス設定内容
以下のように設定します。
- OS -> Ubuntu Server 22.04
- instance -> g5.xlarge
- キーペア -> なし(AWSコンソール上からの接続しか使わない為)
- セキュリティグループ -> セキュリティグループの設定で作成したもの
- ボリューム -> 必要に応じて(最低でも30GBは欲しい)
起動後、インスタンスを選択し、「接続」から以下画面に飛べるので接続します。
このように画面コマンドを打てるようになったら成功です。
Stable Diffusion Web UI動作環境設定
stable-diffusion-webui-dockerを使って環境を構築します。
各種インストール
GCC,Git,Docker,Docker Composeをインストールします。
$ sudo apt update
$ sudo apt install build-essential
$ gcc --version # gccインストールの確認
$ sudo apt install git
$ sudo apt install docker.io
$ sudo service docker start
$ docker --version # バージョンの確認
$ sudo mkdir -p /usr/local/lib/docker/cli-plugins
$ export VER=2.15.1 # 環境変数 VERにDocker Composeのバージョンを入れる(20230321時点では2.15.1が最新)
$ sudo curl \
-L https://github.com/docker/compose/releases/download/v${VER}/docker-compose-$(uname -s)-$(uname -m) \
-o /usr/local/lib/docker/cli-plugins/docker-compose
$ sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
$ sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose
$ docker-compose --version # docker compose バージョンの確認
Nvidia Driver,nvidia-container-toolkitをインストールします。
DRIVER_VERSION変数に入れるバージョンはNvidiaのDriverバージョン確認をしてから入力します。
入力の結果525.85.12でしたので、その値を入れています。
$ BASE_URL=https://us.download.nvidia.com/tesla
$ DRIVER_VERSION=525.85.12 # ドライバのバージョン確認が必要
$ curl -fSsl -O $BASE_URL/$DRIVER_VERSION/NVIDIA-Linux-x86_64-$DRIVER_VERSION.run
$ sudo sh NVIDIA-Linux-x86_64-$DRIVER_VERSION.run
この後画面が切り替わり以下のようになれば問題無しです。
Docker上でもGPUを認識させるためにnvidia-container-toolkitも入れます。
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
$ sudo apt update
$ sudo apt install -y nvidia-docker2
$ sudo nvidia-ctk runtime configure --runtime=docker
$ sudo systemctl restart docker
$ nvidia-smi # GPU認識確認
nvidia-smi
で以下のような画面になったらNvidiaのドライバーが入っています。
stable-diffusion-webui-dockerセットアップ&起動
$ git clone https://github.com/AbdBarho/stable-diffusion-webui-docker
$ cd stable-diffusion-webui-docker
プルしてきたdocker-compose.yml
に一部追記します。
CLI_ARGS=
に--no-half-vae --precision full --no-half
を書き加えます。
$ vi docker-compose.yml
auto: &automatic
<<: *base_service
profiles: ["auto"]
build: ./services/AUTOMATIC1111
image: sd-auto:49
environment:
- CLI_ARGS=--allow-code --medvram --xformers --enable-insecure-extension-access --api --no-half-vae --precision full --no-half # 引数を追加する
docker composeでモデルのダウンロードやセットアップを行います。
初回実行時は10分弱程度時間が掛かります。
$ sudo docker compose --profile download up --build
$ sudo docker compose --profile auto up --build
EC2コンソール接続の左下 パブリックIPに:7860
を付け足してブラウザのURL入力欄に張り付けて読み込みます。
このようにアクセスできたら成功です!(画像はGenerate後の結果)
Generateボタンを押せばEC2のGPUを使用して画像生成が始まります。詳しい操作方法はいろんなページを調べてみてください。
その他
AWS CLI+S3で以下のようなこともしてみました。
aws configure
でアクセスキーの入力をしています。必要な権限を持っているIAMユーザーのキーをお使いください。
他モデルの使用
S3に他モデルをアップロードして、AWS CLIを用いてデータのやり取りをします。
適当なバケットを作りそこにモデルやLora等アップロードし、syncコマンドでEC2インスタンスのボリュームへコピーします。
$ sudo apt install awscli
$ aws --version # aws cliバージョン確認
$ aws configure # アクセスキー設定
# chmodで権限を変更してからSync
$ cd data
$ sudo chmod 777 StableDiffusion
$ aws s3 sync s3://xxxxxxxxxxxx/expansion/model/ ./StableDiffusion
$ sudo chmod 777 Lora
$ aws s3 sync s3://xxxxxxxxxxxx/expansion/lora/ ./Lora
この後は再度stable-diffusion-webui-dockerセットアップ&起動のsudo docker compose
の2行を実行しなおします。
生成画像をS3へ保存
生成画像はoutputフォルダに入っているので、S3の指定のバケットURIへSyncすればOKです。
$ aws s3 sync ./output s3://xxxxxxxxxxxx/generated-photos/
まとめ
EC2のGPU搭載インスタンスでStable Diffusionを使い画像を生成することができました。
ローカルPCのGPUを使わないので、画像生成中にゲームもできますし便利です!
VRAMも24GBあるため、高い解像度の画像生成もできそうです。
720x1280の出力では11GB程VRAMを消費していました。
ここまで見ていただきありがとうございました。何か改善点や間違い等あればご指摘いただければと思いますm(__)m
参考ページ