LoginSignup
38
20

More than 1 year has passed since last update.

AWS EC2 GPUインスタンスでStable Diffusionを使う

Last updated at Posted at 2023-03-21

ローカルPCのGPUでStable Diffusion Web UIを使って画像生成をしていましたが、高解像度になるとVRAMが足りない・・・このためにビデオカード買うのもなんだかなと思ったので、AWSのGPUを搭載したEC2インスタンスでStable Diffusion Web UIを使ってみました。

AWS 環境設定

セキュリティグループの設定

コンソールから「EC2」と検索→クリックし、左タブのセキュリティグループをクリックします。

image.png

右上セキュリティグループを作成をクリックし、インバウンドルールを以下のように設定します。

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は欲しい)

起動後、インスタンスを選択し、「接続」から以下画面に飛べるので接続します。

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3633353037392f38313064316536342d316561302d663862342d3662613.png

このように画面コマンドを打てるようになったら成功です。

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バージョン確認をしてから入力します。

Official Drivers _ NVIDIA.png
入力の結果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

この後画面が切り替わり以下のようになれば問題無しです。

2つほど警告が出ますがそのまま進めればインストール完了

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
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入力欄に張り付けて読み込みます。

Stable Diffusion.png

このようにアクセスできたら成功です!(画像は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

参考ページ

38
20
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
20