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

Container Service for Kubernetes:ECI に基づく弾性推論

最終更新日:Dec 27, 2025

モデルをトレーニングした後、通常は推論サービスとしてデプロイします。推論サービスへの呼び出し数はビジネス需要に応じて変動するため、コストを節約するには弾性的にスケールできるサーバーが必要です。従来のデプロイソリューションでは、大規模で高同時実行性システムの要求を満たすことができません。Alibaba Cloud では、Elastic Container Instance (ECI) 上でワークロードを実行することで、推論サービスの弾性スケーリング要件を満たすことができます。このトピックでは、ECI 上で弾性推論サービスを実行する方法について説明します。

前提条件

  • デプロイ準備が整ったモデル。このトピックでは、TensorFlow 1.15 でトレーニングされた Bidirectional Encoder Representations from Transformers (BERT) モデルを使用します。

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

操作手順

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

  2. 永続ボリューム (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 # Must be the same as the PV name.
          volumeAttributes:
            bucket: "Your Bucket"
            url: "Your oss url"
            akId: "Your Access Key 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
        volumeName: model-csi-pv
        storageClassName: ""
        resources:
          requests:
            storage: 5Gi

      パラメーター

      説明

      bucket

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

      url

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

      akId

      OSS バケットへのアクセスに使用される AccessKey ID と AccessKey Secret。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

      有効値:

      • デフォルト (未設定):クラスター内の既存の Elastic Compute Service (ECS) リソースのみが使用されます。

      • eci:クラスター内の ECS リソースが不足している場合に ECI リソースが使用されます。

      • eci_only:ECI リソースのみが使用されます。クラスター内の ECS リソースは使用されません。

      k8s.aliyun.com/eci-use-specs

      ECI GPU リソースを使用するには、このアノテーションを使用して GPU インスタンスタイプを指定します。

      arena serve 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/chnsenticorp \
         --version-policy=specific:1623831335 \
         --annotation=alibabacloud.com/burst-resource=eci_only \
         --annotation=k8s.aliyun.com/eci-use-specs=ecs.gn6i-c4g1.xlarge
    2. 次のコマンドを実行して、サービスステータスを表示します。

      arena serve list

      期待される出力:

      NAME            TYPE        VERSION       DESIRED  AVAILABLE  ADDRESS        PORTS                   GPU
      bert-tfserving  Tensorflow  202207181536  1        1          172.16.52.170  GRPC:8500,RESTFUL:8501  1
    3. 次のコマンドを実行して、Pod のステータスを表示します。

      kubectl get pods -o wide

      期待される出力:

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

      出力は、Node タイプが virtual-kubelet-cn-beijing-h であることを示しています。これは、Pod が ECI インスタンスにデプロイされていることを示します。

  4. Horizontal Pod Autoscaler (HPA) を作成します。HPA は、ワークロードに基づいて Kubernetes の Pod レプリカ数を自動的にスケーリングします。

    1. 次のコマンドを実行して、推論サービスの Deployment を表示します。

      kubectl get deployment

      期待される出力:

      NAME                                             READY   UP-TO-DATE   AVAILABLE   AGE
      bert-tfserving-202207181536-tensorflow-serving   1/1     1            1           2m18s
    2. 次のコマンドを実行して、推論サービスの Service を表示します。

      kubectl get service

      期待される出力:

      NAME                                             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
      bert-tfserving-202207181536-tensorflow-serving   ClusterIP   172.16.52.170   <none>        8500/TCP,8501/TCP   2m45s
    3. 次のテンプレートを使用して、bert-tfserving-eci-hpa.yaml という名前のファイルを作成します。

      apiVersion: autoscaling/v2
      kind: HorizontalPodAutoscaler
      metadata:
        name: bert-tfserving-eci-hpa
        namespace: default
      spec:
        scaleTargetRef:
          apiVersion: apps/v1
          kind: Deployment
          name: bert-tfserving-202207181536-tensorflow-serving
        minReplicas: 1
        maxReplicas: 10
        metrics:
        - type: External
          external:
            metric:
              name: sls_ingress_qps
              selector:
                matchLabels:
                  sls.project: "k8s-log-{cluster id}"
                  sls.logstore: "nginx-ingress"
                  sls.ingress.route: "default-bert-tfserving-202207181536-tensorflow-serving-8501"
            target:
              type: AverageValue
              averageValue: "10"
                                      

      主要なパラメーターは次のとおりです。

      パラメーター

      説明

      scaleTargetRef

      HPA がバインドされるオブジェクト。このトピックでは、ステップ a の推論サービス Deployment の名前に設定されます。

      minReplicas

      レプリカの最小数。

      maxReplicas

      レプリカの最大数。

      sls.project

      クラスターのログプロジェクトの名前。フォーマットは k8s-log-{cluster id} です。{cluster id} を実際のクラスター ID に置き換えてください。

      sls.logstore

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

      sls.ingress.route

      Ingress ルート。フォーマットは {namespace}-{service name}-{service port} です。

      metricname

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

      targetaverageValue

      スケールアウトをトリガーする秒間クエリ数 (QPS) の値。このトピックでは、10 に設定されます。QPS が 10 を超えるとスケールアウトがトリガーされます。

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

      kubectl get hpa

      期待される出力:

      NAME                     REFERENCE                                                   TARGETS      MINPODS   MAXPODS   REPLICAS   AGE
      bert-tfserving-eci-hpa   Deployment/bert-tfserving-202207181536-tensorflow-serving   0/10 (avg)   1         10        1          116s
  5. パブリック Ingress を設定します。

    arena serve tensorflow コマンドでデプロイされた推論サービスは、デフォルトで ClusterIP Service によって公開され、パブリックネットワークからはアクセスできません。したがって、推論サービス用にパブリック Ingress を作成する必要があります。

    1. [Ingress] ページで、推論サービスが配置されている [名前空間] を選択し、次に [Ingress の作成] をクリックします。次のパラメーターを設定します。パラメーターの詳細については、「NGINX Ingress を作成して使用し、サービスを公開する」をご参照ください。

      • 名前bert-tfserving に設定します。

      • ルール

        • ドメイン名:カスタムドメイン名 (例:test.example.com)。

        • パスのマッピング

          • パス:ルートパス / を保持します。

          • マッチングルール:デフォルト (ImplementationSpecific)。

          • サービス名ステップ 3.b で取得したサービス名に設定します。この例では、サービス名は bert-tfserving-202207181536-tensorflow-serving です。

          • ポート8501 に設定します。

    2. [Ingresses] ページで、[Rules] 列でターゲット Ingress のアドレスを確認します。

  6. ステップ 5.d で取得したアドレスを使用して、推論サービスに対してストレステストを実行します。秒間クエリ数 (QPS) が HPA で設定された averageValue を超えると、スケールアウトがトリガーされます。Pod の数は maxReplicas を超えません。QPS が averageValue を下回ると、スケールインがトリガーされます。