Container Service for Kubernetes (ACK) クラスターに Knative ベースの Stable Diffusion サービスをデプロイすると、Knative ソリューションによって、スループットに基づいて Pod が処理できる同時リクエストの最大数を正確に制御できます。これにより、サービスの安定性が確保されます。また、Knative はトラフィックがない場合に Pod をゼロに自動的にスケールインすることもできます。これにより、GPU リソースの費用を削減できます。
前提条件
Kubernetes 1.24 以降を実行する ACK クラスターが作成されており、そのクラスターに GPU 高速化ノードが含まれていること。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
インスタンスタイプは
ecs.gn5-c4g1.xlarge、ecs.gn5i-c8g1.2xlarge、またはecs.gn5-c8g1.2xlargeを選択することを推奨します。クラスターに Knative がデプロイされていること。詳細については、「Knative のデプロイと管理」をご参照ください。
操作手順
サードパーティモデルである Stable Diffusion のユーザー同意書、利用規約、および関連する法律法規を遵守する必要があります。Alibaba Cloud は、Stable Diffusion の合法性、安全性、または正確性を保証しません。Alibaba Cloud は、Stable Diffusion の使用によって生じたいかなる損害についても責任を負いません。
Stable Diffusion は、ターゲットシーンや画像を迅速かつ正確に生成できます。しかし、本番環境で Stable Diffusion をデプロイするには、いくつかの課題があります:
スループットの制限:単一の Pod が処理できるリクエスト数には限りがあります。1つの Pod にあまりにも多くの同時リクエストを転送すると、サーバーが過負荷になる可能性があります。
コスト管理:GPU リソースは高価です。コストを効果的に管理するためには、オンデマンドでプロビジョニングし、トラフィックが少ない期間には迅速に解放する必要があります。
ACK Knative は、同時実行数ベースのオートスケーリングを提供することで、これらの課題に対処します。各 Pod に送信される同時リクエスト数を正確に管理することで、レプリカ数を自動的にスケールアップまたはスケールダウンさせることができ、本番環境レベルでコスト効率の高い Stable Diffusion サービスを構築できます。
ステップ1:Stable Diffusion サービスのデプロイ
Stable Diffusion サービスが GPU 高速化ノードに正しくデプロイされていることを確認する必要があります。そうでない場合、Stable Diffusion サービスは使用できません。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
Stable Diffusion サービスをデプロイします。
ACK Knative は、一般的に使用されるアプリケーションテンプレートを提供します。アプリケーションテンプレートまたは YAML ファイルを使用して、Stable Diffusion サービスを迅速にデプロイできます。
アプリケーションテンプレート
[人気のあるアプリ] タブをクリックし、stable-diffusion カードの [クイックデプロイ] をクリックします。

デプロイ後、[サービス] をクリックしてサービスリストでデプロイステータスを表示します。[ステータス] が [作成済み] になっていれば、サービスはデプロイされています。
YAML
[サービス] タブで、[名前空間] ドロップダウンリストから [default] を選択し、[テンプレートから作成] をクリックします。次の YAML テンプレートをコードエディタにコピーし、[作成] をクリックして
stable-diffusionという名前のサービスを作成します。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: stable-diffusion annotations: serving.knative.dev.alibabacloud/affinity: "cookie" serving.knative.dev.alibabacloud/cookie-name: "sd" serving.knative.dev.alibabacloud/cookie-timeout: "1800" spec: template: metadata: annotations: autoscaling.knative.dev/class: kpa.autoscaling.knative.dev autoscaling.knative.dev/maxScale: '10' autoscaling.knative.dev/targetUtilizationPercentage: "100" k8s.aliyun.com/eci-use-specs: ecs.gn5-c4g1.xlarge,ecs.gn5i-c8g1.2xlarge,ecs.gn5-c8g1.2xlarge spec: containerConcurrency: 1 containers: - args: - --listen - --skip-torch-cuda-test - --api command: - python3 - launch.py image: yunqi-registry.cn-shanghai.cr.aliyuncs.com/lab/stable-diffusion@sha256:62b3228f4b02d9e89e221abe6f1731498a894b042925ab8d4326a571b3e992bc imagePullPolicy: IfNotPresent ports: - containerPort: 7860 name: http1 protocol: TCP name: stable-diffusion readinessProbe: tcpSocket: port: 7860 initialDelaySeconds: 5 periodSeconds: 1 failureThreshold: 3サービスが以下のステータスであれば、デプロイは成功です。

