すべてのプロダクト
Search
ドキュメントセンター

Elastic Container Instance:DataCache を使用した Stable Diffusion アプリケーションのデプロイ

最終更新日:Mar 01, 2026

Stable Diffusion モデルはサイズが大きく、コンテナの起動時に数ギガバイトのモデルの重みをプルすると、デプロイごとに数分が追加されます。DataCache は、モデルデータを再利用可能なキャッシュにプリロードすることで、この問題を解決します。エラスティックコンテナインスタンスの起動時には、モデルはすでにローカルボリュームとして利用可能であり、モデルのサイズやネットワークの状況に応じて、起動時間を数分から数秒に短縮できます。

このガイドでは、2 つのデプロイパスについて説明します。

  • HTTP サービス -- テキストプロンプトを受け入れ、API エンドポイント経由で生成されたイメージを返す軽量の Python サーバーです。プログラムによる統合に最適です。

  • WebUI -- 対話型のイメージ生成のためのブラウザベースの Stable Diffusion インターフェイスです。実験や視覚的なワークフローに最適です。

どちらのパスも、同じ 3 段階のワークフローに従います。

DataCache の作成          アプリケーションのデプロイ          公開とテスト
(Hugging Face から      --->   (キャッシュをエラスティック    --->  (ネットワークの構成、
 モデルデータをプル)             コンテナインスタンスにマウント)     イメージの生成)
重要
  • Alibaba Cloud は、サードパーティ製モデルの合法性、安全性、または正確性を保証するものではなく、それによって生じたいかなる損害についても責任を負いません。

  • サードパーティ製モデルのユーザー契約、利用規約、および関連する法令を遵守してください。サードパーティ製モデルの使用は、お客様ご自身の責任において行われるものとします。

DataCache の仕組み

DataCache は、外部ソース (Hugging Face モデルリポジトリなど) からデータをプルし、指定されたバケットとパスに保存します。DataCacheBucket がそのバケットに設定された弾性コンテナインスタンスが作成されると、キャッシュデータは指定したパスに HostPathVolume としてマウントされます。コンテナーはモデルファイルをローカルディレクトリとして認識するため、起動時にダウンロードの遅延が発生しません。

前提条件

開始する前に、以下が準備できていることを確認してください。

  • インターネット NAT ゲートウェイに関連付けられた Virtual Private Cloud (VPC) で、VPC からのインターネットアクセスを許可するように SNAT エントリが構成されていること

説明

VPC がインターネット NAT ゲートウェイに関連付けられていない場合は、DataCache の作成時とアプリケーションのデプロイ時に Elastic IP Address (EIP) を関連付けて、インターネットアクセスを有効にしてください。

ランタイム環境の準備

Elastic Container Instance (ECI) は、Stable Diffusion を実行するためのビルド済みコンテナイメージを提供します。デプロイパスに基づいてイメージを選択してください。

HTTP サービスパス用のイメージ

イメージアドレスユースケース
GPU 高速化registry.cn-hangzhou.aliyuncs.com/eci_open/ubuntu:cuda11.7.1-cudnn8-ubuntu20.04CUDA 11.7.1 を使用した GPU 推論
CPU 高速化registry.cn-hangzhou.aliyuncs.com/eci_open/ubuntu:hf-ubuntu20.04CPU のみの推論

両方のイメージは、Python 3.8、Diffusers ライブラリ、PyTorch、およびその他の依存関係がプリインストール済みの Ubuntu 20.04 をベースとしています。起動後、コンテナーは python3 http-server.py を実行して HTTP エンドポイントを提供します。

GPU イメージのビルドに使用される Dockerfile

次の Dockerfile は、Ubuntu 20.04 と Python 3.8 に基づく開発環境をビルドし、PyTorch、Diffusers、および関連する依存関係をプリインストールしてから、コンテナの起動時に HTTP サービスを開始します。

FROM nvidia/cuda:11.7.1-cudnn8-runtime-ubuntu20.04
LABEL maintainer="Alibaba Cloud Serverless Container"

ENV DEBIAN_FRONTEND=noninteractive

RUN apt update && \
    apt install -y bash \
                   vim \
                   build-essential \
                   git \
                   git-lfs \
                   curl \
                   ca-certificates \
                   libsndfile1-dev \
                   libgl1 \
                   python3.8 \
                   python3-pip \
                   python3.8-venv && \
    rm -rf /var/lib/apt/lists

# 仮想環境を作成してアクティブ化
RUN python3 -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
RUN mkdir -p /workspace/pic/
WORKDIR /workspace
COPY http-server.py http-server.py

