AI画像生成を試してみた (AWSにGPUインスタンスを立てて、Stable Diffusionを使ってみる)

お疲れ様です。がみです。

AI画像生成、何かと話題になっていますよね。悪い方の話題が多きがしますが…。それでも、絵が描けない我々にとっては画期的ですし、イラスト描ける人でも上手く扱うとすごく便利だと思うんですよね(もう使ってるのかな?)。私もね、いい加減試してみないとなと思いまして、さっそくやってみました。エッ….な画像も生成してみたいですしね。

ローカルPCでお試し

ということで、ローカルPCでStable Diffusion web UIを使って画像生成をやってみました。詳細は省きますが、特定のモデルが上手く動きませんでした。VRAM 8GB 程度じゃダメなんだね…(´・ω・`)

無いなら買うなり借りるなりすればよい。ただ、このためだけにグラボ買い替えるのはさすがにもったいない。ということで、AWSでGPUインスタンスをお借りして、AI画像生成を試してみました。それをメモ書きとして残します。

やること

実施する作業です。下記を頑張れば使えるようになるでしょう…

  • AWS上にGPUインスタンスを立てる

  • docker上でStable Diffusion web UI (AUTOMATIC1111)を動かす

  • 動かすための環境を整える

  • (ある程度は安くすませる)

ある程度安くしたいとは?

GPUインスタンス、意外と高いです。料金を調べたところ、g5.xlarge 1.459 USDになっています。これは、あまりよろしくない気がします。起動時間を短くするなり、色々しないと、3時間で500JPY吹っ飛んでいくんじゃやってられません。また、起動するには、Amazon Elastic Block Store (Amazon EBS) が必要で、0.096USD/GB 月 くらいのお値段になります。計算してると結構持っていかれそうです。このあたりも考えていきます。

作業を進めていく

実際に作業を進めていきます。noteを書きながらやっていくのでお金がいっぱいかかる気がしますが、作業を進めていきます。

GPUインスタンスを起動…?

まず、GPUインスタンスを立てていきます。ここでオンデマンドインスタンスを立ててしまうと、上で書いたお値段がかかってくるので、スポットインスタンスを利用します。軽く調べてみると、オンデマンドと比べて超安いです。

過去1週間の値段

ただ、これだと少し不十分で、大人気のインスタンスはキャパシティが足りなさ過ぎて、起動できなかったり落ちたりします。状況を見てみましょう。(https://aws.amazon.com/jp/ec2/spot/instance-advisor/)

結構人気みたい

最新世代?のインスタンスなだけあって、ちょっと厳しそうです。ということで、1つ前の世代を見てみます。

結構安くなりました!
人気も低め!

良い感じですね。これなら3時間使っても1USD行かないですよ!!これで進めていきましょう。

GPUインスタンスを起動する

インスタンスを起動していきましょう。あ、言うのを忘れていましたが、GPUを使用できる数の規制緩和をしないと、GPUインスタンスを起動できないので注意です。英作文をChatGPT頼みました。それでは進めていきます。

g4dn.xlarge 、Ubuntuを選択して進めていきます。

g4dn.xlargeを選択

ポート番号22、7860を開けたセキュリティグループを作って、諸々を設定していきます。ストレージはケチって、20GBのgp3に設定します。必要最低限の環境だけ整えて、その他データ類はインスタンスストアの方へ配置する形を取ります。コスト自体はインスタンス料金に含まれるらしく、実質タダみたいなものです。

ストレージはケチる

高度な設定からスポットインスタンスをリクエスト。リクエストタイプ永続、中断動作を停止に設定して起動します。

スポットインスタンスをリクエストして起動

下のようになれば起動完了です。

起動完了

DockerEnginのインストール

公式のページなりを見てインストールを進めていきます。

aptリポジトリからインストールするための準備


$ sudo apt-get update
$ sudo apt-get install ca-certificates curl gnupg
$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpg
$ echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Docker Engineのインストール

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

最終的に下のように出力されていれば問題ないでしょう。

$ sudo docker -v
Docker version 24.0.2, build cb74dfc
$ docker compose version
Docker Compose version v2.18.1 

NVIDIA DRIVERのインストール

下記ページからドライバをインストールします。

今使ってるGPUインスタンスが、Tesla T4を利用しているので、この条件でサーチします。

ドライバの検索

このドライバをインストールしていきます。

これをダウンロードする

Agree & Downloadのリンクを取得します

リンク取得

下記コマンドでダウンロード、ファイルを実行します。

$ curl -fSsl -O https://us.download.nvidia.com/tesla/525.105.17/NVIDIA-Linux-x86_64-525.105.17.run
$ sudo sh NVIDIA-Linux-x86_64-525.105.17.run

インストール中にエラーが発生しました。gcc入れるの忘れていたようです。インストールします。

途中でエラーが発生
$ sudo apt install build-essential

下の画面が出たら完了です。

動作確認として下記コマンドも実行しておきます。問題なく情報が取得できるようになりました。

$ nvidia-smi
Fri May 26 14:35:02 2023       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.105.17   Driver Version: 525.105.17   CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla T4            Off  | 00000000:00:1E.0 Off |                    0 |
| N/A   52C    P0    27W /  70W |      2MiB / 15360MiB |      4%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

nvidia-container-toolkitのインストール

今回も同様に下記ページからインストールしていきます。docker無いでGPUが使えるようにします。

dockerの時と同様に、リポジトリ、GPGキーの設定を行います。

$ 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-get update
$ sudo apt-get install -y nvidia-container-toolkit
$ sudo nvidia-ctk runtime configure --runtime=docker

docker側から見ることが出来ることを確認できればOKです。

$ sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
Unable to find image 'nvidia/cuda:11.6.2-base-ubuntu20.04' locally
11.6.2-base-ubuntu20.04: Pulling from nvidia/cuda
846c0b181fff: Pull complete 
b787be75b30b: Pull complete 
40a5337e592b: Pull complete 
8055c4cd4ab2: Pull complete 
a0c882e23131: Pull complete 
Digest: sha256:9928940c6e88ed3cdee08e0ea451c082a0ebf058f258f6fbc7f6c116aeb02143
Status: Downloaded newer image for nvidia/cuda:11.6.2-base-ubuntu20.04
Fri May 26 14:38:48 2023       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.105.17   Driver Version: 525.105.17   CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla T4            Off  | 00000000:00:1E.0 Off |                    0 |
| N/A   31C    P0    25W /  70W |      2MiB / 15360MiB |      4%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+


stable-diffusion-webui-dockerを起動する

ここまで来たら、実際に起動していく形になります。下記リポジトリのSetupとかを参考しつつ、進めていきます。
https://github.com/AbdBarho/stable-diffusion-webui-docker

資材をpullする

下記コマンドを実行

$ git clone https://github.com/AbdBarho/stable-diffusion-webui-docker

容量が足りないので、インスタンスストアボリュームを利用する

下記コマンドを実行していきます。一部のフォルダをインスタンスストアボリュームに移動させて、シンボリックリンクで参照する形を取っています。ルートボリュームは20GBしかないので、この方法で容量を確保します。

$ sudo mkfs -t xfs /dev/nvme1n1
$ mkdir stable-diffusion-data 
$ sudo mount /dev/nvme1n1 /home/ubuntu/stable-diffusion-data/
$ sudo chown ubuntu:ubuntu stable-diffusion-data/
$ chmod 777 stable-diffusion-data/
$ mv stable-diffusion-webui-docker/data/ stable-diffusion-data/
$ mv stable-diffusion-webui-docker/services/ stable-diffusion-data/
$ mv stable-diffusion-webui-docker/output/ stable-diffusion-data/
$ ln -s /home/ubuntu/stable-diffusion-data/data ./stable-diffusion-webui-docker/data
$ ln -s /home/ubuntu/stable-diffusion-data/output ./stable-diffusion-webui-docker/output
$ ln -s /home/ubuntu/stable-diffusion-data/services ./stable-diffusion-webui-docker/services
$ ll ./stable-diffusion-webui-docker

下記3行があることを確認
data -> /home/ubuntu/stable-diffusion-data/data/
output -> /home/ubuntu/stable-diffusion-data/output/
services -> /home/ubuntu/stable-diffusion-data/services/

設定ファイルを書き換える

docker-compose.ymlのCLI_ARGS=--no-half-vae --precision full --no-halfを追加します。ローカルで実施したときのメモに残っていたのですが、どこから持ってきたかは不明です…

オプションを追記する

下記コマンドを実行して待機(それなりにかかります)。

$ cd ~/stable-diffusion-webui-docker/
$ sudo docker compose --profile download up --build
$ sudo docker compose --profile auto up --build -d

「IPアドレス:7860」をブラウザに入力し、下記ページが表示されたらOKですGenerateで画像が出てくれば上手くいってます。

画像が出てきた

データをS3バケットに退避し、新たにモデルデータを追加する

WebUIの停止

一度、WebUIを停止します。

sudo docker compose --profile auto down

データ退避

ここではデータを退避します。aws-cliのインストールから実施します
xxx…は作成したバケット名を記載してください。

$ sudo apt install awscli
$ aws configure
$ sudo chmod -R 777 ~/stable-diffusion-data/

$ aws s3 sync ./data s3://xxxxxxxxxxxxxx/stable-diffusion-data/data
$ aws s3 sync ./services s3://xxxxxxxxxxxxxxxx/stable-diffusion-data/services
$ aws s3 sync ./output s3://xxxxxxxxxxxxxxxx/stable-diffusion-data/output

下記のようにS3に保存されます

S3バケットに保存

EBSが0.096USD/GB 月、スナップショットで0.05USD/GB 月
S3バケットが0.025USD/GB 月 AWSサービス内でのデータ転送のため、点送料はかかりません。
一応こちらの方が得です。EBSは増やすことは出来ても減らせないし、容量分お金かかりますからね。なお、S3バケットとか言わなくても、モデルデータを毎回アップロードする方が安上がりだとは思います。

新たにモデルを追加

下記のバケットにモデルをアップロードする。

ここにモデルを追加

EC2へ転送

下記コマンドで移動する。権限問題で上手く起動できないことがあるので、権限を再付与する。雑に行きます。

$ cd ~
$ sudo chmod -R 777 ~/stable-diffusion-data/
$ aws s3 sync s3://xxxxxxxxxxxxxxxxxxxx/stable-diffusion-data/ ./stable-diffusion-data
$ sudo chmod -R 777 ~/stable-diffusion-data/

再度WebUIを起動

下記コマンドを実行してしばらく待ちます。

$ cd ~/stable-diffusion-webui-docker/
$ sudo docker compose --profile auto up -d

新しく追加したモデルを選択し、実行して画像を出力していきます。サンプルプロンプトを軽くパクって出力してみました。1分もかからず出てきました。すごいですね。

出てきた!!

AMIを作成する

このままインスタンスを停止してしまうと、データが消失します。ストレージを残す設定にしたり切り離したりする必要があるのですが、今回は、マシンイメージを作成する方向にします。

イメージの作成
イメージの作成実行

しばらくの間は保留中になるので待機です。完了すればステータス利用可能になります。

待機!

インスタンスを終了する

イメージの作成が完了した際、終了したい場合は下記からリクエストをキャンセルしてください。この手順を忘れると、起動出来る限り起動し続けるので、ひどいことになります。

リクエストをキャンセル

時間がたつと、インスタンスが終了されます。

インスタンスを終了中

AMIからインスタンスを起動する

AMIから起動していきます。

ここから起動

はじめのインスタンス起動と同様に設定していきます。が、起動テンプレート?とか作った方がよさそうです。

データを復元して、再度起動する

下記のコマンドを実行します。インスタンスストアボリュームをマウントしなおして、S3に保存したデータを戻します。

$ cd ~
$ sudo mkfs -t xfs /dev/nvme1n1
$ sudo mount /dev/nvme1n1 /home/ubuntu/stable-diffusion-data/
$ sudo chown ubuntu:ubuntu stable-diffusion-data/
$ chmod 777 stable-diffusion-data/
$ aws s3 sync s3://XXXXXXXXXXXXXX/stable-diffusion-data/ ./stable-diffusion-data 
$ sudo chown -R ubuntu:ubuntu stable-diffusion-data/
$ sudo chmod -R 777 ~/stable-diffusion-data/
$ cd ~/stable-diffusion-webui-docker/
$ sudo docker compose --profile auto up -d

再度ページにアクセスできれば成功です。

まとめ

AI画像生成にチャレンジすることができました。お値段も滅茶苦茶高いってことは無いと思います。私は検証のためにそれなりの時間を起動していたため、少しだけお金がかかりましたが。

ただ、使いこなすのは難しそうだなと感じました。私はだいぶ満足しましたが、ガチャ感覚でイラストを生成しまくるのはいいかもしれません。Not safe for…な画像ももちろん出力できます。

最後まで見ていただいてありがとうございました。何か改善点などがあればご指摘いただきたいです。


この記事が気に入ったらサポートをしてみませんか?