Knativeに基づくStable Diffusion ServiceをContainer Service for Kubernetes (ACK) クラスターにデプロイすると、Knativeソリューションにより、ポッドが処理できる同時リクエストの最大数をそのスループットに基づいて正確に制御できます。 これにより、サービスの安定性が確保されます。 Knativeは、トラフィックが予想されないときにポッドを自動的にゼロにスケーリングすることもできます。 これにより、GPUリソースの費用が削減されます。
前提条件
Kubernetes 1.24以降を実行するACKクラスターが作成され、クラスターにはGPU高速化ノードが含まれています。 詳細については、「ACK管理クラスターの作成」をご参照ください。
ecs.gn5-c4g1.xlarge、ecs.gn5i-c8g1.2xlarge、またはecs.gn5-c8g1.2xlargeを選択することを推奨します。
Knativeはクラスターにデプロイされています。 詳細については、「」「Knativeのデプロイ」をご参照ください。
手順
サードパーティ製モデルStable DiffusionStable Diffusionのユーザー契約、使用仕様、および関連する法律および規制を遵守する必要があります。 Alibaba Cloudは、安定拡散の正当性、セキュリティ、または正確性を保証するものではありません。 Alibaba Cloudは、安定拡散の使用によって生じたいかなる損害についても責任を負わないものとします。
ジェネレーティブAI技術の開発に伴い、AIモデルを使用して研究開発効率を向上させようとする開発者が増えています。 よく知られているAI生成コンテンツ (AIGC) プロジェクトとして、Stable Diffusionは、ユーザーが目的のシーンや写真をすばやく正確に生成するのに役立ちます。 ただし、安定した拡散を使用すると、次の課題に直面する可能性があります。
ポッドの最大スループットは限られています。 過剰な数のリクエストが同じポッドに転送されると、ポッドは過負荷になります。 この問題を解決するには、ポッドが処理できる同時リクエストの最大数を制限する必要があります。
GPUリソースは高価であり、オンデマンドでGPUを使用し、オフピーク時にGPUをリリースする必要があります。
上記の問題を解決するために、ACKはKnativeと統合され、正確な同時リクエスト処理と自動スケーリングをサポートします。 これにより、Knativeに基づく本番環境に安定拡散サービスをデプロイできます。 次の図は、Knativeに基づく運用環境で安定拡散サービスを展開する方法を示しています。
ステップ1: 安定した拡散サービスの展開
安定拡散サービスがGPUアクセラレーションノードに正しくデプロイされていることを確認する必要があります。 それ以外の場合、安定拡散サービスは使用できません。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
安定した拡散サービスを展開します。
ACK Knativeは、一般的に使用されるアプリケーションテンプレートを提供します。 アプリケーションテンプレートまたはYAMLファイルを使用して、Stable Diffusion Serviceをすばやくデプロイできます。
アプリケーションテンプレート
[人気のアプリ] タブをクリックし、stable-diffusionカードの [クイックデプロイ] をクリックします。
展開後、[サービス] をクリックすると、[サービス] リストに展開ステータスが表示されます。
次の図は、安定拡散サービスがデプロイされていることを示しています。
YAML
[サービス] タブで、[名前空間] ドロップダウンリストから [デフォルト] を選択し、[テンプレートから作成] をクリックします。 次のYAMLテンプレートをコードエディターにコピーし、[作成] をクリックしてknative-sd-demoという名前のサービスを作成します。
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: knative-sd-demo 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
サービスが次の状態の場合、knative-sd-demoサービスが作成されます。
ステップ2: 安定した拡散サービスにアクセスする
[サービス] タブで、サービスのゲートウェイIPアドレスとデフォルトドメイン名を記録します。
次の情報をhostsファイルに追加して、サービスのドメイン名をknative-sd-demoサービスのゲートウェイのIPアドレスにマップします。 hostsファイルに追加する内容を次のサンプルコードに示します。
47.xx.xxx.xx knative-sd-demo.default.example.com # Replace the IP address and domain name with the actual values.
hostsファイルを変更したら、[サービス] タブに移動し、knative-sd-demo Stable Diffusion Serviceの既定のドメイン名をクリックしてサービスにアクセスします。
次のページが表示された場合、アクセスは成功です。
ステップ3: リクエストに基づいて自動スケーリングを有効にする
負荷テストツールを使用してストレステストを実行します。
説明ストレステストに使用されるheyツールの詳細については、「hey」をご参照ください。
hey -n 50 -c 5 -t 180 -m POST -H "Content-Type: application/json" -d '{"prompt": "pretty dog"}' http://knative-sd-demo.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のリクエストすべてが正常に処理されたことを示します。
次のコマンドを実行してポッドを照会します。
watch -n 1 'kubectl get po'
出力は、安定拡散サービス用に5つのポッドが作成されたことを示します。 これは、
containerConcurrency: 1
がサービスに設定されているためです。これは、ポッドが最大1つのリクエストを同時に処理できることを示しています。
ステップ4: 安定拡散サービスのモニタリングデータを表示する
Knativeは、すぐに使える可観測性機能を提供します。 安定拡散サービスのモニタリングデータは、Knativeページの [モニタリングダッシュボード] で確認できます。 Knativeダッシュボードを有効にする方法の詳細については、「Knativeモニタリングダッシュボードの表示」をご参照ください。
[概要 (選択した時間範囲の平均)] セクションでは、Knativeリクエストの数 (リクエスト量) 、リクエスト成功率 (成功率) 、クライアントエラー (4xx) 、サーバーエラー (5xx) 、およびポッドのスケーリング傾向を表示できます。
[応答時間] セクションでは、P50、P90、P95、およびP99の応答待ち時間を含むKnativeの応答待ち時間データを表示できます。
関連ドキュメント
KnativeでAI推論サービスをデプロイする方法の詳細については、「KnativeでAI推論サービスをデプロイするためのベストプラクティス」をご参照ください。