# PyTorch と ML の依存関係をインストール
RUN python3 -m pip install --no-cache-dir --upgrade pip && \
    python3 -m pip install --no-cache-dir \
        torch \
        torchvision \
        torchaudio \
        invisible_watermark && \
    python3 -m pip install --no-cache-dir \
        accelerate \
        datasets \
        hf-doc-builder \
        huggingface-hub \
        Jinja2 \
        librosa \
        numpy \
        scipy \
        tensorboard \
        transformers \
        omegaconf \
        pytorch-lightning \
        xformers \
        safetensors \
        diffusers


CMD ["/bin/bash"]

HTTP サービススクリプト (http-server.py)

このスクリプトは、クエリパラメーターとしてテキストプロンプトを受け入れ、Stable Diffusion でイメージを生成し、イメージファイルのパスを返す単純な HTTP サーバーを開始します。

  • デフォルトポート: 8888(APP_PORT 環境変数でオーバーライド可能)

  • デフォルトのモデルディレクトリ: /data/model/MODEL_DIR 環境変数でオーバーライドできます)

  • 生成されたイメージのディレクトリ: /workspace/pic/

import os
import hashlib
import torch
from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler
from http.server import BaseHTTPRequestHandler
from http.server import HTTPServer
from urllib.parse import urlparse, parse_qs

MODEL_DIR_NEV = "MODEL_DIR"
APP_PORT_ENV = "APP_PORT"


def text2image(input):
    model_id = os.getenv(MODEL_DIR_NEV, default="/data/model/")
    pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)

    pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
    pipe = pipe.to("cuda")

    image = pipe(input).images[0]
    name = "/workspace/pic/" + hashlib.md5(input.encode('utf8')).hexdigest() + ".png"
    image.save(name)
    return name


class GetHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        query = parse_qs(urlparse(self.path).query)
        # パラメーター値を取得します。
        input = query.get('input')[0]
        print("get user input:%s, try generate image" % input)
        picName = text2image(input)
        # 応答を構築します。
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(bytes("<html><head><title>Stable Diffusion</title></head>", "utf-8"))
        self.wfile.write(bytes("<body><p>Success generate image:%s</p>" % picName, "utf-8"))
        self.wfile.write(bytes("</body></html>", "utf-8"))


if __name__ == '__main__':
    server = HTTPServer(('', int(os.getenv(APP_PORT_ENV, default="8888"))), GetHandler)
    server.serve_forever()
    print('Starting server')

WebUI パス用のイメージ

イメージアドレス
WebUIregistry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion:1.0.0

このイメージは、任意の Stable Diffusion モデルに対応しています。モデルデータを /stable-diffusion-webui/models/Stable-diffusion/ にマウントすると、WebUI が自動的に認識します。

HTTP サービスでのデプロイ

ステップ 1:DataCache の作成

  1. Hugging Face に移動して、使用するモデルを見つけます。モデル詳細ページの上部からモデル ID をコピーします。この例では stabilityai/stable-diffusion-2-1 を使用します。

  2. CreateDataCache API 操作を呼び出して DataCache を作成します。 次のリクエストは、Hugging Face からモデルをプルし、test という名前のバケットの /model/stable-diffusion/ パスに格納します。 DataCache には stable-diffusion という名前が付けられ、1 日間保持されます。

    重要

    SDK を使用する場合、DataSource.Options のパラメーター名から長さのプレフィックスを省略します。たとえば、#10#repoSource の代わりに repoSource を使用し、#6#repoId の代わりに repoId を使用します。

       {
         "RegionId": "cn-beijing",
         "SecurityGroupId": "sg-2ze63v3jtm8e6syi****",
         "VSwitchId": "vsw-2ze94pjtfuj9vaymf****",
         "Bucket": "test",
         "Path": "/model/stable-diffusion/",
         "Name": "stable-diffusion",
         "DataSource": {
           "Type": "URL",
           "Options": {
             "#10#repoSource": "HuggingFace/Model",
             "#6#repoId": "stabilityai/stable-diffusion-2-1"
           }
         },
         "RetentionDays": 1
       }
  3. 返された DataCache ID を使用して DescribeDataCaches API 操作を呼び出します。DataCaches.StatusAvailable の場合、キャッシュは使用可能になります。

