モデルのトレーニング後、モデルは通常、推論サービスとしてデプロイされます。推論サービスへの呼び出し数は、ビジネス要件に基づいて動的に変化します。さまざまな負荷を処理し、コストを削減するには、弾性スケーリングが必要です。従来のデプロイソリューションでは、大規模で同時実行性の高いシステムの弾力性要件を満たすことができません。Container Service for Kubernetes (ACK) を使用すると、弾性ノードプールにワークロードをデプロイして、推論サービスの弾性スケーリングを有効にすることができます。このトピックでは、Elastic Compute Service (ECS) インスタンスで推論ワークロードを実行する方法について説明します。
前提条件
モデルがトレーニングされています。このトピックでは、TensorFlow 1.15 でトレーニングされた BERT モデルを使用します。
ack-alibaba-cloud-metrics-adapter コンポーネントがインストールされています。詳細については、「コンポーネントの管理」をご参照ください。
AI ダッシュボードがインストールされています。詳細については、「クラウドネイティブ AI スイートのデプロイ」をご参照ください。
手順
弾性ノードプールを作成します。
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
[ノードプール] ページの右上隅にある [ノードプールの作成] をクリックします。
[ノードプールの作成] ダイアログボックスで、パラメーターを設定し、[注文の確認] をクリックします。次の表に、主要なパラメーターを示します。その他のパラメーターの詳細については、「ノードプールを作成および管理する」をご参照ください。
パラメーター
説明
Auto Scaling
[自動] を選択し、[最小インスタンス数] と [最大インスタンス数] を構成します。
課金方法
[プリエンプティブインスタンス] を選択します。
ノードラベル
[キー] を
inferenceに、[値] を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 // 値は 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 でサポートされているカスタムパラメーター」をご参照ください。
次のコマンドを実行して、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パラメーター
説明
selectorselectorパラメーターは、ラベルに基づいて TensorFlow トレーニングジョブのポッドを選択するために使用されます。この例では、値はinference: tensorflowに設定されています。limits: nvidia.com/gpuサービスで使用できる GPU の最大数。
requests: nvidia.com/gpuサービスに必要な GPU の最小数。
model-nameモデルの名前。
model-pathモデルのパス。
Horizontal Pod Autoscaler (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" // Ingress ルート targetAverageValue: 10パラメーター
説明
scaleTargetRefHPA がバインドされているオブジェクト。この例では、値は推論サービスのデプロイメントの名前に設定されています。
minReplicas複製ポッドの最小数。
maxReplicas複製ポッドの最大数。
sls.projectクラスターで使用される Simple Log Service プロジェクトの名前。パラメーターの値は
k8s-log-{cluster id}の形式である必要があります。sls.logstoreSimple Log Service Logstore の名前。デフォルト値は
nginx-ingressです。sls.ingress.routeサービスを公開するために使用される Ingress。この例では、値は
{namespace}-{service name}-{service port}に設定されています。metricnameメトリック名。この例では、値は
sls_ingress_qpsに設定されています。targetaverageValueスケールアウトアクティビティをトリガーするクエリ/秒 (QPS) 値。この例では、このパラメーターの値は
10に設定されています。QPS 値が 10 を超えると、スケールアウトアクティビティがトリガーされます。次のコマンドを実行して、HPA をデプロイします。
kubectl apply -f hpa.yaml
インターネット向け Ingress を構成します。
デフォルトでは、
arena serve tensorflowコマンドを実行してデプロイされた推論サービスは、インターネット経由でアクセスできない ClusterIP サービスを使用します。そのため、推論サービスのインターネット向け Ingress を作成する必要があります。ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。左側のウィンドウで、 を選択します。
[Ingress] ページの上部で、[名前空間] ドロップダウンリストから推論サービスが存在する名前空間を選択し、[Ingress の作成] をクリックします。次の表に示すパラメーターを設定します。パラメーターの詳細については、「NGINX Ingress を作成する」をご参照ください。
[名前]: この例では、値は
bert-tfservingに設定されています。[ルール]:
[ドメイン名]:
test.example.comなどのカスタムドメイン名を入力します。[マッピング]
[パス]: この例では、ルートパス
/が使用されています。[ルール]: この例では、デフォルトルール (ImplementationSpecific) が使用されています。
[サービス名]:
kubectl get serviceコマンドによって返されるサービス名を入力します。[ポート]: この例では、このパラメーターを [8501] に設定します。
Ingress を作成した後、[Ingress] ページに移動し、Ingress を見つけます。[ルール] 列の値には、Ingress のエンドポイントが含まれています。

取得した Ingress アドレスを使用して、推論サービスのストレステストを実行します。
AI ダッシュボードにログインします。詳細については、「AI ダッシュボードにアクセスする」をご参照ください。
重要AI ダッシュボードにログインする前に、クラウドネイティブ AI スイートをインストールし、アクセス方法を指定する必要があります。詳細については、「クラウドネイティブ AI スイートのデプロイ」をご参照ください。
AI ダッシュボードの左側のナビゲーションウィンドウで、 を選択します。[推論ジョブ] タブをクリックして、推論サービスの詳細を表示します。
次の図は、スケールアウトアクティビティで作成されたすべてのポッドが ECS インスタンスで実行されていることを示しています。従量課金 ECS インスタンスとプリエンプティブ ECS インスタンスの両方がプロビジョニングされます。従量課金 ECS インスタンスの比率は、ノードプールの作成時に指定したパーセント値と同じです。
