Kubernetes カスタムメトリクスと Managed Service for Prometheus を使用して GPU メトリクスを収集し、HPA でコンテナを自動スケーリングします。Managed Service for Prometheus と HPA を使用してコンテナを自動スケーリングします。
前提条件
仕組み
GPU は、ディープラーニングモデルのトレーニングや推論などのシナリオで計算を高速化します。使用率やメモリなどの GPU メトリクスに基づくオートスケーリングは、コストの最適化に役立ちます。
Kubernetes の Horizontal Pod Autoscaler (HPA) は、デフォルトで CPU とメモリのメトリクスを使用します。GPU メトリクスの場合、Prometheus アダプターが Managed Service for Prometheus からデータを取得し、カスタムメトリクス API を通じて公開します。その後、HPA は GPU の使用率、メモリ使用量、その他の指標に基づいてワークロードをスケーリングします。次の図は、そのプロセスを示しています。
ステップ 1:Prometheus とメトリクス アダプターのデプロイ
-
クラスターで Prometheus モニタリングを有効化します。
説明クラスター作成時に Prometheus をインストールした場合、この手順はスキップしてください。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
左側のナビゲーションウィンドウで、.
-
ack-alibaba-cloud-metrics-adapter をインストールして設定します。
1. HTTP API URL の取得
-
ARMS コンソールにログインします。
-
Container Service for Kubernetes (ACK) クラスターのリージョンを選択します。対象のインスタンスをクリックします。
-
設定 ページの 設定 タブで、HTTP API アドレス (Grafana 読み取りアドレス) から内部ネットワークアドレスをコピーします。
2. Prometheus URL の設定
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
-
Marketplace ページで アプリカタログ タブをクリックし、[ack-alibaba-cloud-metrics-adapter] を検索してクリックします。
-
ack-alibaba-cloud-metrics-adapter ページで、デプロイ をクリックします。
-
基本情報 ウィザードで、クラスターと名前空間を選択します。次へ をクリックします。
-
パラメーター ウィザードで、Chart バージョン を選択します。値 セクションで、
urlパラメーターにコピーした HTTP API URL を設定します。OK をクリックします。
-
ステップ 2:アダプタールールの設定
1. GPU メトリクスのクエリ
利用可能な GPU メトリクスについては、「モニタリングメトリクスの説明」をご参照ください。
2. アダプタールールの設定
-
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
-
Helm の一覧で ack-alibaba-cloud-metrics-adapter を見つけます。操作 列で 更新 をクリックします。次の
rulesをcustomフィールドに追加します。ルールを追加した後の完全な設定:
Chart Url https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/ack-alibaba-cloud-metrics-adapter-1.3.2.tgz adapter: rules: custom: - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>) name: as: ${1}_bytes_per_second matches: ^(.*)_bytes resources: overrides: namespace: resource: namespace pod: resource: pod seriesQuery: container_memory_working_set_bytes{namespace!="",pod!=""} - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>) name: as: ${1}_core_per_second matches: ^(.*)_seconds_total resources: overrides: namespace: resource: namespace pod: resource: pod seriesQuery: container_cpu_usage_seconds_total{namespace!="",pod!=""} - metricsQuery: avg(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>) resources: overrides: NodeName: resource: node seriesQuery: DCGM_FI_DEV_GPU_UTIL{} # GPU使用率。 - metricsQuery: avg(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>) resources: overrides: NamespaceName: resource: namespace NodeName: resource: node PodName: resource: pod seriesQuery: DCGM_CUSTOM_PROCESS_SM_UTIL{} # コンテナのGPU使用率。 - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>) resources: overrides: NodeName: resource: node seriesQuery: DCGM_FI_DEV_FB_USED{} # GPUメモリ使用量。 - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>) resources: overrides: NamespaceName: resource: namespace NodeName: resource: node PodName: resource: pod seriesQuery: DCGM_CUSTOM_PROCESS_MEM_USED{} # コンテナのGPUメモリ使用量。 - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>})by(<<.GroupBy>>) / sum(DCGM_CUSTOM_CONTAINER_MEM_ALLOCATED{})by(<<.GroupBy>>) name: as: ${1}_GPU_MEM_USED_RATIO matches: ^(.*)_MEM_USED resources: overrides: NamespaceName: resource: namespace PodName: resource: pod seriesQuery: DCGM_CUSTOM_PROCESS_MEM_USED{NamespaceName!="",PodName!=""} # コンテナのGPUメモリ使用率。 default: false enabled: true logLevel: 5設定を検証します。出力には、
DCGM_FI_DEV_GPU_UTIL、DCGM_CUSTOM_PROCESS_SM_UTIL、DCGM_FI_DEV_FB_USED、DCGM_CUSTOM_PROCESS_MEM_USEDなどのメトリクスが含まれている必要があります。次の例ではDCGM_CUSTOM_PROCESS_SM_UTILをハイライトしていますが、実際の出力は異なる場合があります。
ステップ 3:オートスケーリングの実装
GPU 推論サービスをデプロイし、負荷テストを実行して、GPU ベースのスケーリング動作を観察することで、オートスケーリングをテストします。
1. 推論サービスのデプロイ
-
推論サービスをデプロイします。
-
Pod と Service のステータスを確認します。
-
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>1 つの Pod が GPU ノード 192.168.94.107 にデプロイされています。
-
Service のステータスを確認します。
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出力にはサービス名が表示され、Service が正常にデプロイされたことを確認できます。
-
-
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 # 意図認識の結果。意図認識の結果とともに 200 ステータスコードが返され、デプロイが成功したことを確認できます。
2. HPA の設定
この例では、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 をデプロイします。
クラスターバージョン ≥ 1.23
cat <<EOF | kubectl create -f - apiVersion: autoscaling/v2 # autoscaling/v2 HPA設定を使用します。 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: AverageValue averageValue: 20 # コンテナのGPU使用率が20%を超えるとスケールアウトをトリガーします。 EOFクラスターバージョン < 1.23
cat <<EOF | kubectl create -f - apiVersion: autoscaling/v2beta1 # autoscaling/v2beta1 HPA設定を使用します。 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 74sTARGETSに0/20と表示されており、現在の GPU 使用率が 0 であることを意味します。使用率が 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 7m56sTARGETSに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 14s2 つの Pod が実行されており、ターゲットの 2 と一致しています。
スケールアウトが確認されました。
-
スケールインのテスト
負荷テストが停止すると、GPU 使用率が 20% を下回り、スケールインが開始されます。
-
HPA のステータスを確認します。
kubectl get hpa期待される出力:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE gpu-hpa Deployment/bert-intent-detection 0/20 1 10 1 15mTARGETSに0/20と表示されており、GPU 使用率が 0 であることを意味します。約 5 分後にスケールインが開始されます。 -
Pod のステータスを確認します。
kubectl get pods期待される出力:
NAME READY STATUS RESTARTS AGE bert-intent-detection-7b486f6bf-f**** 1/1 Running 0 52m1 つの Pod が残っており、スケールインが確認されました。
よくある質問
GPU 使用状況の確認方法
GPU 監視 タブで、GPU 使用率の傾向を監視します。使用率の増加はカードがアクティブであることを示し、横ばいの傾向はアイドル状態であることを意味します。傾向を表示するには、次の手順を実行します:
-
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
-
Prometheus 監視 ページで、GPU 監視 タブをクリックします。