ステップ 2:アプリケーションのデプロイ

  1. キャッシュされたモデルをマウントした GPU 高速化エラスティックコンテナインスタンスを作成するには、CreateContainerGroup API 操作を呼び出します。次のリクエストは、GPU 1 個を搭載した ecs.gn6i-c16g1.4xlarge インスタンスタイプを使用してインスタンスを作成します。コンテナー内の /data/model/ にキャッシュされた Stable Diffusion v2-1 モデルデータをマウントし、HTTP サービスを起動します。主なパラメーター:

    パラメーター説明
    InstanceTypeGPU アクセラレーション対応の Elastic Compute Service (ECS) インスタンスタイプ (ecs.gn6i-c16g1.4xlarge)
    DataCacheBucketDataCache がモデルデータを格納するバケット
    HostPathVolume.PathDataCache のパス(ステップ 1 の Path と一致している必要があります)
    VolumeMount.MountPathコンテナー内にモデルが表示されるパス (/data/model/)
       {
         "RegionId": "cn-beijing",
         "SecurityGroupId": "sg-2ze63v3jtm8e6syi****",
         "VSwitchId": "vsw-2ze94pjtfuj9vaymf****",
         "ContainerGroupName": "stable-diffusion",
         "InstanceType": "ecs.gn6i-c16g1.4xlarge",
         "DataCacheBucket": "test",
         "Container": [
           {
             "Arg": [
               "python3 http-server.py"
             ],
             "VolumeMount": [
               {
                 "MountPath": "/data/model/",
                 "Name": "model"
               }
             ],
             "Command": [
               "/bin/sh",
               "-c"
             ],
             "Gpu": 1,
             "Name": "stable-diffusion",
             "Image": "registry.cn-hangzhou.aliyuncs.com/eci_open/ubuntu:cuda11.7.1-cudnn8-ubuntu20.04"
           }
         ],
         "Volume": [
           {
             "Type": "HostPathVolume",
             "HostPathVolume.Path": "/model/stable-diffusion/",
             "Name": "model"
           }
         ]
       }
  2. 返されたインスタンス ID を使用して、DescribeContainerGroupStatus API 操作を呼び出します。Status および ContainerStatuses.State の両方が Running の場合、インスタンスが準備完了です。

ステップ 3:アプリケーションのインターネットへの公開

VPC が NAT ゲートウェイに関連付けられている場合は、DNAT エントリを作成して外部トラフィックをコンテナにマッピングします。詳細については、「DNAT エントリの作成と管理」をご参照ください。

説明

VPC が NAT ゲートウェイに関連付けられておらず、インスタンス作成時に EIP を関連付けた場合は、このステップをスキップしてください。

DNAT エントリを次の設定で構成します。

設定
パブリック IP アドレスの選択NAT ゲートウェイに関連付けられた EIP
プライベート IP アドレスの選択エラスティックコンテナインスタンスの IP アドレス
ポート設定特定のポート
パブリックポート80
プライベートポート8888
プロトコルタイプTCP

ステップ 4:アプリケーションのテスト

  1. エラスティックコンテナインスタンスのセキュリティグループに、ポート 80 でのトラフィックを許可するインバウンドルールを追加します。

  2. ブラウザを開き、テキストプロンプト付きのリクエストを送信します。<public-ip> は、NAT ゲートウェイに関連付けられた EIP(または DNAT パブリック IP)に置き換えてください。input パラメーターには、画像生成用のテキスト説明が含まれています。アプリケーションは画像を生成し、コンテナー内の /workspace/pic/ ディレクトリに保存します。応答ページでは、正常に生成されたことが確認され、ファイルパスが表示されます。

       http://<public-ip>:80?input=a+photo+of+an+astronaut+riding+a+horse

    StableDiffusion-api.png

  3. 生成されたイメージを表示するには、コンテナ内でセカンダリ HTTP サーバーを起動します。

       python3 -m http.server 7777 --directory /workspace/pic/ &
  4. セキュリティグループに、ポート 70 でのトラフィックを許可するインバウンドルールを追加します。

  5. 2 番目の DNAT エントリを作成して、イメージサーバーを公開します。

    設定
    パブリックポート70
    プライベートポート7777
    プロトコルタイプTCP
  6. ブラウザを開いてイメージを表示します。

       http://<public-ip>:70

    StableDiffusion-api-1.png

WebUI でのデプロイ

ステップ 1:DataCache の作成

  1. Hugging Face に移動し、使用するモデルを見つけます。 モデル ID をコピーします。 この例では、 hanafuusen2001/BeautyProMix を使用します。

  2. CreateDataCache API 操作を呼び出します。次のリクエストは、Hugging Face からモデルをプルし、/model/BeautyProMix/ パスに test という名前のバケットに保存します。DataCache は beautypromix という名前で、1 日間保持されます。

    重要

    SDK を使用する場合、DataSource.Options のパラメーター名から長さのプレフィックスを省略します。たとえば、#10#repoSource の代わりに repoSource を、#6#repoId の代わりに repoId を使用します。

       {
         "RegionId": "cn-beijing",
         "SecurityGroupId": "sg-2ze63v3jtm8e6syi****",
         "VSwitchId": "vsw-2ze94pjtfuj9vaymf****",
         "Bucket": "test",
         "Path": "/model/BeautyProMix/",
         "Name": "beautypromix",
         "DataSource": {
           "Type": "URL",
           "Options": {
             "#10#repoSource": "HuggingFace/Model",
             "#6#repoId": "hanafuusen2001/BeautyProMix"
           }
         },
         "RetentionDays": 1
       }
  3. 返された DataCache ID を使用して、DescribeDataCaches API 操作を呼び出します。DataCaches.StatusAvailable の場合、キャッシュは準備完了です。

