メインコンテンツに移動
デベロッパーのためのクラウド活用方法

Stable Diffusion on AWS による非同期画像生成ソリューションを試してみよう !

2025-05-01 | Author : 大西 啓太郎

はじめに

生成 AI の進化により、高品質な画像生成が身近になりつつある中、その実運用環境の構築は依然として課題となっています。特にゲーム開発やデジタルコンテンツ制作の現場では、「制作スケジュールが厳しい中、キャラクターバリエーションの作成に時間がかかりすぎている」、「デザインイメージを探索する過程で複数のバリエーションを素早く生成し、それを元に企画を具体化していきたい」といった要望が頻繁に見られます。これらの要望を満たすために、Stable Diffusion のような高度な生成モデルを活用したいニーズが高まっていますが、これらのモデルは大量の GPU リソースを必要とし、効率的な運用が求められます。

本記事では、AWS が提供する「Guidance for Asynchronous Image Generation with Stable Diffusion on AWS」を紹介します。このリファレンスアーキテクチャは、サーバーレスコンポーネントとコンテナサービスを組み合わせた非同期処理アプローチにより、コスト効率とパフォーマンスを両立しています。

このソリューションは独自のカスタムモデルを簡単に利用できる柔軟性と、24 時間 365 日稼働させる必要がない場合に GPU インスタンスをゼロにスケールできるコスト最適化機能を備えています。クリエイティブワークの負荷変動に対応しながら、アートスタイルの実験やプロトタイプ制作を効率的に進められる環境を提供します。

オープンソースで提供されるこのソリューションを活用し、デジタルコンテンツ制作の現場で需要に応じて柔軟にスケールする画像生成システムを構築する方法を解説します。


X ポスト » | Facebook シェア » | はてブ »

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

*ハンズオン記事およびソースコードにおける免責事項 »

builders.flash メールメンバー登録

builders.flash メールメンバー登録で、毎月の最新アップデート情報とともに、AWS を無料でお試しいただけるクレジットコードを受け取ることができます。

今すぐ登録 »

1. Guidance for Asynchronous Inference with Stable Diffusion とは ?

AWS が提供する「Guidance for Asynchronous Image Generation with Stable Diffusion on AWS」は、人気のオープンソース生成 AI モデルである Stable Diffusion を、スケーラブルかつコスト効率の高い方法で AWS 上に実装するためのリファレンスアーキテクチャです。このソリューションは完全にオープンソースで公開されており、自由に利用・改変が可能です。

本ソリューションの特徴は、サーバーレスコンポーネントとコンテナサービスを巧みに組み合わせることで、画像生成リクエストを効率的に処理できる非同期アーキテクチャを実現している点です。フロントエンドには Amazon API Gateway、AWS Lambda、Amazon SQS といったサーバーレスサービスを採用し、バックエンドでは Amazon EKS (※1) 上の Stable Diffusion コンテナが画像生成を担当します。サポートしている Stable Diffusion ラインタイムは、「Stable Diffusion Web UI」(txt2img, img2img, extra-single-file)、「ComfyUI」(pipeline) に対応しています。

特筆すべきは、Kubernetes 上でイベント駆動型のオートスケールを実現する KEDA (Kubernetes Event Driven Auto-Scaler) (※2) Karpenter (※3) を活用したダイナミックな自動スケーリング機能です。SQS キューの長さに基づいて EKS ポッドを自動的にスケールアウトし、Karpenter が必要な GPU インスタンスをプロビジョニングします。新規ノードは通常 2 分以内で立ち上がり、リクエスト処理を開始できます。

コスト効率も優れており、Amazon EC2 スポットインスタンス (※4) を活用することで最大 70% のコスト削減を実現できます。さらに、画像生成リクエストがない時間帯には GPU インスタンスをゼロスケールできるため、社内ゲーム開発など、昼夜や曜日で使用状況が変動するユースケースにおいて高いコスト効果が期待できます。

AWS CDK (※5) を使用した展開スクリプトと詳細な 実装ガイド が用意されており、数ステップで自社環境に展開可能です。

※1 Amazon EKS (Amazon Elastic Kubernetes Service) : AWS が提供するマネージド型 Kubernetes サービスで、コントロールプレーンの管理を自動化し開発者はアプリケーションに集中できます。高可用性設計と堅牢なセキュリティを備え、AWS 各サービスとシームレスに連携。Stable Diffusion のコンテナ実行基盤として、スケーラビリティと運用負荷軽減を実現します。

