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

Container Service for Kubernetes:Knativeに基づく本番環境での安定した拡散サービスのデプロイ

最終更新日:Nov 20, 2024

Knativeに基づくStable Diffusion ServiceをContainer Service for Kubernetes (ACK) クラスターにデプロイすると、Knativeソリューションにより、ポッドが処理できる同時リクエストの最大数をそのスループットに基づいて正確に制御できます。 これにより、サービスの安定性が確保されます。 Knativeは、トラフィックが予想されないときにポッドを自動的にゼロにスケーリングすることもできます。 これにより、GPUリソースの費用が削減されます。

前提条件

手順

重要

サードパーティ製モデルStable DiffusionStable Diffusionのユーザー契約、使用仕様、および関連する法律および規制を遵守する必要があります。 Alibaba Cloudは、安定拡散の正当性、セキュリティ、または正確性を保証するものではありません。 Alibaba Cloudは、安定拡散の使用によって生じたいかなる損害についても責任を負わないものとします。

ジェネレーティブAI技術の開発に伴い、AIモデルを使用して研究開発効率を向上させようとする開発者が増えています。 よく知られているAI生成コンテンツ (AIGC) プロジェクトとして、Stable Diffusionは、ユーザーが目的のシーンや写真をすばやく正確に生成するのに役立ちます。 ただし、安定した拡散を使用すると、次の課題に直面する可能性があります。

  • ポッドの最大スループットは限られています。 過剰な数のリクエストが同じポッドに転送されると、ポッドは過負荷になります。 この問題を解決するには、ポッドが処理できる同時リクエストの最大数を制限する必要があります。

  • GPUリソースは高価であり、オンデマンドでGPUを使用し、オフピーク時にGPUをリリースする必要があります。

上記の問題を解決するために、ACKはKnativeと統合され、正確な同時リクエスト処理と自動スケーリングをサポートします。 これにより、Knativeに基づく本番環境に安定拡散サービスをデプロイできます。 次の図は、Knativeに基づく運用環境で安定拡散サービスを展開する方法を示しています。

image

ステップ1: 安定した拡散サービスの展開

重要

安定拡散サービスがGPUアクセラレーションノードに正しくデプロイされていることを確認する必要があります。 それ以外の場合、安定拡散サービスは使用できません。

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[アプリケーション] > [ネイティブ] を選択します。

  3. 安定した拡散サービスを展開します。

    ACK Knativeは、一般的に使用されるアプリケーションテンプレートを提供します。 アプリケーションテンプレートまたはYAMLファイルを使用して、Stable Diffusion Serviceをすばやくデプロイできます。

    アプリケーションテンプレート

    [人気のアプリ] タブをクリックし、stable-diffusionカードの [クイックデプロイ] をクリックします。

    展開後、[サービス] をクリックすると、[サービス] リストに展開ステータスが表示されます。

    次の図は、安定拡散サービスがデプロイされていることを示しています。

    image

    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サービスが作成されます。

    image

ステップ2: 安定した拡散サービスにアクセスする

  1. [サービス] タブで、サービスのゲートウェイIPアドレスデフォルトドメイン名を記録します。

  2. 次の情報を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.

  3. hostsファイルを変更したら、[サービス] タブに移動し、knative-sd-demo Stable Diffusion Serviceの既定のドメイン名をクリックしてサービスにアクセスします。

    次のページが表示された場合、アクセスは成功です。

    image.png

ステップ3: リクエストに基づいて自動スケーリングを有効にする

  1. 負荷テストツールを使用してストレステストを実行します。

    説明

    ストレステストに使用される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のリクエストすべてが正常に処理されたことを示します。

  2. 次のコマンドを実行してポッドを照会します。

    watch -n 1 'kubectl get po'

    image.png

    出力は、安定拡散サービス用に5つのポッドが作成されたことを示します。 これは、containerConcurrency: 1がサービスに設定されているためです。これは、ポッドが最大1つのリクエストを同時に処理できることを示しています。

ステップ4: 安定拡散サービスのモニタリングデータを表示する

Knativeは、すぐに使える可観測性機能を提供します。 安定拡散サービスのモニタリングデータは、Knativeページの [モニタリングダッシュボード] で確認できます。 Knativeダッシュボードを有効にする方法の詳細については、「Knativeモニタリングダッシュボードの表示」をご参照ください。

  • [概要 (選択した時間範囲の平均)] セクションでは、Knativeリクエストの数 (リクエスト量) 、リクエスト成功率 (成功率) 、クライアントエラー (4xx) 、サーバーエラー (5xx) 、およびポッドのスケーリング傾向を表示できます。

    image

  • [応答時間] セクションでは、P50、P90、P95、およびP99の応答待ち時間を含むKnativeの応答待ち時間データを表示できます。

    image.png

関連ドキュメント

KnativeでAI推論サービスをデプロイする方法の詳細については、「KnativeでAI推論サービスをデプロイするためのベストプラクティス」をご参照ください。