モデルトレーニングジョブが完了すると、モデルは通常、推論サービスとしてデプロイされます。 推論サービスへの呼び出し回数は、ビジネス要件に基づいて動的に変化します。 さまざまな負荷を処理し、コストを削減するには、エラスティックスケーリングが必要です。 従来の展開ソリューションは、大規模かつ高度に並行するシステムの要件を満たすことができない。 Alibaba Cloudでは、エラスティックコンテナインスタンスにワークロードをデプロイして、推論サービスのエラスティックスケーリングを可能にします。 このトピックでは、エラスティックコンテナインスタンスでエラスティック推論ワークロードを実行する方法について説明します。
前提条件
モデルをデプロイする準備ができました。 このトピックでは、TensorFlow 1.15でトレーニングされたBERTモデルを使用します。
ack-virtual-node、ack-alibaba-cloud-metrics-adapter、およびarenaコンポーネントがインストールされています。 コンポーネントの管理方法の詳細については、「コンポーネントの管理」をご参照ください。 ack-virtual-nodeの詳細については、「接続の概要」をご参照ください。
手順
トレーニング済みモデルをObject Storage Service (OSS) バケットにアップロードします。 詳細については、「オブジェクトのアップロード」をご参照ください。
永続ボリューム (PV) と永続ボリュームクレーム (PVC) を作成します。
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でサポートされているカスタムパラメーター」をご参照ください。
次のコマンドを実行して、PVとPVCを作成します。
kubectl apply -f pvc.yaml
推論サービスをデプロイします。
次のコマンドを実行して、推論サービスをデプロイします。
アノテーションを使用して、要求するリソースタイプを指定できます。 下表に、各パラメーターを説明します。
パラメーター
説明
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
次のコマンドを実行して、サービスのステータスを照会します。
アリーナサーブ一覧
期待される出力:
名前タイプバージョンが必要利用可能なアドレスポートGPU bert-tfserving Tensorflow 202207181536 1 1 172.16.52.170 GRPC:8500、RESTFUL:8501 1
次のコマンドを実行して、ポッドのステータスを照会します。
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
であることを示しています。 これは、ポッドがエラスティックコンテナインスタンスにデプロイされていることを示します。
水平ポッドオートスケーラー (HPA) を設定します。 HPAは、ワークロードに基づいてKubernetesクラスター内のレプリケートされたポッドの数を自動的に調整できます。
次のコマンドを実行して、推論サービスの展開を照会します。
kubectl getデプロイ
期待される出力:
の名前は日付まで利用可能な年齢を準備しています bert-tfserving-202207181536-tensorflow-serving 1/1 1 1 2m1 8s
次のコマンドを実行して、サービスを照会します。
kubectl getサービス
期待される出力:
名タイプCLUSTER-IP EXTERNAL-IPポート年齢 bert-tfserving-202207181536-tensorflow-serving ClusterIP 172.16.52.170 <none> 8500/TCP、8501/TCP 2m4 5s
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を超えると、スケールアウトアクティビティがトリガーされます。次のコマンドを実行して、HPAのステータスを照会します。
kubectl get hpa
期待される出力:
名前の参照ターゲットは、レプリカスの年齢を強調します bert-tfserving-eci-hpa展開 /bert-tfserving-202207181536-tensorflow-serving 0/10 (avg) 1 10 1 116s
インターネットに接続するIngressを設定します。
デフォルトでは、
arena serve tensorflow
コマンドを実行してデプロイされる推論サービスには、クラスターIPアドレスのみが割り当てられます。 インターネット経由でサービスにアクセスすることはできません。 したがって、推論サービス用のインターネット向けIngressを作成する必要があります。ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[Ingress] ページの上部で、[名前空間] ドロップダウンリストから推論サービスが存在する名前空間を選択し、[Ingressの作成] をクリックします。 次の表に示すパラメーターを設定します。 パラメーターの詳細については、「NGINX Ingressの作成」をご参照ください。
名前: この例では、値は
bert-tfserving
に設定されています。ルール:
ドメイン名:
test.example.com
などのカスタムドメイン名を入力します。マッピング:
Path: この例では、ルートパス
/
が使用されています。Rule: この例では、デフォルトのルール (ImplementationSpecific) が使用されています。
サービス名: この例では、値は手順bで指定したサービス名
bert-tfserving-202207181536-tensorflow-serving
に設定されます。ポート: この例では、ポート8501が使用されます。
On theイングレスページでIngressのアドレスを確認します。ルール列を作成します。
ステップ5で取得したアドレスを使用して、推論サービスでストレステストを実行します。 QPS値がHPAで設定された
averageValue
より大きい場合、スケールアウトアクティビティがトリガーされ、ポッドの数はmaxReplicas
の値を超えません。 QPS値がaverageValue
より小さい場合、スケールインアクティビティがトリガーされます。