はじめに
みなさん、こんにちは ! VTuber 大好きソリューションアーキテクトの小林 D です。
突然ですが、みなさんは Stable Diffusion という画像生成 AI を使ったことはありますか ? Stable Diffusion は英国の Stability.AI 社が開発した、入力したテキスト (プロンプト) から画像を生成することができる画像生成 AI です。
Stable Diffusion はオープンソースのモデルとなっており、Amazon SageMaker JumpStart 上でも簡単に動かすことができます。
以下は SageMaker JumpStart で Stable Diffusion を利用する AWS Blog の記事です。
Stable Diffusion で画像の部分的な差し替えを行う環境を、 Amazon SageMaker JumpStart で簡単に構築する
たった数枚の画像で Stable Diffusion をファインチューニングできる効率的な Amazon SageMaker JumpStart の使い方
このように、SageMaker JumpStart を使うことで、SageMaker や Jupyter Notebook に慣れた方は簡単に Stable Diffusion のをデプロイし、システムに組み込むことができます。
一方で、システムに組み込むのではなく、業務の補助ツールとして Stable Diffusion を利用したい、というニーズもあります。
実際に、お客様に対して SageMaker JumpStart の画面をお見せして画像生成のデモをした際、デザイナーの方から「自分でも弄ってみたいけど、Python や Jupyter Notebook に馴染みがないので難しそう」「GUI で細かくパラメータ調整をしたい」というお声をいただくことがありました。

Stable Diffusion Web UI
そこで利用できるのが AUTOMATIC1111 氏が公開している Stable Diffusion Web UI です。
Stable Diffusion Web UI ではブラウザベースの UI で Stable Diffusion を利用することができるツールとなっています。そのため、コードを書くことなく、様々なパラメータを直感的に操作することが可能です。
ということで、この記事では Amazon EC2 を利用して、AWS 上に Stable Diffusion Web UI を利用できる環境を作っていきたいと思います !

ご注意
本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。
builders.flash メールメンバー登録
builders.flash メールメンバー登録で、毎月の最新アップデート情報とともに、AWS を無料でお試しいただけるクレジットコードを受け取ることができます。
1. 事前準備
Stable Diffusion web UI を実行するために、インスタンスタイプ g4dn.xlarge の EC2 インスタンスを起動します。
デフォルトでは GPU インスタンスのクォータ (起動台数の上限) が 0 に設定されているため、クォータの引き上げを行いましょう。
クォータを確認したいリージョンを選択
こちらのリンク から「Running On-Demand G and VT instances」 のページを開きます。
ページが開いたら、「リージョン」を選択 を押してクォータを確認したいリージョンを選択します。
※この記事の手順ではバージニア北部リージョンを利用します

クォータの引き上げをリクエスト
適用されたクォータ値の値を確認し、値が 4 未満であれば「クォータの引き上げをリクエスト」を押して、クォータを 4 以上に引き上げます。
※ なぜ 4 以上に引き上げるかというと、Running On-Demand G and VT instances の設定値はインスタンスの数ではなく vCPU の数になっているからです。g4dn.xlarge インスタンスが利用する vCPU 数は 4 です。そのため、最低 4 vCPU で申請を行いましょう。

g4dn.xlarge インスタンスについて
今回利用する g4dn.xlarge インスタンスは、NVIDIA T4 GPU を搭載した GPU インスタンスです。他の多くのAWS サービスと同様に、EC2 インスタンスは利用した分の従量課金となっており、バージニア北部 (us-east-1) リージョンで g4dn.xlarge インスタンスを利用する場合、1 時間あたり 0.526 ドルで利用することができます。
1 日 6 時間利用したとしても、料金は 0.526 x 6 = 3.156 ドル。1 ドル 140 円換算でも 441 円です !
ランチの牛丼一杯分のお値段で、6 時間画像を作り放題ということになりますね !
※ 利用料はリージョンによって異なります、us-east-1、 us-east-2、us-west-2 など北米のリージョンは EC2 インスタンスを比較的安価に利用することが可能です。それぞれのリージョンの最新の料金については料金ページをご確認ください。
2. Amazon VPC の作成
2-1. VPC を作成する
では、クォータが問題なければ、早速 EC2 インスタンスを起動し、Stable Diffusion Web UI をインストールしていきましょう !
まずは、EC2 インスタンスを立ち上げるための VPC を用意します。VPC は AWS アカウント内に作成される、プライベートな仮想ネットワークのことです。
VPC を選択

VPC を作成

VPC の設定
VPC の作成画面が表示されるので、「VPC など」を選択します。
「名前タグの自動生成」欄に、任意の名前を入力しましょう。ここでは stable-diffusion とします。

プレビューを確認

オプション設定
その他の値はデフォルトのままで問題ありません。
画面を一番下までスクロールし、「VPC を作成」を押します。

VPC ワークフローの作成
VPC に加えて、インターネットに接続するための経路であるインターネットゲートウェイや、ルートテーブルの設定などが自動的に行われます。
「成功」が表示されたら、右下の「VPC を表示」を押しましょう。