ステップ 2:アプリケーションのデプロイ

  1. CreateContainerGroup API 操作を呼び出して、キャッシュされたモデルがマウントされた GPU 高速化エラスティックコンテナインスタンスを作成します。次のリクエストでは、1 つの GPU を搭載した ecs.gn6i-c16g1.4xlarge インスタンスタイプを使用してインスタンスを作成し、BeautyProMix モデルを /stable-diffusion-webui/models/Stable-diffusion/ にマウントして、WebUI を起動します。主なパラメーター:

    パラメーター説明
    HostPathVolume.PathDataCache パス (ステップ 1 の Path と一致させる必要があります)
    VolumeMount.MountPathWebUI モデルディレクトリ (/stable-diffusion-webui/models/Stable-diffusion/)
    起動コマンドpython3 launch.py --listen --skip-torch-cuda-test --port 8888 --no-half
       {
         "RegionId": "cn-beijing",
         "SecurityGroupId": "sg-2ze63v3jtm8e6syi****",
         "VSwitchId": "vsw-2ze94pjtfuj9vaymf****",
         "ContainerGroupName": "stable-diffusion",
         "InstanceType": "ecs.gn6i-c16g1.4xlarge",
         "DataCacheBucket": "test",
         "Container": [
           {
             "Arg": [
               "python3 launch.py --listen --skip-torch-cuda-test --port 8888 --no-half"
             ],
             "VolumeMount": [
               {
                 "MountPath": "/stable-diffusion-webui/models/Stable-diffusion/",
                 "Name": "model"
               }
             ],
             "Command": [
               "/bin/sh",
               "-c"
             ],
             "Gpu": 1,
             "Name": "stable-diffusion",
             "Image": "registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion:1.0.0"
           }
         ],
         "Volume": [
           {
             "Type": "HostPathVolume",
             "HostPathVolume.Path": "/model/BeautyProMix/",
             "Name": "model"
           }
         ]
       }
  2. 返されたインスタンス ID を使用して、DescribeContainerGroupStatus API 操作を呼び出します。Status および ContainerStatuses.State の両方が Running の場合、インスタンスが準備完了状態になります。

ステップ 3:アプリケーションのインターネットへの公開

VPC が NAT ゲートウェイに関連付けられている場合は、DNAT エントリを作成します。詳細については、「DNAT エントリの作成と管理」をご参照ください。

説明

VPC が NAT ゲートウェイに関連付けられておらず、インスタンス作成時に EIP を関連付けた場合は、このステップをスキップしてください。

DNAT エントリを次の設定で構成します。

設定
パブリック IP アドレスの選択NAT ゲートウェイに関連付けられた EIP
プライベート IP アドレスの選択エラスティックコンテナインスタンスの IP アドレス
ポート設定特定のポート
パブリックポート80
プライベートポート8888
プロトコルタイプTCP

ステップ 4:アプリケーションのテスト

  1. エラスティックコンテナインスタンスのセキュリティグループに、外部ポートでのトラフィックを許可するインバウンドルールを追加します。

  2. ブラウザを開き、WebUI にアクセスします。

    • DNAT を使用する場合: http://<public-ip>:80

    • EIP を使用する場合 (DNAT なし): http://<eip>:8888

    説明

    エラスティックコンテナインスタンスが EIP に直接関連付けられている場合は、代わりに EIP とコンテナポート (8888) を使用してください。

  3. WebUI のプロンプトフィールドにテキスト記述を入力し、[生成] をクリックしてイメージを作成します。

    webui-api.png

背景情報:Stable Diffusion

Stable Diffusion は、テキスト記述からイメージを生成および変更する text-to-image モデルです。次の 2 つのコンポーネントを組み合わせています。

  • テキスト理解 -- Contrastive Language-Image Pre-Training (CLIP) モデルを使用してプロンプトをエンコードします

  • イメージ生成 -- ノイズを繰り返し洗練して一貫性のあるイメージに変換する拡散プロセスを通じてイメージを生成します

参考