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

Container Service for Kubernetes:Elastic Containerインスタンスベースのエラスティック推論

最終更新日:Jan 07, 2025

モデルトレーニングジョブが完了すると、モデルは通常、推論サービスとしてデプロイされます。 推論サービスへの呼び出し回数は、ビジネス要件に基づいて動的に変化します。 さまざまな負荷を処理し、コストを削減するには、エラスティックスケーリングが必要です。 従来の展開ソリューションは、大規模かつ高度に並行するシステムの要件を満たすことができない。 Alibaba Cloudでは、エラスティックコンテナインスタンスにワークロードをデプロイして、推論サービスのエラスティックスケーリングを可能にします。 このトピックでは、エラスティックコンテナインスタンスでエラスティック推論ワークロードを実行する方法について説明します。

前提条件

  • モデルをデプロイする準備ができました。 このトピックでは、TensorFlow 1.15でトレーニングされたBERTモデルを使用します。

  • ack-virtual-node、ack-alibaba-cloud-metrics-adapter、およびarenaコンポーネントがインストールされています。 コンポーネントの管理方法の詳細については、「コンポーネントの管理」をご参照ください。 ack-virtual-nodeの詳細については、「接続の概要」をご参照ください。

手順

  1. トレーニング済みモデルをObject Storage Service (OSS) バケットにアップロードします。 詳細については、「オブジェクトのアップロード」をご参照ください。

  2. 永続ボリューム (PV) と永続ボリュームクレーム (PVC) を作成します。

    1. pvc.yamlという名前のファイルを作成し、次のコードをファイルにコピーします。

      apiVersion: v1
      kind: PersistentVolume
      メタデータ:
        名前: model-csi-pv
      spec:
        capacity:
          storage: 5Gi
        accessModes:
          - ReadWriteMany
        persistentVolumeReclaimPolicy: Retain
        csi:
          driver: ossplugin.csi.alibabacloud.com
          volumeHandle: model-csi-pv# 値はPVの名前と同じでなければなりません。 
          volumeAttributes:
            bucket: "あなたのバケツ"
            url: "あなたのoss url"
            akId: 「アクセスキーId」
            akSecret: 「あなたのアクセスキーの秘密」
            otherOpts: "-o max_stat_cache_size=0 -o allow_other"
      ---
      apiVersion: v1
      kind: PersistentVolumeClaim
      メタデータ:
        名前: model-pvc
      spec:
        accessModes:
        - ReadWriteMany
        resources:
          requests:
            ストレージ: 5Gi 

      パラメーター

      説明

      バケット

      OSSバケットの名前。OSS内でグローバルに一意です。 詳細については、「バケットの命名規則」をご参照ください。

      url

      バケット内のオブジェクトにアクセスするために使用されるURL。 詳細については、「単一オブジェクトのURLまたは複数オブジェクトのURLの取得」をご参照ください。

      akId

      OSSバケットへのアクセスに使用されるAccessKey IDとAccessKeyシークレット。 Resource access Management (RAM) ユーザーとしてOSSバケットにアクセスすることを推奨します。 詳細については、「AccessKey の作成」をご参照ください。

      akSecret

      otherOpts

      OSSバケットをマウントするためのカスタムパラメーター。

      • -o max_stat_cache_size=0を設定して、メタデータキャッシュを無効にします。 この機能が無効になっている場合、システムはOSS内のオブジェクトにアクセスしようとするたびに、OSSから最新のメタデータを取得します。

      • -o allow_otherを設定して、マウントしたOSSバケットに他のユーザーがアクセスできるようにします。

      その他のパラメーターの詳細については、「ossfsでサポートされているカスタムパラメーター」をご参照ください。

    2. 次のコマンドを実行して、PVとPVCを作成します。

      kubectl apply -f pvc.yaml
  3. 推論サービスをデプロイします。

    1. 次のコマンドを実行して、推論サービスをデプロイします。

      アノテーションを使用して、要求するリソースタイプを指定できます。 下表に、各パラメーターを説明します。

      パラメーター

      説明

      alibabacloud.com/burst-resource

      有効な値:

      • パラメーターが空の場合、クラスター内の既存のECS (Elastic Container Service) リソースのみが使用されます。 デフォルト設定です。

      • eci: クラスター内のECSリソースが不足している場合、Elasticコンテナインスタンスが使用されます。

      • ec_only: エラスティックコンテナインスタンスのみが使用されます。 クラスター内のECSリソースは使用されません。

      k8s.aliyun.com/eci-use-specs

      エラスティックコンテナインスタンスのGPUリソースを使用するには、このアノテーションを使用してGPU高速化インスタンスタイプを指定する必要があります。

      アリーナはtensorflow \を提供します
         -- namespace=default \
         -- name=bert-tfserving \
         -- model-name=chnsenticorp \
         -- gpus=1 \
         -- image=tensorflow/serving:1.15.0-gpu \
         -- data=model-pvc:/data \
         -- model-path=/data/models/tensorflow /chnenticorp \
         -- version-policy=specific:1623831335 \
         -- annotatio n=alibabacloud.com/burst-resource=eci_only \
         -- annotatio n=k8s.aliyun.com/eci-use-specs=ecs.gn6i-c4g1.xlarge 
    2. 次のコマンドを実行して、サービスのステータスを照会します。

      アリーナサーブ一覧

      期待される出力:

      名前タイプバージョンが必要利用可能なアドレスポートGPU
      bert-tfserving Tensorflow 202207181536 1 1 172.16.52.170 GRPC:8500、RESTFUL:8501 1 
    3. 次のコマンドを実行して、ポッドのステータスを照会します。

      kubectl get pods -o wide

      期待される出力:

      NAME READY STATUS RESTARTS AGE IPノードNOMINATED NOMINATED NODE READINESS GATES
      bert-tfserving-202207181536-tensorflow-serving-547797c546-djh58 1/1実行中0 114s 192.168.0.246 virtual-kubelet-cn-beijing-h <none> <none> 

      出力は、ノードのタイプがvirtual-kubelet-cn-beijing-hであることを示しています。 これは、ポッドがエラスティックコンテナインスタンスにデプロイされていることを示します。

  4. 水平ポッドオートスケーラー (HPA) を設定します。 HPAは、ワークロードに基づいてKubernetesクラスター内のレプリケートされたポッドの数を自動的に調整できます。

    1. 次のコマンドを実行して、推論サービスの展開を照会します。

      kubectl getデプロイ

      期待される出力:

      の名前は日付まで利用可能な年齢を準備しています
      bert-tfserving-202207181536-tensorflow-serving 1/1 1 1 2m1 8s 
    2. 次のコマンドを実行して、サービスを照会します。

      kubectl getサービス

      期待される出力:

      名タイプCLUSTER-IP EXTERNAL-IPポート年齢
      bert-tfserving-202207181536-tensorflow-serving ClusterIP 172.16.52.170 <none> 8500/TCP、8501/TCP 2m4 5s 
    3. bert-tfserving-eci-hpa.yamlという名前のファイルを作成し、次のコードをファイルにコピーします。

      apiVersion: 自動スケーリング /v2beta2
      種類: HorizontalPodAutoscaler
      メタデータ:
        名前: bert-tfserving-eci-hpa
        namespace: デフォルト
      spec:
        scaleTargetRef:
          apiVersion: apps/v1
          kind: Deployment
          名前: bert-tfserving-202207181536-tensorflow-serving
        minReplicas: 1
        maxReplicas: 10
        metrics:
        -タイプ: 外部
          external:
            metric:
              名前: sls_ingress_qps
              セレクタ:
                matchLabels:
                  sls.project: "k8s-log-{cluster id}"
                  sls.logstore: "nginx-ingress"
                  sls.ingress.route: "default-bert-tfserving-202207181536-tensorflow-serving-8501"
            ターゲット:
              タイプ: AverageValue
              averageValue: 10
                                      

      下表に、各パラメーターを説明します。

      パラメーター

      説明

      scaleTargetRef

      HPAがバインドされているオブジェクトを指定します。 この例では、値はStep aで設定された推論サービスのDeploymentの名前に設定されます。

      minReplicas

      レプリケートされたポッドの最小数。

      maxReplicas

      レプリケートされたポッドの最大数。

      sls.project

      クラスターで使用されるLog Serviceプロジェクトの名前。 パラメーターの値は、k8s-log-{cluster id} の形式である必要があります。

      sls.logstore

      Log Service Logstore の名前。 デフォルト値はnginx-ingressです。

      sls.ingress.route

      サービスを公開するために使用されるIngress。 この例では、値は {namespace}-{service name}-{service port} に設定されています。

      metricname

      メトリックの名前。 この例では、値はsls_ingress_qpsに設定されています。

      targetaverageValue

      スケールアウトアクティビティをトリガーする1秒あたりのクエリ (QPS) 値。 この例では、このパラメーターの値は10に設定されています。 QPS値が10を超えると、スケールアウトアクティビティがトリガーされます。

    4. 次のコマンドを実行して、HPAのステータスを照会します。

      kubectl get hpa

      期待される出力:

      名前の参照ターゲットは、レプリカスの年齢を強調します
      bert-tfserving-eci-hpa展開 /bert-tfserving-202207181536-tensorflow-serving 0/10 (avg) 1 10 1 116s 
  5. インターネットに接続するIngressを設定します。

    デフォルトでは、arena serve tensorflowコマンドを実行してデプロイされる推論サービスには、クラスターIPアドレスのみが割り当てられます。 インターネット経由でサービスにアクセスすることはできません。 したがって、推論サービス用のインターネット向けIngressを作成する必要があります。

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

    2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ネットワーク] > [Ingress] を選択します。

    3. [Ingress] ページの上部で、[名前空間] ドロップダウンリストから推論サービスが存在する名前空間を選択し、[Ingressの作成] をクリックします。 次の表に示すパラメーターを設定します。 パラメーターの詳細については、「NGINX Ingressの作成」をご参照ください。

      • 名前: この例では、値はbert-tfservingに設定されています。

      • ルール:

        • ドメイン名: test.example.comなどのカスタムドメイン名を入力します。

        • マッピング:

          • Path: この例では、ルートパス /が使用されています。

          • Rule: この例では、デフォルトのルール (ImplementationSpecific) が使用されています。

          • サービス名: この例では、値は手順bで指定したサービス名bert-tfserving-202207181536-tensorflow-servingに設定されます。

          • ポート: この例では、ポート8501が使用されます。

    4. On theイングレスページでIngressのアドレスを確認します。ルール列を作成します。

  6. ステップ5で取得したアドレスを使用して、推論サービスでストレステストを実行します。 QPS値がHPAで設定されたaverageValueより大きい場合、スケールアウトアクティビティがトリガーされ、ポッドの数はmaxReplicasの値を超えません。 QPS値がaverageValueより小さい場合、スケールインアクティビティがトリガーされます。