モデルをトレーニングした後、通常は推論サービスとしてデプロイします。推論サービスへの呼び出し数はビジネス需要に応じて変動するため、コストを節約するには弾性的にスケールできるサーバーが必要です。従来のデプロイソリューションでは、大規模で高同時実行性システムの要求を満たすことができません。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 への接続」をご参照ください。
操作手順
トレーニング済みのモデルを Object Storage Service (OSS) バケットにアップロードします。詳細については、「オブジェクトのアップロード」をご参照ください。
永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成します。
次のテンプレートを使用して、
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 がサポートするカスタムパラメーター」をご参照ください。
次のコマンドを実行して、PV と PVC を作成します。
kubectl apply -f pvc.yaml
推論サービスをデプロイします。
次のコマンドを実行して、推論サービスをデプロイします。
推論サービスをデプロイする際に、アノテーションを使用してリソースタイプを指定できます。主要なパラメーターは次のとおりです。
パラメーター
説明
alibabacloud.com/burst-resource有効値:
デフォルト (未設定):クラスター内の既存の Elastic Compute Service (ECS) リソースのみが使用されます。
eci:クラスター内の ECS リソースが不足している場合に ECI リソースが使用されます。eci_only:ECI リソースのみが使用されます。クラスター内の ECS リソースは使用されません。
k8s.aliyun.com/eci-use-specsECI 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次のコマンドを実行して、サービスステータスを表示します。
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次のコマンドを実行して、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 インスタンスにデプロイされていることを示します。
Horizontal Pod Autoscaler (HPA) を作成します。HPA は、ワークロードに基づいて Kubernetes の Pod レプリカ数を自動的にスケーリングします。
次のコマンドを実行して、推論サービスの Deployment を表示します。
kubectl get deployment期待される出力:
NAME READY UP-TO-DATE AVAILABLE AGE bert-tfserving-202207181536-tensorflow-serving 1/1 1 1 2m18s次のコマンドを実行して、推論サービスの 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次のテンプレートを使用して、
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"主要なパラメーターは次のとおりです。
パラメーター
説明
scaleTargetRefHPA がバインドされるオブジェクト。このトピックでは、ステップ a の推論サービス Deployment の名前に設定されます。
minReplicasレプリカの最小数。
maxReplicasレプリカの最大数。
sls.projectクラスターのログプロジェクトの名前。フォーマットは
k8s-log-{cluster id}です。{cluster id}を実際のクラスター ID に置き換えてください。sls.logstoreLogstore の名前。デフォルト値は
nginx-ingressです。sls.ingress.routeIngress ルート。フォーマットは
{namespace}-{service name}-{service port}です。metricnameメトリック名。このトピックでは、
sls_ingress_qpsに設定されます。targetaverageValueスケールアウトをトリガーする秒間クエリ数 (QPS) の値。このトピックでは、
10に設定されます。QPS が 10 を超えるとスケールアウトがトリガーされます。次のコマンドを実行して、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
パブリック Ingress を設定します。
arena serve tensorflowコマンドでデプロイされた推論サービスは、デフォルトで ClusterIP Service によって公開され、パブリックネットワークからはアクセスできません。したがって、推論サービス用にパブリック Ingress を作成する必要があります。[Ingress] ページで、推論サービスが配置されている [名前空間] を選択し、次に [Ingress の作成] をクリックします。次のパラメーターを設定します。パラメーターの詳細については、「NGINX Ingress を作成して使用し、サービスを公開する」をご参照ください。
名前:
bert-tfservingに設定します。ルール:
ドメイン名:カスタムドメイン名 (例:
test.example.com)。パスのマッピング:
パス:ルートパス
/を保持します。マッチングルール:デフォルト (ImplementationSpecific)。
サービス名:ステップ 3.b で取得したサービス名に設定します。この例では、サービス名は
bert-tfserving-202207181536-tensorflow-servingです。ポート:8501 に設定します。
[Ingresses] ページで、[Rules] 列でターゲット Ingress のアドレスを確認します。
ステップ 5.d で取得したアドレスを使用して、推論サービスに対してストレステストを実行します。秒間クエリ数 (QPS) が HPA で設定された
averageValueを超えると、スケールアウトがトリガーされます。Pod の数はmaxReplicasを超えません。QPS がaverageValueを下回ると、スケールインがトリガーされます。