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インスタンスを立てていきます。ここでオンデマンドインスタンスを立ててしまうと、上で書いたお値段がかかってくるので、スポットインスタンスを利用します。軽く調べてみると、オンデマンドと比べて超安いです。
ただ、これだと少し不十分で、大人気のインスタンスはキャパシティが足りなさ過ぎて、起動できなかったり落ちたりします。状況を見てみましょう。(https://aws.amazon.com/jp/ec2/spot/instance-advisor/)
最新世代?のインスタンスなだけあって、ちょっと厳しそうです。ということで、1つ前の世代を見てみます。
良い感じですね。これなら3時間使っても1USD行かないですよ!!これで進めていきましょう。
GPUインスタンスを起動する
インスタンスを起動していきましょう。あ、言うのを忘れていましたが、GPUを使用できる数の規制緩和をしないと、GPUインスタンスを起動できないので注意です。英作文をChatGPT頼みました。それでは進めていきます。
g4dn.xlarge 、Ubuntuを選択して進めていきます。
ポート番号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に保存されます
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…な画像ももちろん出力できます。
最後まで見ていただいてありがとうございました。何か改善点などがあればご指摘いただきたいです。
この記事が気に入ったらサポートをしてみませんか?