このトピックでは、DataCache を使用して、Hugging Face での Stable Diffusion アプリケーションのデプロイを高速化する方法について説明します。Stable Diffusion アプリケーションをデプロイする場合、事前に DataCache から Stable Diffusion モデルデータをプルできます。Stable Diffusion アプリケーションに対応する Elastic Container Instance を作成するときに、モデルデータをインスタンスにマウントできます。これにより、データをプルする必要がなくなり、Stable Diffusion アプリケーションのデプロイが高速化されます。
背景情報
Stable Diffusion は、テキストの説明に基づいて画像を生成および変更するために使用できるモデルです。Stable Diffusion は、テキスト理解コンポーネントと画像生成コンポーネントで構成されています。Stable Diffusion は、Contrastive Language-Image Pre-Training(CLIP)モデルを使用してプロンプトをエンコードし、拡散モデルを使用して画像を生成します。
Alibaba Cloud は、サードパーティモデルの合法性、セキュリティ、または正確性を保証しません。Alibaba Cloud は、それによって引き起こされた損害について責任を負いません。
サードパーティモデルのユーザー契約、使用仕様、および関連する法律および規制を遵守する必要があります。お客様は、サードパーティモデルの使用について、お客様自身の責任において行うことに同意するものとします。
前提条件
使用する仮想プライベートクラウド(VPC)は、インターネット NAT ゲートウェイに関連付けられています。VPC 内のリソースまたは VPC 内の vSwitch に接続されているリソースがインターネットにアクセスできるように、NAT ゲートウェイに SNAT エントリが構成されています。
VPC がインターネット NAT ゲートウェイに関連付けられていない場合は、DataCache を作成してアプリケーションをデプロイするときに、VPC に Elastic IP アドレス(EIP)を関連付ける必要があります。これにより、インターネットからデータをプルできます。
ランタイム環境を準備する
Stable Diffusion アプリケーションをデプロイするには、Stable Diffusion アプリケーションの実行に必要な環境を含むコンテナイメージを準備する必要があります。環境には、Compute Unified Device Architecture(CUDA)、Diffusers ライブラリ、およびその他の基本的な依存関係が含まれている必要があります。Elastic Container Instance は、ほとんどのモデルで安定した環境を実行できるコンテナイメージを提供します。アプリケーションに特別な依存関係が必要ない場合は、Elastic Container Instance が提供するイメージを使用できます。
HTTP サービスを開始するイメージ
GPU アクセラレーションイメージ:registry.cn-hangzhou.aliyuncs.com/eci_open/ubuntu:cuda11.7.1-cudnn8-ubuntu20.04
CPU アクセラレーションイメージ:registry.cn-hangzhou.aliyuncs.com/eci_open/ubuntu:hf-ubuntu20.04
次の部分では、イメージに関する情報を提供します。
WebUI をサポートするイメージ
イメージアドレス:registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion:1.0.0
説明このイメージは、すべての Stable Diffusion モデルに適用されます。モデルを使用するには、既存のモデルデータキャッシュを
/stable-diffusion-webui/models/Stable-diffusion/
ディレクトリにマウントするだけです。
手順
HTTP サービスを開始するイメージを使用する
DataCache を作成する
Hugging Face にアクセスし、モデルの ID を取得します。
この例では、stabilityai/stable-diffusion-2-1 モデルを使用します。Hugging Face でモデルを見つけ、モデルの詳細ページの上部にあるモデルの ID をコピーします。
DataCache を作成します。
次の例は、CreateDataCache API オペレーションを呼び出して DataCache を作成する場合に使用されるパラメータを示しています。モデルデータは Hugging Face からプルされ、test という名前のバケットの
/model/stable-diffusion/
ディレクトリに保存されます。DataCache の名前は stable-diffusion で、1 日間保持されます。重要SDK を使用して DataCache を作成する場合、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 のステータスをクエリします。
返された DataCache ID を使用して、DescribeDataCaches API オペレーションを呼び出し、DataCache の情報をクエリします。DataCaches.Status で示される DataCache のステータスが Available の場合、DataCache は使用できる状態です。
Stable Diffusion アプリケーションをデプロイする
DataCache を使用して Elastic Container Instance を作成し、Stable Diffusion アプリケーションをデプロイします。
次の例は、CreateContainerGroup API オペレーションを呼び出して Elastic Container Instance を作成する場合に使用されるパラメータを示しています。インスタンスは、GPU アクセラレーション ECS インスタンスタイプに基づいて作成され、Stable Diffusion v2-1 モデルがマウントされています。インスタンス内のコンテナは、GPU アクセラレーションイメージを使用します。コンテナの起動後、コンテナは
python3 http-server.py
コマンドを実行して HTTP サービスを開始します。{ "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 の場合、インスタンスが作成され、コンテナが実行されています。
アプリケーションへのインターネットアクセスを開きます。
Elastic Container Instance が存在する VPC が NAT ゲートウェイに関連付けられている場合は、DNAT エントリを作成して、インスタンスへのインターネットアクセスを許可する必要があります。詳細については、DNAT エントリの作成と管理 を参照してください。
説明VPC が NAT ゲートウェイに関連付けられていない場合は、Elastic Container Instance を作成するときに、VPC に EIP を関連付ける必要があります。この場合は、この手順をスキップします。
次の例は、DNAT エントリを作成するときにパラメータを構成する方法を示しています。
パブリック IP アドレスを選択:NAT ゲートウェイに関連付けられている EIP を選択します。
プライベート IP アドレスを選択:Stable Diffusion アプリケーションがデプロイされている Elastic Container Instance の IP アドレスを選択します。
ポート設定:特定のポートを選択します。次に、パブリックポートを 80、プライベートポートを 8888、プロトコルタイプを TCP に設定します。
モデルをテストする
テキストの説明を渡して、Stable Diffusion アプリケーションが画像を生成できるかどうかをテストします。
Elastic Container Instance が属するセキュリティグループにインバウンドルールを追加して、アプリケーションの外部ポートを開きます。この例では、ポート 80 を開きます。
ブラウザを開いて Stable Diffusion アプリケーションにアクセスし、テキストの説明を渡します。
DNAT を構成した場合は、DNAT エントリで構成したパブリック IP アドレスとパブリックポート、およびテキストの説明を入力します。例:
47.94.XX.XX:80?input=xxx
。input=xxx
は、渡すテキストの説明を示します。Stable Diffusion アプリケーションは、テキストの説明に基づいて画像を生成し、コンテナの/workspace/pic
ディレクトリに画像を保存します。例:
Stable Diffusion アプリケーションによって生成された画像を表示します。
コンテナで新しい HTTP サービスを開始して、画像を表示します。
コンテナが接続されたら、次のコマンドを実行します。
python3 -m http.server 7777 --directory /workspace/pic/ &
Elastic Container Instance が属するセキュリティグループにインバウンドルールを追加し、画像の表示に使用するポートを開きます。この例では、ポート 70 を開きます。
新しい HTTP サービスへの外部アクセスを許可するために、DNAT エントリを作成します。
たとえば、新しい DNAT エントリでは、パブリックポートとしてポート 70、プライベートポートとしてポート 7777、プロトコルタイプとして TCP を使用できます。
生成された画像を表示します。
新しい DNAT エントリで構成されたパブリック IP アドレスとパブリックポートを入力します。例:
47.94.XX.XX:70
。例:
WebUI をサポートするイメージを使用する
DataCache を作成する
Hugging Face にアクセスし、モデルの ID を取得します。
この例では、hanafuusen2001/BeautyProMix モデルを使用します。Hugging Face でモデルを見つけ、モデルの詳細ページの上部にあるモデルの ID をコピーします。
DataCache を作成します。
次の例は、CreateDataCache API オペレーションを呼び出して DataCache を作成する場合に使用されるパラメータを示しています。モデルデータは Hugging Face からプルされ、test という名前のバケットの
/model/BeautyProMix/
ディレクトリに保存されます。DataCache の名前は beautypromix で、1 日間保持されます。{ "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 のステータスをクエリします。
返された DataCache ID を使用して、DescribeDataCaches API オペレーションを呼び出し、DataCache の情報をクエリします。DataCaches.Status で示される DataCache のステータスが Available の場合、DataCache は使用できる状態です。
Stable Diffusion アプリケーションをデプロイする
DataCache を使用して Elastic Container Instance を作成し、Stable Diffusion アプリケーションをデプロイします。
次の例は、CreateContainerGroup API オペレーションを呼び出して Elastic Container Instance を作成するために使用されるパラメータを示しています。インスタンスは、GPU アクセラレーション ECS インスタンスタイプに基づいて作成され、BeautyProMix モデルがマウントされています。インスタンス内のコンテナは、GPU アクセラレーションイメージを使用します。コンテナの起動後、コンテナは
python3 launch.py --listen --skip-torch-cuda-test --port 8888 --no-half
コマンドを実行して WebUI を起動します。{ "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 の場合、インスタンスが作成され、コンテナが実行されています。
アプリケーションへのインターネットアクセスを開きます。
Elastic Container Instance が存在する VPC が NAT ゲートウェイに関連付けられている場合は、DNAT エントリを作成して、インスタンスへのインターネットアクセスを許可する必要があります。詳細については、DNAT エントリの作成と管理 を参照してください。
説明VPC が NAT ゲートウェイに関連付けられていない場合は、Elastic Container Instance を作成するときに、VPC に EIP を関連付ける必要があります。この場合は、この手順をスキップします。
次の例は、DNAT エントリを作成するときにパラメータを構成する方法を示しています。
パブリック IP アドレスを選択:NAT ゲートウェイに関連付けられている EIP を選択します。
プライベート IP アドレスを選択:Stable Diffusion アプリケーションがデプロイされている Elastic Container Instance の IP アドレスを選択します。
ポート設定:特定のポートを選択します。次に、パブリックポートを 80、プライベートポートを 8888、プロトコルタイプを TCP に設定します。
モデルをテストする
Elastic Container Instance が属するセキュリティグループにインバウンドルールを追加して、アプリケーションの外部ポートを開きます。
ブラウザを開いて Stable Diffusion アプリケーションにアクセスします。
DNAT を構成した場合は、DNAT エントリで構成したパブリック IP アドレスとパブリックポートを入力します。例:
47.94.XX.XX:80
。説明Elastic Container Instance が EIP に関連付けられている場合は、EIP とコンテナの外部ポートを入力します。例:
47.94.XX.XX:8888
。テキストの説明を入力して、アプリケーションが画像を生成できるかどうかをテストします。
例: