Kubernetes は、Managed Service for Prometheus と統合して GPU メトリックを収集する Custom Metrics メカニズムを提供します。このトピックでは、Managed Service for Prometheus をデプロイする方法と、Managed Service for Prometheus を使用して GPU メトリックをモニターし、コンテナーのオートスケーリングを実装する方法の例について説明します。
前提条件
ご利用のクラスターに GPU ノードを追加したか、専用 GPU クラスターを作成している必要があります。
概要
ディープラーニングのモデルトレーニングや推論などのハイパフォーマンスコンピューティング (HPC) シナリオでは、計算を高速化するために GPU がよく使用されます。コストを節約するには、GPU 使用率や GPU メモリなどの GPU メトリックに基づいてオートスケーリングを使用します。
デフォルトでは、Kubernetes は CPU とメモリを Horizontal Pod Autoscaler (HPA) のオートスケーリングのメトリックとして使用します。GPU メトリックに基づくオートスケーリングなどのより複雑なシナリオでは、Prometheus Adapter を使用して Prometheus が収集した GPU メトリックを適応させます。次に、Custom Metrics API を使用して HPA メトリックを拡張します。このワークフローにより、GPU 使用率や GPU メモリなどのメトリックに基づいてオートスケーリングを実装できます。次の図は、GPU オートスケーリングの仕組みを示しています。
ステップ 1: Managed Service for Prometheus と Metrics Adapter のデプロイ
- 説明
クラスター作成時に Prometheus をインストールするように選択した場合、再度インストールする必要はありません。
ack-alibaba-cloud-metrics-adapter をインストールして構成します。
1. HTTP API アドレスの取得
またはARMS コンソールにログインします。
-
左側のナビゲーションウィンドウで、 を選択します。
ページ上部で、ご利用の Container Service for Kubernetes (ACK) クラスターが配置されているリージョンを選択します。次に、対象インスタンスの名前をクリックします。
[設定]ページで、[設定]タブをクリックします。[HTTP API URL(Grafana 読み取りアドレス)]セクションで、イントラネットアドレスをコピーします。
2. Prometheus URL の構成
ACK コンソールにログインします。ACK コンソール。左側のナビゲーションウィンドウで、 を選択します。
「アプリマーケットプレイス」ページで、「アプリカタログ」タブをクリックします。検索して、[ack-alibaba-cloud-metrics-adapter] をクリックします。
[ack-alibaba-cloud-metrics-adapter] ページで、[デプロイ] をクリックします。
「基本情報」ウィザードで、クラスターと名前空間を選択し、「次へ」をクリックします。
[パラメーター]ウィザードで、[チャートバージョン]を選択します。[パラメーター]セクションで、取得した HTTP API アドレスを Prometheus の
urlパラメーターの値として設定します。次に、[OK]をクリックします。
ステップ 2: GPU メトリックのアダプタールール構成
1. GPU メトリックのクエリ
GPU メトリックをクエリできます。詳細については、「モニタリングメトリックの説明」をご参照ください。
2. アダプタールールの構成
ACK コンソールにログインします。ACK コンソール。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを探してその名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
Helm リリースの [操作] 列で、ack-alibaba-cloud-metrics-adapter の [更新] をクリックします。次の
rulesをcustomフィールドに追加します。ルールを追加すると、構成は次の図のように表示されます。