2-2. VPC ID の値を確認する
表示された VPC ID の値を控えておきます。
※ Stable Diffusion Web UI 環境を立ち上げる際、VPC を指定するために利用します。

2-3. サブネット ID の値を確認する
画面下の Resource map 欄に表示されているサブネットを確認します。
サブネットは、VPC を小さく分割したネットワークセグメントのことです。
名前の中に public と入ったサブネットと、private が入ったサブネットが 2 つずつ作成されています。前者はパブリックサブネットと呼ばれており、インターネットへアクセスする経路があるサブネットのことを指します。後者はプライベートサブネットと呼ばれており、インターネットへアクセスする経路がない、閉じたサブネットのことを指します。
今回はパブリックにアクセス可能な環境を作成するため、EC2 インスタンスが起動するサブネットはパブリックサブネットを指定します。
パブリックサブネットの ID を確認するため、「stable-diffusion-subnet-public1...」という名前のサブネットをクリックして、サブネットの詳細画面を開きましょう。

サブネット ID の値を保存

3. AWS CloudFormation でリソースを作成する
3-1. Github リポジトリを確認する
Stable Diffusion Web UI on AWS の Github リポジトリ をブラウザで開きます。このリポジトリには 4 種類の AWS CloudFormation テンプレートが用意されています。
CloudFormation は AWS リソースの構築をコードによって行うことができるサービスです。YAML または JSON 形式で、AWS のリソースの構成を記述したテンプレートファイルを用意し、CloudFromation に読み込ませることで、自動的にリソースを作成することができます。
今回は、このリポジトリにある CloudFormation テンプレートを使って、Stable Diffusion Web UI の実行環境を作成していきます。
このリポジトリには 4 種類の異なる構成のテンプレートがあります。以下に、それぞれのテンプレートの内容をまとめました。
- sd-webui.yaml
- EC2 上に Stable Diffusion Web UI が起動する環境を用意します。パブリックにアクセスすることが可能です。
- 一方で、セキュリティ上の理由 から UI 経由で拡張機能をインストールができないなど、機能に制約があります。
- sd-webui-private.yaml
- EC2 上 に Stable Diffusion Web UI が起動する環境を用意するところは sd-webui.yaml と変わりませんが、EC2 をパブリックに開放せず、プライベートなアクセスに限った環境を用意する、という違いがあります。
- こちらのテンプレートで作成した Stable Diffusion Web UI にはパブリックにアクセスをすることはできませんが、AWS Systems Manager のセッションマネージャーという機能を利用することで、EC2 にポートフォワーディングを行い、プライベートに Stable Diffusion Web UI を利用することが可能です。
- また、File Browser というツールが EC2 にインストールされるため、ブラウザから EC2 内のディレクトリにアクセスし、ファイルの管理を行うことができます。
- sd-webui-kohya-private.yaml
- sd-webui-private.yaml の機能に加えて、Kohya’s GUI がインストールされます。こちらは、GUI ベースでモデルのトレーニングができるツールです。お手元の画像を File Browser 経由で EC2 にアップロードし、Kohya’s GUI でトレーニングをしてみる…といったことが可能になります
- sd-webui-kohya-private-s3.yaml
- sd-webui-kohya-private.yaml の機能に加えて、オブジェクトストレージの S3 が EC2 にマウントされます。File Browser 経由で S3 にアクセスすることもできるため、非常に便利です。
今回は、最もシンプルな sd-webui.yaml を利用して環境を構築していきます。
3-2. CloudFormation テンプレートを読み込む
CloudFormation テンプレートをダウンロードし、マネジメントコンソールから読み込む方法もあるのですが、「Launch Stack」ボタンを押すことで、直接 CloudFormation のスタック作成ページに飛ぶことができます。
sd-webui.yaml の左にある「Launch Stack」ボタンを押しましょう。

3-3. スタックの詳細の入力
「Launch Stack」ボタンを押すと sd-webui.yaml テンプレートが自動的に読みこまれ、CloudFormation スタックの詳細を設定する画面が開きます。
起動する EC2 の設定や、Stable Diffusion Web UI のバージョン情報などはデフォルトの値が設定されているため、SubnetId と VpcId の値に、先ほど控えた「サブネット ID の値」、「VPC ID の値」をそれぞれ設定し、「スタックの作成」を押しましょう。
ここで指定した VPC のサブネットに、EC2 インスタンスが起動します。

構築完了
スタックの作成が開始されると、CloudFormation の「イベント」タブにリソースの作成状況が表示されます。
数分ほど待って、論理 ID 欄が sd-webui (スタック名) のレコードのステータス欄が CREATE_COMPLETE ステータスに変わった後、10 分ほど待つと環境構築が完了します。
※ CREATE_COMPLETE が表示された時点で EC2 インスタンスの作成は完了していますが、EC2 インスタンスの内部で Stable Diffusion Web UI のインストール等が実行されるため、ブラウザから接続できる準備が整うまで 10 分程度かかります