※2 KEDA (Kubernetes Event Driven Auto-Scaler) : Kubernetes 用のイベント駆動型オートスケーラーで、SQS キュー長などのイベントに基づきポッドを動的にスケーリングします。本ソリューションの実装では、画像生成リクエスト数に応じてポッドを自動的に増減させ、リクエストがない場合はゼロまで縮小。効率的なリソース利用とコスト最適化を実現します。

※3 Karpenter : Kubernetes クラスターのコンピュートリソースを自動プロビジョニングするオープンソースツールです。ワークロードに最適なインスタンスタイプを自動選択し、起動時間を短縮。Stable Diffusion 実装では、KEDA が作成したポッドに対応する GPU インスタンスを動的にプロビジョニングし、需要変動に迅速に対応します。

※4 Amazon EC2 スポットインスタンス : AWS クラウドの未使用 Amazon EC2 容量を活用できる低コストなインスタンスオプションです。オンデマンド比で最大 90% 割引で利用可能ですが、AWS 需要に応じて中断される場合があります。本ソリューションでは SQS キューによるタスク管理を採用しており、インスタンスが中断されても処理要求は保持され、別インスタンスで再処理可能なため、リクエストを取りこぼさず GPU コストを大幅に削減できます。

※5 AWS CDK (AWS Cloud Development Kit) : AWS リソースをプログラミング言語で定義できる Infrastructure as Code ツールです。AWS CloudFormation テンプレートを自動生成するため、複雑なインフラを再利用可能なコンポーネントとして実装できます。本ソリューションでは、EKS クラスターやサーバーレスコンポーネントを含む全環境を、コードで一貫性を持って短時間でデプロイできます。


2. アーキテクチャー概要

本ソリューションのアーキテクチャーは以下のとおりです。

  1. アプリが API Gateway にプロンプトを送信、Lambda 関数で検証後 Amazon SNS トピックに送信します。

  2. Amazon SNS がメッセージを Amazon SQS キューに配信します。

  3. Kubernetes Event Driven Auto-Scaler (KEDA) が、Amazon SQS キューからの受信メッセージを処理するために新しいポッドを自動的にスケールアップします。

  4. Karpenter が新しい Amazon EC2 インスタンスでコンピュートノードを起動します。これらのインスタンスは、事前にキャッシュされた Stable Diffusion ランタイムイメージを使用し、Bottlerocket OS をベースにすることで起動を高速化します。

  5. Stable Diffusion ランタイムは Amazon S3 CSI ドライバーのマウントポイントを介して Amazon S3 バケットから機械学習 (ML) 推論モデルファイルをロードします。

  6. キューエージェントが Amazon SQS からメッセージを受信します。

  7. キューエージェントが Stable Diffusion ランタイム API を呼び出し、生成された画像を Amazon S3 に保存します。

  8. キューエージェントが Amazon SNS トピックに通知を送信します。

アーキテクチャ図

3. デプロイ

※ 本手順は Git リポジトリのコミットハッシュ 47d859addfda7223a9d21fc445fd4fd30fb59001 (2025 年 4 月時点)を使用しています。

3-1. デプロイの実行

Git のプロジェクトをクローンします。

bash
$ git clone --recursive https://github.com/aws-solutions-library-samples/guidance-for-asynchronous-inference-with-stable-diffusion-on-aws
$ cd guidance-for-asynchronous-inference-with-stable-diffusion-on-aws

デプロイ実行

(30 分ほど時間を要します)

bash
$ cd deploy
$ ./deploy.sh

deploy.sh におけるオペレーション

deploy.sh では以下のようなオペレーションが行われます。

  • kubectl、AWS CLI、Node.js など関連するツール類をインストールします。
  • Amazon S3 に推論モデルを配置します。標準では sd_xl_turbo_1.0.safetensors のモデルを使用します。
  • Kubernetes のコンピュートノードで使用する AMI を作成します (Stable Diffusion ランタイムの起動を早めるために、コンテナイメージをキャッシュします)。
  • config.yaml (本ソリューションの設定) ファイルを生成します。
  • AWS CDK による AWS リソースの作成と、EKS Blueprints を使用して Kubernetes クラスターのブートストラップ処理を実行します。

