モデルのトレーニング後、モデルは通常、推論サービスとしてデプロイされます。 推論サービスへの呼び出し回数は、ビジネス要件に基づいて動的に変化します。 さまざまな負荷を処理し、コストを削減するには、エラスティックスケーリングが必要です。 従来の展開ソリューションは、大規模かつ高度に並行するシステムの弾性要件を満たすことができない。 Container Service for Kubernetes (ACK) を使用すると、エラスティックノードプールにワークロードをデプロイして、推論サービスのエラスティックスケーリングを有効にできます。 このトピックでは、elastic Compute Service (ECS) インスタンスでElastic inferenceワークロードを実行する方法について説明します。
前提条件
モデルが訓練される。 このトピックでは、TensorFlow 1.15でトレーニングされたBERTモデルを使用します。
ack-alibaba-cloud-metrics-adapterコンポーネントがインストールされています。 詳細については、「コンポーネントの管理」をご参照ください。
AIダッシュボードがインストールされています。 詳細については、「クラウドネイティブAIスイートのデプロイ」をご参照ください。
手順
エラスティックノードプールを作成します。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、[操作] 列の [詳細] をクリックします。 クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
の右上隅にノードプールページをクリックします。ノードプールの作成.
[ノードプールの作成] ダイアログボックスでパラメーターを設定し、[注文の確認] をクリックします。 次の表に、主要なパラメーターを示します。 その他のパラメーターの詳細については、「ノードプールの作成と管理」をご参照ください。
パラメーター
説明
Auto Scaling
[自動] を選択し、最小値を設定します。 インスタンスとMax。 インスタンスの
Billing Method
[プリエンプティブルインスタンス] を選択します。
ノードラベル
Keyを
inference
に、Valueをtensorflow
に設定します。スケーリングポリシー
[コスト最適化] を選択し、[従量課金インスタンスの割合] を [30%] に設定します。
トレーニング済みモデルを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 // The value must be the same as the name of the PV. 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 resources: requests: storage: 5Gi
パラメーター
説明
バケット
OSSバケットの名前。OSS内でグローバルに一意です。 詳細については、「バケットの命名規則」をご参照ください。
url
バケット内のオブジェクトにアクセスするために使用されるURL。 詳細については、「単一オブジェクトのURLまたは複数オブジェクトのURLの取得」をご参照ください。
akId
OSSバケットへのアクセスに使用されるAccessKey IDとAccessKeyシークレット。 Resource access Management (RAM) ユーザーとしてOSSバケットにアクセスすることを推奨します。 詳細については、「アクセスキーの作成」をご参照ください。
akSecret
otherOpts
OSSバケットをマウントするためのカスタムパラメーター。
-o max_stat_cache_size=0
を設定して、メタデータキャッシュを無効にします。 この機能が無効になっている場合、システムはOSS内のオブジェクトにアクセスしようとするたびに、OSSから最新のメタデータを取得します。-o allow_other
を設定して、マウントしたOSSバケットに他のユーザーがアクセスできるようにします。
その他のパラメーターの詳細については、「ossfsでサポートされているカスタムパラメーター」をご参照ください。
次のコマンドを実行して、PVとPVCを作成します。
kubectl apply -f pvc.yaml
次のコマンドを実行して、推論サービスをデプロイします。
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
パラメーターは、ラベルに基づいてTensorFlowトレーニングジョブのポッドを選択するために使用されます。 この例では、値はinference: tensorflow
に設定されています。limits: nvidia.com/gpu
サービスで使用できるGPUの最大数。
requests: nvidia.com/gpu
サービスに必要なGPUの最小数。
モデル名
モデルの名前。
モデルパス
モデルのパス。
水平ポッドオートスケーラー (HPA) を設定します。 HPAは、ワークロードに基づいてKubernetesクラスター内のレプリケートされたポッドの数を自動的に調整できます。
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" 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
スケールアウトアクティビティをトリガーする1秒あたりのクエリ (QPS) 値。 この例では、このパラメーターの値は
10
に設定されています。 QPS値が10を超えると、スケールアウトアクティビティがトリガーされます。次のコマンドを実行してHPAをデプロイします。
kubectl apply -f hpa.yaml
インターネットに接続するIngressを設定します。
デフォルトでは、
arena serve tensorflow
コマンドを実行してデプロイされる推論サービスには、クラスターIPアドレスのみが割り当てられます。 インターネット経由でサービスにアクセスすることはできません。 したがって、推論サービス用のインターネット向けIngressを作成する必要があります。ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[Ingress] ページの上部で、[名前空間] ドロップダウンリストから推論サービスが存在する名前空間を選択し、[Ingressの作成] をクリックします。 次の表に示すパラメーターを設定します。 パラメーターの詳細については、「NGINX Ingressの作成」をご参照ください。
名前: この例では、値は
bert-tfserving
に設定されています。ルール:
ドメイン名:
test.example.com
などのカスタムドメイン名を入力します。マッピング
Path: この例では、ルートパス
/
が使用されています。Rule: この例では、デフォルトのルール (ImplementationSpecific) が使用されています。
サービス名:
kubectl get Service
コマンドによって返されるサービス名を入力します。ポート: この例では、このパラメーターを8501に設定します。
Ingressを作成したら、Ingressページに移動してIngressを見つけます。 [ルール] 列の値には、Ingressのエンドポイントが含まれます。
取得したIngressアドレスを使用して、推論サービスでストレステストを実行します。
AIダッシュボードにログインします。 詳細については、「AIダッシュボードへのアクセス」をご参照ください。
重要AIダッシュボードにログインする前に、クラウドネイティブAIスイートをインストールし、アクセス方法を指定する必要があります。 詳細については、「クラウドネイティブAIスイートのデプロイ」をご参照ください。
AIダッシュボードの左側のナビゲーションウィンドウで、
を選択します。 [推論ジョブ] タブをクリックして、推論サービスに関する詳細を表示します。次の図は、スケールアウトアクティビティで作成されたすべてのポッドがECSインスタンスで実行されることを示しています。 従量課金ECSインスタンスとプリエンプティブECSインスタンスの両方がプロビジョニングされます。 従量課金ECSインスタンスの比率は、ノードプールの作成時に指定したパーセンテージ値と同じです。