次のコマンドを実行します。出力に
DCGM_FI_DEV_GPU_UTIL、DCGM_CUSTOM_PROCESS_SM_UTIL、DCGM_FI_DEV_FB_USED、DCGM_CUSTOM_PROCESS_MEM_USEDなど、HPA が認識できるメトリックが含まれている場合、構成は完了です。この例ではDCGM_CUSTOM_PROCESS_SM_UTILを使用します。実際の出力は異なる場合があります。
ステップ 3: GPU メトリックに基づくオートスケーリングの実装
この例では、GPU 上にモデル推論サービスをデプロイします。次に、サービスに対してストレステストを実行し、GPU 使用率に基づくオートスケーリングをテストします。
1. 推論サービスのデプロイ
次のコマンドを実行して、推論サービスをデプロイします。
Pod とサービスのステータスを確認します。
次のコマンドを実行して、Pod ステータスを確認します。
kubectl get pods -o wide期待される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES bert-intent-detection-7b486f6bf-f**** 1/1 Running 0 3m24s 10.15.1.17 cn-beijing.192.168.94.107 <none> <none>期待される出力は、GPU ノード 192.168.94.107 に 1 つの Pod のみがデプロイされていることを示しています。
次のコマンドを実行して、サービスステータスを確認します。
kubectl get svc bert-intent-detection-svc期待される出力:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE bert-intent-detection-svc LoadBalancer 172.16.186.159 47.95.XX.XX 80:30118/TCP 5m1s期待される出力のサービス名は、サービスがデプロイされていることを示しています。
Secure Shell (SSH) を使用して GPU ノード 192.168.94.107 にログインします。次に、次のコマンドを実行して GPU 使用量を確認します。
nvidia-smi期待される出力:
Wed Feb 16 11:48:07 2022 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 450.102.04 Driver Version: 450.102.04 CUDA Version: 11.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... On | 00000000:00:07.0 Off | 0 | | N/A 32C P0 55W / 300W | 15345MiB / 16160MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 2305118 C python 15343MiB | +-----------------------------------------------------------------------------+期待される出力は、推論サービスプロセスが GPU で実行されていることを示しています。リクエストが送信されていないため、現在の GPU 使用率は 0 です。
次のコマンドを実行して推論サービスを呼び出し、デプロイメントを検証します。
curl -v "http://47.95.XX.XX/predict?query=Music"期待される出力:
* Trying 47.95.XX.XX... * TCP_NODELAY set * Connected to 47.95.XX.XX (47.95.XX.XX) port 80 (#0) > GET /predict?query=Music HTTP/1.1 > Host: 47.95.XX.XX > User-Agent: curl/7.64.1 > Accept: */* > * HTTP 1.0, assume close after body < HTTP/1.0 200 OK < Content-Type: text/html; charset=utf-8 < Content-Length: 9 < Server: Werkzeug/1.0.1 Python/3.6.9 < Date: Wed, 16 Feb 2022 03:52:11 GMT < * Closing connection 0 PlayMusic # 意図認識結果HTTP リクエストはステータスコード 200 と意図認識結果を返します。これは、推論サービスがデプロイされていることを示しています。
2. HPA の構成
この例では GPU 使用率を使用します。Pod の GPU 使用率が 20% を超えると、スケールアウトがトリガーされます。HPA は次のメトリックをサポートしています。
メトリック | 説明 | 単位 |
DCGM_FI_DEV_GPU_UTIL |
| % |
DCGM_FI_DEV_FB_USED |
| MiB |
DCGM_CUSTOM_PROCESS_SM_UTIL | コンテナーの GPU 使用率。 | % |
DCGM_CUSTOM_PROCESS_MEM_USED | コンテナーの GPU メモリ使用量。 | MiB |
DCGM_CUSTOM_PROCESS_GPU_MEM_USED_RATIO | コンテナーの GPU メモリ使用率。
| % |
次のコマンドを実行して HPA をデプロイします。
v1.23 以降
cat <<EOF | kubectl create -f - apiVersion: autoscaling/v2 # HPA 構成には autoscaling/v2 バージョンを使用します。 kind: HorizontalPodAutoscaler metadata: name: gpu-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: bert-intent-detection minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metric: name: DCGM_CUSTOM_PROCESS_SM_UTIL target: type: Utilization averageValue: 20 # コンテナーの GPU 使用率が 20% を超えると、スケールアウトがトリガーされます。 EOFv1.23 より前
cat <<EOF | kubectl create -f - apiVersion: autoscaling/v2beta1 # HPA 構成には autoscaling/v2beta1 バージョンを使用します。 kind: HorizontalPodAutoscaler metadata: name: gpu-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: bert-intent-detection minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metricName: DCGM_CUSTOM_PROCESS_SM_UTIL # Pod の GPU 使用率。 targetAverageValue: 20 # コンテナーの GPU 使用率が 20% を超えると、スケールアウトがトリガーされます。 EOF次のコマンドを実行して HPA ステータスを確認します。
kubectl get hpa期待される出力:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE gpu-hpa Deployment/bert-intent-detection 0/20 1 10 1 74s期待される出力は、
TARGETSが0/20であることを示しています。これは、現在の GPU 使用率が 0 であることを示しています。GPU 使用率が 20% を超えると、スケールアウトがトリガーされます。
3. 推論サービスのオートスケーリングのテスト
スケールアウト
次のコマンドを実行してストレステストを実行します。
hey -n 10000 -c 200 "http://47.95.XX.XX/predict?query=music"説明HPA スケールアウトの必要なレプリカ数を計算する式は次のとおりです。
必要なレプリカ数 = ceil[現在のレプリカ数 × (現在のメトリック / 必要なメトリック)]。たとえば、現在のレプリカ数が 1、現在のメトリックが 23、必要なメトリックが 20 の場合、式は必要なレプリカ数を 2 と計算します。ストレステスト中に、HPA と Pod のステータスをモニターします。
次のコマンドを実行して HPA ステータスを確認します。
kubectl get hpa期待される出力:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE gpu-hpa Deployment/bert-intent-detection 23/20 1 10 2 7m56s出力は、
TARGETSの値が23/20であることを示しています。この値は、現在の GPU 使用率が 20% を超えており、オートスケーリングをトリガーし、クラスターをスケールアウトさせることを示しています。次のコマンドを実行して Pod ステータスを確認します。
kubectl get pods期待される出力:
NAME READY STATUS RESTARTS AGE bert-intent-detection-7b486f6bf-f**** 1/1 Running 0 44m bert-intent-detection-7b486f6bf-m**** 1/1 Running 0 14s期待される出力は、2 つの Pod があることを示しています。式は Pod の総数が 2 であると計算します。これは実際の出力と一致します。
HPA と Pod の期待される出力は、Pod が正常にスケールアウトされたことを示しています。
スケールイン
ストレステストが停止すると、GPU 使用率が 20% を下回ります。その後、システムはスケールインを開始します。
次のコマンドを実行して HPA ステータスを確認します。
kubectl get hpa期待される出力:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE gpu-hpa Deployment/bert-intent-detection 0/20 1 10 1 15m期待される出力は、
TARGETSが0/20であることを示しています。これは、現在の GPU 使用率が 0 であることを示しています。約 5 分後、システムはスケールインを開始します。次のコマンドを実行して Pod ステータスを確認します。
kubectl get pods期待される出力:
NAME READY STATUS RESTARTS AGE bert-intent-detection-7b486f6bf-f**** 1/1 Running 0 52m期待される出力は、Pod 数が 1 であることを示しています。これは、スケールインが成功したことを示しています。
よくある質問
GPU カードが使用されているかどうかを確認するにはどうすればよいですか?
GPU カードが使用中かどうかは、[GPU モニタリング] タブで GPU カード使用率の変動を観察することで判断できます。使用率が上昇した場合、GPU カードは使用中です。使用率に変化がない場合、カードは使用されていません。これを行うには、次の手順を実行します:
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[Prometheus モニタリング] ページで、[GPU モニタリング] タブをクリックします。GPU カード使用率の変動を観察します。