3-2. Kubernetes 関連リソースの確認

Kubernetes クラスターへアクセスする為の設定ファイルを作成します。

bash
$ $(aws cloudformation describe-stacks --stack-name sdoneksStack --query "Stacks[0].Outputs[?OutputKey=='ConfigCommand'].OutputValue" --output text)

Kubernetes ノードを確認

Kubernetes ノードを確認します。

bash
$ kubectl get node
NAME                                         STATUS   ROLES    AGE   VERSION
ip-x-x-x-x.us-west-2.compute.internal   Ready    <none>   40m   v1.31.5-eks-5d632ec
ip-y-y-y-y.us-west-2.compute.internal    Ready    <none>   40m   v1.31.5-eks-5d632ec

KEDA の ScaledObject リソースを確認

KEDA の ScaledObject リソースを確認します。

bash
$ kubectl describe scaledobject sdruntime-sd-on-eks-aws-sqs-queue-scaledobject 
Name:         sdruntime-sd-on-eks-aws-sqs-queue-scaledobject
Namespace:    default
... 

Karpenter の NodePool リソースを確認

Karpenter の NodePool リソースを確認します。

bash
$ kubectl describe nodepool sdruntime-sd-on-eks-provisioner-gpu
Name:         sdruntime-sd-on-eks-provisioner-gpu
Namespace:    
...

4. 動作確認

デプロイ時にインストールされた sd_xl_turbo_1.0.safetensors を用いて、推論リクエストを行い、画像生成できることをテストします。

bash
$ cd test
$ STACK_NAME=sdoneksStack RUNTIME_TYPE=sdwebui ./run.sh

実行結果例 :

実行結果例はこのようになります。

bash
API Endpoint is https://xxxxxxx/dev/
API Key is xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Generating test text-to-image request... 
{"id": "test-t2i", "runtime": "sdruntime", "output_location": "s3://sdoneksstack-outputs3bucket-xxx/output/test-t2i"}
Generating test image-to-image request... 
{"id": "test-i2i", "runtime": "sdruntime", "output_location": "s3://sdoneksstack-outputs3bucket-xxx/output/test-i2i"}
Generating image upscaling request... 
{"id": "test-extra", "runtime": "sdruntime", "output_location": "s3://sdoneksstack-outputs3bucket-xxx/output/test-extra"}

Kubernetes ノードの起動確認

GPU インスタンスの Kubernetes ノードが起動していることも確認できます。

bash
$ kubectl get node
NAME                                         STATUS   ROLES    AGE     VERSION
ip-10-0-152-209.us-west-2.compute.internal   Ready    <none>   175m    v1.31.5-eks-5d632ec
ip-10-0-170-26.us-west-2.compute.internal    Ready    <none>   1m37s   v1.31.6-eks-aad632c
ip-10-0-99-236.us-west-2.compute.internal    Ready    <none>   175m    v1.31.5-eks-5d632ec

生成された画像を S3 バケットから確認

生成された画像を S3 バケットから確認します。

bash
# 出力先S3バケットの特定
$ aws cloudformation describe-stacks --stack-name sdoneksStack --query "Stacks[0].Outputs[?OutputKey=='OutputS3Bucket'].OutputValue" --output text
arn:aws:s3:::sdoneksstack-outputs3xxxxxxxxxxxx

画像の保存を確認

対象のバケットに画像が保存されていることを確認します。

Screenshot of the Amazon S3 console showing object details in the Japanese language interface, including file properties and action buttons such as copy S3 URI, download, and open.

A closeup image of a brown and white dog with alert ears, set against a green background.

テスト時の API 実行のペイロード

テストでは以下のような API 実行のペイロードが用いてプロンプトが用いられており、単純に犬の画像が生成できていることを確認できます。

json
{
  "task": {
    "metadata": {
      "id": "test-t2i",
      "runtime": "sdruntime",
      "tasktype": "text-to-image",
      "prefix": "output",
      "context": ""
    },
    "content": {
      "alwayson_scripts": {},
      "prompt": "A dog",
      "steps": 16,
      "width": 512,
      "height": 512
    }
  }
}

5. カスタム推論モデルを用いた画像生成

最後に任意のカスタム推論モデルを用いた画像生成を試します。今回の例では、prompthero/openjourney  のモデルを使用します。

5-1. 推論モデルを Amazon S3 にアップロード