3-4. 作成されたリソースを確認する
「出力」タブを確認すると、作成されたリソースの情報を確認することができます。
- InstanceID : EC2 インスタンスの ID です。
- Publicip : EC2 インスタンスに割り当てられた IP アドレスです。
Publicip の IP アドレスの値はこのあと Stable Diffusion Web UI に接続する際に利用するので、控えておきましょう。

EC2 インスタンスの作成に失敗する場合

スタックを再度作成する場合
クォータの引き上げ後、スタックを再度作成する際には、作成に失敗したスタックは削除しておきましょう。
「削除」ボタンからスタックの削除を行うことができます。
スタックの削除後、再度 Github リポジトリの「Launch Stack」ボタンからスタックを作成しましょう。

4. Stable Diffusion Web UI の実行状況を確認する
4-1. Amazon EC2 インスタンスに接続する

実行中のインスタンスを選択

インスタンスに接続
CloudFormation によって作成された sd-web-ui-cf インスタンスが実行中になっています。
インスタンスを選択し、「接続」を押しましょう。

EC2 Instance Connect を使用して接続する
インスタンスの接続画面が開くので「EC2 Instance Connect」タブが選択されていることを確認し、「EC2 Instance Connect を使用して接続する」を選びます。
右下の「接続」ボタンを押して、ブラウザ経由で EC2 インスタンスに接続しましょう。

接続成功

4-2. Stable Diffusion web UI のログを確認する
では、Stable Diffusion web UI の実行状況を確認しましょう。
Stable Diffusion web UI のログを確認
以下のコマンドを実行し、Stable Diffusion web UI のログを確認します。
cd /home/ubuntu/
cat sd-webui-log.txt
出力ログ確認
特にエラーがなく、以下のようなログが出力されていれば起動が完了しています。
Calculating sha256 for /home/ubuntu/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors: Running on local URL: http://127.0.0.1:7860
To create a public link, set `share=True` in `launch()`.
5. Stable Diffusion Web UI に接続する
5-1. ブラウザからアクセスする
ブラウザを起動し、http://<PublicIP>:7860 にアクセスしましょう。
※ <PublicIP> の値は CloudFormation でリソースを作成した際に控えた IP アドレスです。
アクセス成功

お猫様の画像を生成
試しにお猫様の画像を生成してみましょう。Prompt に a cat と入力し、「Generate」を押します。
かわいいお猫様が出力されました !

5-2. インスタンスへの接続を制限する
Stable Diffusion Web UI をパブリックに利用できる環境を作ることができました。
ですがこの状態だと、Public IP の値を知っていれば誰でも Stable Diffusion Web UI を使うことができてしまいます。セキュリティを高めるため、アクセス元の IP を制限してみましょう。
表示されているセキュリティグループ ID を選択
EC2 のインスタンス一覧を開き、sd-web-ui-cf インスタンスを選択します。
画面下に表示される「セキュリティ」タブを選択し、「セキュリティグループ」欄に表示されているセキュリティグループ ID を押しましょう。

インバウンドのルールを編集

IP アドレスを制限
現在はポート 22 と 7860 に対して、0.0.0.0/0 からのアクセスが許可されています。0.0.0.0/0 はすべての IP アドレスを意味しているため、どこからでもアクセスができる状態になっています。
こちらを自分の IP アドレスだけに絞りましょう。

自分の IP アドレス以外を制限

マイ IP を選択
「カスタム」→「マイ IP」を選択します。
現在操作を行っている環境の IP アドレスが自動的に入力されます。

設定を保存
このように、自分の IP アドレスが設定されれば OK です。
「ルールを保存」ボタンを押して、設定を保存しましょう。

アクセス制限完了 !
変更後のインバウンドルールのソース欄の値が、自身の IP アドレスの値になっていれば変更は完了です。
ここで指定した IP アドレス 以外からは Stable Diffusion Web UI にアクセスできないようになりました !

6. インスタンスを停止する
インスタンスの停止の手順
対象の EC2 インスタンスを選択し、「インスタンスの状態」→「インスタンスの停止」を押すことで、EC2 インスタンスを停止することができます。
再度 Stable Diffusion Web UI を触りたいときは、「インスタンスの状態」→ 「インスタンスを開始」を押すことで、インスタンスを起動することが可能です。
※ このとき「インスタンスを終了」を押すと、EC2 インスタンスが削除されてしまい、生成した画像も一緒に消えてしまうためご注意ください。

Stable Diffusion Web UI 環境 の

7. おわりに
筆者プロフィール
小林 大樹
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト
VTuber をこよなく愛するソリューションアーキテクト。普段は業種業界問わず、様々なお客様のプロダクト開発をサポートさせていただいております。悩みは推し VTuber が増えすぎて視聴時間を確保できないことです。

Did you find what you were looking for today?
Let us know so we can improve the quality of the content on our pages