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

Container Service for Kubernetes:ECS ベースの推論の拡張

最終更新日:May 08, 2025

モデルのトレーニング後、モデルは通常、推論サービスとしてデプロイされます。推論サービスへの呼び出し数は、ビジネス要件に基づいて動的に変化します。さまざまな負荷を処理し、コストを削減するには、弾性スケーリングが必要です。従来のデプロイソリューションでは、大規模で同時実行性の高いシステムの弾力性要件を満たすことができません。Container Service for Kubernetes (ACK) を使用すると、弾性ノードプールにワークロードをデプロイして、推論サービスの弾性スケーリングを有効にすることができます。このトピックでは、Elastic Compute Service (ECS) インスタンスで推論ワークロードを実行する方法について説明します。

前提条件

手順

  1. 弾性ノードプールを作成します。

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

    2. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。

    3. 詳細ページの左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。

    4. [ノードプール] ページの右上隅にある [ノードプールの作成] をクリックします。

    5. [ノードプールの作成] ダイアログボックスで、パラメーターを設定し、[注文の確認] をクリックします。次の表に、主要なパラメーターを示します。その他のパラメーターの詳細については、「ノードプールを作成および管理する」をご参照ください。

      パラメーター

      説明

      Auto Scaling

      [自動] を選択し、[最小インスタンス数][最大インスタンス数] を構成します。

      課金方法

      [プリエンプティブインスタンス] を選択します。

      ノードラベル

      [キー]inference に、[値]tensorflow に設定します。

      スケーリングポリシー

      [コスト最適化] を選択し、[従量課金インスタンスの割合] を 30% に設定します。

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

  3. 永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成します。

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

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: model-csi-pv
      spec:
        capacity:
          storage: 5Gi
        accessModes:
          - ReadWriteMany
        persistentVolumeReclaimPolicy: Retain
        csi:
          driver: ossplugin.csi.alibabacloud.com
          volumeHandle: model-csi-pv // 値は PV の名前と同じである必要があります。
          volumeAttributes:
            bucket: "<Your Bucket>" // バケット名
            url: "<Your oss url>" // OSS URL
            akId: "<Your Access Key Id>" // アクセスキー ID
            akSecret: "<Your Access Key Secret>" // アクセスキーシークレット
            otherOpts: "-o max_stat_cache_size=0 -o allow_other"
      ---
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: model-pvc
      spec:
        accessModes:
        - ReadWriteMany
        resources:
          requests:
            storage: 5Gi

      パラメーター

      説明

      bucket

      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
  4. 次のコマンドを実行して、推論サービスをデプロイします。

    arena serve tensorflow \
      --name=bert-tfserving \
      --model-name=chnsenticorp  \
      --selector=inference:tensorflow \
      --gpus=1  \
      --image=tensorflow/serving:1.15.0-gpu \
      --data=model-pvc:/models \
      --model-path=/models/tensorflow \
      --version-policy=specific:1623831335 \
      --limits=nvidia.com/gpu=1 \
      --requests=nvidia.com/gpu=1 

    パラメーター

    説明

    selector

    selector パラメーターは、ラベルに基づいて TensorFlow トレーニングジョブのポッドを選択するために使用されます。この例では、値は inference: tensorflow に設定されています。

    limits: nvidia.com/gpu

    サービスで使用できる GPU の最大数。

    requests: nvidia.com/gpu

    サービスに必要な GPU の最小数。

    model-name

    モデルの名前。

    model-path

    モデルのパス。

  5. Horizontal Pod Autoscaler (HPA) を構成します。HPA は、ワークロードに基づいて Kubernetes クラスター内の複製ポッドの数を自動的に調整できます。

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

      apiVersion: autoscaling/v2beta1
      kind: HorizontalPodAutoscaler
      metadata:
        name: bert-tfserving-hpa
      spec:
        scaleTargetRef:
          apiVersion: apps/v1
          kind: Deployment
          name: bert-tfserving-202107141745-tensorflow-serving // デプロイメント名
        minReplicas: 1
        maxReplicas: 10
        metrics:
        - type: External
          external:
            metricName: sls_ingress_qps
            metricSelector:
              matchLabels:
                sls.project: "k8s-log-c210fbedb96674b9eaf15f2dc47d169a8" // プロジェクト名
                sls.logstore: "nginx-ingress" //ログストア名
                sls.ingress.route: "default-bert-tfserving-202107141745-tensorflow-serving-8501" // Ingress ルート
            targetAverageValue: 10

      パラメーター

      説明

      scaleTargetRef

      HPA がバインドされているオブジェクト。この例では、値は推論サービスのデプロイメントの名前に設定されています。

      minReplicas

      複製ポッドの最小数。

      maxReplicas

      複製ポッドの最大数。

      sls.project

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

      sls.logstore

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

      sls.ingress.route

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

      metricname

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

      targetaverageValue

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

    2. 次のコマンドを実行して、HPA をデプロイします。

      kubectl apply -f hpa.yaml
  6. インターネット向け Ingress を構成します。

    デフォルトでは、arena serve tensorflow コマンドを実行してデプロイされた推論サービスは、インターネット経由でアクセスできない ClusterIP サービスを使用します。そのため、推論サービスのインターネット向け Ingress を作成する必要があります。

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

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

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

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

      • [ルール]:

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

        • [マッピング]

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

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

          • [サービス名]: kubectl get service コマンドによって返されるサービス名を入力します。

          • [ポート]: この例では、このパラメーターを [8501] に設定します。

  7. Ingress を作成した後、[Ingress] ページに移動し、Ingress を見つけます。[ルール] 列の値には、Ingress のエンドポイントが含まれています。12

  8. 取得した Ingress アドレスを使用して、推論サービスのストレステストを実行します。

  9. AI ダッシュボードにログインします。詳細については、「AI ダッシュボードにアクセスする」をご参照ください。

    重要

    AI ダッシュボードにログインする前に、クラウドネイティブ AI スイートをインストールし、アクセス方法を指定する必要があります。詳細については、「クラウドネイティブ AI スイートのデプロイ」をご参照ください。

  10. AI ダッシュボードの左側のナビゲーションウィンドウで、[弾性ジョブ] > [ジョブリスト] を選択します。[推論ジョブ] タブをクリックして、推論サービスの詳細を表示します。

    次の図は、スケールアウトアクティビティで作成されたすべてのポッドが ECS インスタンスで実行されていることを示しています。従量課金 ECS インスタンスとプリエンプティブ ECS インスタンスの両方がプロビジョニングされます。従量課金 ECS インスタンスの比率は、ノードプールの作成時に指定したパーセント値と同じです。ESS