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.04 | CUDA 11.7.1 を使用した GPU 推論 |
| CPU 高速化 | registry.cn-hangzhou.aliyuncs.com/eci_open/ubuntu:hf-ubuntu20.04 | CPU のみの推論 |
両方のイメージは、Python 3.8、Diffusers ライブラリ、PyTorch、およびその他の依存関係がプリインストール済みの Ubuntu 20.04 をベースとしています。起動後、コンテナーは python3 http-server.py を実行して HTTP エンドポイントを提供します。
WebUI パス用のイメージ
| イメージ | アドレス |
|---|---|
| WebUI | registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion:1.0.0 |
このイメージは、任意の Stable Diffusion モデルに対応しています。モデルデータを /stable-diffusion-webui/models/Stable-diffusion/ にマウントすると、WebUI が自動的に認識します。
HTTP サービスでのデプロイ
ステップ 1:DataCache の作成
Hugging Face に移動して、使用するモデルを見つけます。モデル詳細ページの上部からモデル ID をコピーします。この例では
stabilityai/stable-diffusion-2-1を使用します。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 }返された DataCache ID を使用して DescribeDataCaches API 操作を呼び出します。
DataCaches.StatusがAvailableの場合、キャッシュは使用可能になります。
ステップ 2:アプリケーションのデプロイ
キャッシュされたモデルをマウントした 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" } ] }返されたインスタンス 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:アプリケーションのテスト
エラスティックコンテナインスタンスのセキュリティグループに、ポート 80 でのトラフィックを許可するインバウンドルールを追加します。
ブラウザを開き、テキストプロンプト付きのリクエストを送信します。
<public-ip>は、NAT ゲートウェイに関連付けられた EIP(または DNAT パブリック IP)に置き換えてください。inputパラメーターには、画像生成用のテキスト説明が含まれています。アプリケーションは画像を生成し、コンテナー内の/workspace/pic/ディレクトリに保存します。応答ページでは、正常に生成されたことが確認され、ファイルパスが表示されます。http://<public-ip>:80?input=a+photo+of+an+astronaut+riding+a+horse
生成されたイメージを表示するには、コンテナ内でセカンダリ HTTP サーバーを起動します。
python3 -m http.server 7777 --directory /workspace/pic/ &セキュリティグループに、ポート 70 でのトラフィックを許可するインバウンドルールを追加します。
2 番目の DNAT エントリを作成して、イメージサーバーを公開します。
設定 値 パブリックポート 70 プライベートポート 7777 プロトコルタイプ TCP ブラウザを開いてイメージを表示します。
http://<public-ip>:70
WebUI でのデプロイ
ステップ 1:DataCache の作成
Hugging Face に移動し、使用するモデルを見つけます。 モデル ID をコピーします。 この例では、
hanafuusen2001/BeautyProMixを使用します。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 }返された DataCache ID を使用して、DescribeDataCaches API 操作を呼び出します。
DataCaches.StatusがAvailableの場合、キャッシュは準備完了です。
ステップ 2:アプリケーションのデプロイ
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" } ] }返されたインスタンス 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:アプリケーションのテスト
エラスティックコンテナインスタンスのセキュリティグループに、外部ポートでのトラフィックを許可するインバウンドルールを追加します。
ブラウザを開き、WebUI にアクセスします。
DNAT を使用する場合:
http://<public-ip>:80EIP を使用する場合 (DNAT なし):
http://<eip>:8888
説明エラスティックコンテナインスタンスが EIP に直接関連付けられている場合は、代わりに EIP とコンテナポート (8888) を使用してください。
WebUI のプロンプトフィールドにテキスト記述を入力し、[生成] をクリックしてイメージを作成します。

背景情報:Stable Diffusion
Stable Diffusion は、テキスト記述からイメージを生成および変更する text-to-image モデルです。次の 2 つのコンポーネントを組み合わせています。
テキスト理解 -- Contrastive Language-Image Pre-Training (CLIP) モデルを使用してプロンプトをエンコードします
イメージ生成 -- ノイズを繰り返し洗練して一貫性のあるイメージに変換する拡散プロセスを通じてイメージを生成します