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はCPUとメモリメトリクスに基づく水平ポッド自動スケーリングを有効にします。 より高い要件がある場合は、Prometheusアダプタを使用してPrometheusによって収集されたGPUメトリックをサポートし、カスタムメトリックAPIを使用してカスタムメトリックを定義できます。 これにより、GPU使用率と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インスタンスの名前をクリックして、インスタンスの詳細ページに移動します。
設定ページで、設定タブをクリックし、HTTP API URLセクションにある内部エンドポイントをコピーします。
B。 Prometheus URLの設定
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
[マーケットプレイス] ページで、[アプリカタログ] タブをクリックします。 ack-alibaba-cloud-metrics-adapterを見つけてクリックします。
ack-alibaba-cloud-metrics-adapterページで、デプロイをクリックします。
基本情報ウィザードページで、クラスターと名前空間を選択し、次へをクリックします。
パラメータウィザードページで、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% を超えたときに自動スケーリングをトリガーする方法について説明します。 次の表に、Horizontal Pod Autoscaler (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. EOF
1.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使用率の変更を表示します。