Kubernetesは、カスタムメトリクスに基づく自動スケーリングをサポートしています。 Kubernetesは、Managed Service for Prometheusと連携して、GPUメトリックに基づく自動スケーリングを実装できます。 このトピックでは、Managed Service for Prometheusをデプロイしてアプリケーションを監視する方法について説明します。 このトピックでは、Managed Service for Prometheusによって収集されたGPUメトリックを表示し、GPUメトリックに基づいてポッドの自動スケーリングを有効にする方法の例も示します。
前提条件
GPUアクセラレーションノードを持つACKクラスターまたはGPUアクセラレーションノードを持つACK専用クラスターが作成されます。
概要
GPUアクセラレーテッドコンピューティングは、深層学習モデルのトレーニングや推論など、高性能コンピューティングシナリオで広く使用されています。 リソースコストを削減するために、GPU使用率やGPUメモリ使用量などのGPUメトリックに基づいてクラスター自動スケーリングを有効にできます。
Kubernetesは、Horizontal Pod Autoscaler (HPA) のデフォルトメトリクスとしてCPUとメモリデータを提供します。 GPUメトリックに基づく自動スケーリングなど、より複雑なシナリオでは、Prometheusアダプターを使用して、Prometheusによって収集されたGPUメトリックを適応させ、カスタムメトリックAPIを使用してHPAのカスタムメトリックを定義できます。 これにより、GPUとメモリ使用量に基づいてエラスティックスケーリングを有効にできます。 次の図は、GPUメトリックに基づく自動スケーリングの仕組みを示しています。
手順1: Prometheusおよびack-alibaba-cloud-metrics-adapterにマネージドサービスをデプロイする
手順1: Prometheusのマネージドサービスの有効化.
説明クラスターを作成するときに、[Enable Managed Service for Prometheus] を選択できます。 これにより、クラスターの作成後にPrometheusのManaged Serviceをインストールする必要がなくなります。
ack-alibaba-cloud-metrics-adapterをインストールして設定します。
A。 HTTP APIエンドポイントの取得
最初にARMSコンソール
を使用します。
左側のナビゲーションウィンドウで、.
上部のナビゲーションバーで、ACKクラスターがデプロイされているリージョンを選択します。 次に、クラスターで使用されているPrometheusインスタンスの名前をクリックして、インスタンスの詳細ページに移動します。
On the設定ページをクリックし、設定タブで、内部エンドポイントをコピーします。HTTP API URLセクションにアクセスします。
B。 Prometheus URLの設定
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
[マーケットプレイス] ページで、[アプリカタログ] タブをクリックします。 ack-alibaba-cloud-metrics-adapterを見つけてクリックします。
On theack-alibaba-cloud-metrics-adapterページをクリックします。デプロイ.
On the基本情報ウィザードページで、クラスターと名前空間を選択し、次へ.
On theパラメータウィザードページで、チャートのバージョンを選択します。Chartバージョンドロップダウンリスト、Prometheusを設定
URLで、パラメータセクションを取得したHTTP APIエンドポイントに移動し、OK.
手順2: ack-alibaba-cloud-metrics-adapterのルールの設定
a. GPUメトリックのクエリQuery GPU metrics
GPUメトリックを照会します。 詳細については、「メトリクスの概要」をご参照ください。
b. ack-alibaba-cloud-metrics-adapterのルールを設定する
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
Helmページで、ack-alibaba-cloud-metrics-adapterの [操作] 列の [更新] をクリックします。
カスタムの下に次のルールを追加します。次の図に例を示します。

次のコマンドを実行します。 出力に
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高速化ノードにモデル推論サービスをデプロイし、そのノードでストレステストを実行して、GPUメトリックに基づいて自動スケーリングを実行できるかどうかを確認する方法を示しています。
a. 推論サービスのデプロイ
次のコマンドを実行して、推論サービスをデプロイします。
ポッドとサービスのステータスを照会します。
次のコマンドを実行して、ポッドのステータスを照会します。
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つのポッドのみがデプロイされていることを示します。
次のコマンドを実行して、サービスのステータスを照会します。
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出力にサービスの名前が表示されている場合、サービスがデプロイされます。
SSHを使用してノード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 # The query result.HTTPステータスコードが200され、クエリ結果が返されると、推論サービスがデプロイされます。
b. HPAの設定
次の例では、ポッドの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をデプロイします。
Kubernetes 1.23以降を実行するクラスター
cat <<EOF | kubectl create -f - apiVersion: autoscaling/v2 # Use the HPA configuration for API version 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 # If the GPU utilization exceeds 20%, pods are scaled out. EOF1.23より前のバージョンのKubernetesを実行するクラスター
cat <<EOF | kubectl create -f - apiVersion: autoscaling/v2beta1 # Use the HPA configuration for API version 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 # The GPU utilization of pods. targetAverageValue: 20 # If the GPU utilization exceeds 20%, pods are scaled out. 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% を超えると、ポッドはスケールアウトされます。
c. 推論サービスでの自動スケーリングのテスト
スケールアウト活動のテスト
次のコマンドを実行してストレステストを実行します。
hey -n 10000 -c 200 "http://47.95.XX.XX/predict?query=music"説明次の式を使用して、オートスケーリング後の予想ポッド数を計算します。
予想ポッド数=ceil [現在のポッド数 × (現在のGPU使用率 /予想されるGPU使用率)]。 たとえば、現在のポッド数が1の場合、現在のGPU使用率は23、予想されるGPU使用率は20、オートスケーリング後の予想されるポッド数は2です。ストレステスト中に、次のコマンドを実行してHPAとポッドのステータスを照会します。
次のコマンドを実行して、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% を超えています。 この場合、自動スケーリングがトリガーされ、ACKクラスターがポッドのスケールアウトを開始します。次のコマンドを実行して、ポッドのステータスを照会します。
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つのポッドが実行されていることを示します。 この値は、前の式に基づいて計算された予想ポッド数と同じです。
HPAとポッドによって返される出力は、ポッドがスケールアウトされたことを示します。
スケールイン活動のテスト
ストレステストが停止し、GPU使用率が20% を下回ると、ACKクラスターはポッド内でスケーリングを開始します。
次のコマンドを実行して、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に低下します。 ACKクラスターは、約5分後にポッド内でスケーリングを開始します。次のコマンドを実行して、ポッドのステータスを照会します。
kubectl get pods期待される出力:
NAME READY STATUS RESTARTS AGE bert-intent-detection-7b486f6bf-f**** 1/1 Running 0 52m出力は、ポッドの数が1であることを示します。 これは、ポッドがスケールインされることを意味します。
よくある質問
GPUが使用されているかどうかを確認するには?
[GPUモニタリング] タブで、GPU使用率に変更があるかどうかを確認できます。 GPU使用率が増加すると、GPUが使用されます。 GPU使用率に変更がない場合、GPUは使用されません。 これを行うには、次の手順を実行します。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[Prometheusモニタリング] ページで、[GPUモニタリング] タブをクリックし、GPU使用率の変更を表示します。