モデルを Amazon S3 にアップロードします。

5-2. 動的な推論モデル読み込みに対応させる

config.yaml ファイル内に dynamicModel: true のパラメータを設定して Kubernetes クラスターを更新することで、 Stable Diffusion ランタイムは Amazon S3 からモデルを読み込み、リクエストで使用されたモデルに基づいた推論が行えるようになります。 config.yaml のファイルを編集します (変更点は、dynamicModel: true)。

xml
stackName: sdoneks
modelBucketArn: arn:aws:s3:::sdoneks-model-bucket-xxxx
APIGW:
  stageName: dev
  throttle:
    rateLimit: 30
    burstLimit: 50
modelsRuntime:
- name: falsesdruntime
  namespace: default
  modelFilename: sd_xl_turbo_1.0.safetensors
  dynamicModel: true
  type: sdwebui
  extraValues:
    ....

Kubernetes クラスターを更新

AWS CDK を実行して、Kubernetes クラスターを更新します。

bash
$ cdk deploy

5-3. 動作確認に使用する API ペイロードの編集

test/v1alpha2/t2i.json のファイルを編集します。 変更点は alwayson_scripts > sd_model_checkpoint にアップロードしたモデルを指定するように変更しています。

json
{
  "task": {
    "metadata": {
      "id": "test-t2i",
      "runtime": "sdruntime",
      "tasktype": "text-to-image",
      "prefix": "output",
      "context": ""
    },
    "content": {
      "alwayson_scripts": {
          "sd_model_checkpoint": "mdjrny-v4.safetensors"
      },
      "prompt": "A dog",
      "steps": 16,
      "width": 512,
      "height": 512
    }
  }
}

5-4. 動作確認

追加でインストールしたカスタムモデル mdjrny-v4.safetensors を用いて、推論リクエストを行い、画像生成できることをテストします。

bash
$ cd test
$ STACK_NAME=sdoneksStack RUNTIME_TYPE=sdwebui ./run.sh

実行結果例:

実行結果例の例はこのようになります。

bash
API Endpoint is https://xxxxxxx/dev/
API Key is xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Generating test text-to-image request... 
{"id": "test-t2i", "runtime": "sdruntime", "output_location": "s3://sdoneksstack-outputs3bucket-xxx/output/test-t2i"}
Generating test image-to-image request... 
{"id": "test-i2i", "runtime": "sdruntime", "output_location": "s3://sdoneksstack-outputs3bucket-xxx/output/test-i2i"}
Generating image upscaling request... 
{"id": "test-extra", "runtime": "sdruntime", "output_location": "s3://sdoneksstack-outputs3bucket-xxx/output/test-extra"}

生成された画像

A realistic digital portrait of a St. Bernard dog with brown and white fur, large expressive eyes, and a gentle expression, set against a dark background.

6. まとめ

AWS が提供する「Guidance for Asynchronous Image Generation with Stable Diffusion on AWS」は、生成 AI を実用的なワークロードとして運用するための優れたリファレンスアーキテクチャです。サーバーレスとコンテナ技術を巧みに組み合わせた非同期処理フローにより、クリエイティブなプロジェクトでも安定した画像生成を実現します。

KEDA と Karpenter による自動スケーリングは、ゲーム開発やコンテンツ制作などのクリエイティブワークフローで特に価値を発揮します。平日の業務時間と夜間・休日の利用パターンの差や、プロジェクトの進行段階による処理量の変動など、時期によって大きく異なる負荷に柔軟に対応しながら品質を維持できます。

本ガイドで紹介したように、さまざまなモデルを簡単に切り替えることができるため、アートスタイルの探索や、ブランドに合わせたビジュアル表現の実験も容易になります。デジタルコンテンツ制作の現場における創造的な試行錯誤をサポートし、アイデアから実装までの時間を短縮する強力なツールとして活用されてみてはいかがでしょうか。

筆者プロフィール

大西 啓太郎(Keitaro Onishi)
アマゾン ウェブ サービス ジャパン合同会社
ゲームソリューションアーキテクト

ゲーム会社のエンジニアを経て 2022 年にアマゾンウェブサービスジャパン合同会社に入社。現在は主にゲーム業界のお客様の技術支援を担当しています。
好きな北斗神拳の奥義は北斗残悔拳。
A portrait of a man with short dark hair wearing a suit jacket and collared shirt against a black background.