ステップ2:Stable Diffusion サービスへのアクセス
[サービス] タブで、サービスの [ゲートウェイ IP アドレス] と [デフォルトドメイン名] を記録します。
説明ALB Ingress を使用する場合、次の
curlコマンド形式でサービスにアクセスできます:curl -H "Host: stable-diffusion.default.example.com" http:alb-XXX.cn-hangzhou.alb.aliyuncsslb.com # ご利用の ALB Ingress の実際のアドレスに置き換えてください。直接アクセスするには、ALB インスタンスの CNAME レコードを設定します。
ローカルの
hostsファイルにエントリを追加して、サービスのゲートウェイアドレスをアクセスしたいドメインにマッピングします。次のサンプルコードは一例です:47.xx.xxx.xx stable-diffusion.default.example.com # ご利用の実際のゲートウェイ IP アドレスに置き換えてください。hostsファイルを変更した後、[サービス] タブに移動し、stable-diffusionサービスのデフォルトドメイン名をクリックしてサービスにアクセスします。次のページが表示されれば、設定は成功です。

ステップ3:リクエストに基づくオートスケーリングの有効化
負荷テストツール
heyを使用してストレステストを実行します。説明ストレステストに使用される hey ツールの詳細については、hey をご参照ください。
hey -n 50 -c 5 -t 180 -m POST -H "Content-Type: application/json" -d '{"prompt": "pretty dog"}' http://stable-diffusion.default.example.com/sdapi/v1/txt2img各バッチで5つの同時リクエストを含む50のリクエストを送信し、タイムアウト期間を 180 秒に設定します。
期待される出力:
Summary: Total: 252.1749 secs Slowest: 62.4155 secs Fastest: 9.9399 secs Average: 23.9748 secs Requests/sec: 0.1983 Response time histogram: 9.940 [1] |■■ 15.187 [17] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 20.435 [9] |■■■■■■■■■■■■■■■■■■■■■ 25.683 [11] |■■■■■■■■■■■■■■■■■■■■■■■■■■ 30.930 [1] |■■ 36.178 [1] |■■ 41.425 [3] |■■■■■■■ 46.673 [1] |■■ 51.920 [2] |■■■■■ 57.168 [1] |■■ 62.415 [3] |■■■■■■■ Latency distribution: 10% in 10.4695 secs 25% in 14.8245 secs 50% in 20.0772 secs 75% in 30.5207 secs 90% in 50.7006 secs 95% in 61.5010 secs 0% in 0.0000 secs Details (average, fastest, slowest): DNS+dialup: 0.0424 secs, 9.9399 secs, 62.4155 secs DNS-lookup: 0.0385 secs, 0.0000 secs, 0.3855 secs req write: 0.0000 secs, 0.0000 secs, 0.0004 secs resp wait: 23.8850 secs, 9.9089 secs, 62.3562 secs resp read: 0.0471 secs, 0.0166 secs, 0.1834 secs Status code distribution: [200] 50 responses出力は、50件すべてのリクエストが正常に処理されたことを示しています。
次のコマンドを実行して Pod をクエリします:
watch -n 1 'kubectl get po'
出力は、Stable Diffusion サービス用に5つの Pod が作成されたことを示しています。これは、サービスに
containerConcurrency: 1が設定されており、1つの Pod が最大で1つのリクエストを同時に処理できることを示しているためです。
ステップ4:Stable Diffusion サービスのモニタリングデータの表示
Knative は、すぐに使える可観測性機能を提供します。[Knative] ページの [モニタリングダッシュボード] で Stable Diffusion サービスのモニタリングデータを表示できます。Knative ダッシュボードを有効にして使用するには、「Knative モニタリングダッシュボードの表示」をご参照ください。
関連ドキュメント
Knative で AI 推論サービスをデプロイするには、「Knative で AI 推論サービスをデプロイするためのベストプラクティス」をご参照ください。