Advanced Horizontal Pod Autoscaler (AHPA) コンポーネントは、Prometheus Adapterから取得したGPU使用率データ、過去の負荷傾向、および予測アルゴリズムに基づいて、GPUリソース要求を予測できます。 AHPAは、複製されたポッドの数またはGPUリソースの割り当てを自動的に調整して、GPUリソースが在庫切れになる前にスケールアウト操作が完了するようにすることができます。 また、アイドルリソースが存在するときにスケールイン操作を実行して、コストを削減し、クラスタリソースの使用率を向上させます。
前提条件
GPU高速化ノードを含むACK管理クラスターが作成されます。 詳細については、「GPUアクセラレーションノードでのACKクラスターの作成」をご参照ください。
AHPAがインストールされ、データソースがメトリックを収集するように設定されます。 詳細については、「AHPAの概要」をご参照ください。
PrometheusのManaged Serviceが有効になり、少なくとも7日以内のアプリケーション統計がPrometheusのManaged Serviceによって収集されます。 統計には、アプリケーションによって使用されるGPUリソースの詳細が含まれます。 詳細については、「Prometheusのマネージドサービス」をご参照ください。
仕組み
高性能コンピューティング分野、特に深層学習でのモデルトレーニングやモデル推論など、GPUリソースに強く依存するシナリオでは、GPUリソース割り当てのきめ細かい管理と動的調整により、リソース使用率を効率的に改善し、コストを削減できます。 Container Service for Kubernetes (ACK) は、GPUメトリックに基づく自動スケーリングをサポートしています。 Managed Service for Prometheusを使用して、リアルタイムのGPU使用率やメモリ使用量などの主要なメトリックを収集できます。 次に、Prometheus Adapterを使用して、これらのメトリックをKubernetesが認識できるメトリックに変換し、AHPAと統合できます。 AHPAは、Prometheus Adapterから取得したGPU使用率データ、過去の負荷傾向、および予測アルゴリズムに基づいて、GPUリソース要求を予測できます。 AHPAは、複製されたポッドの数またはGPUリソースの割り当てを自動的に調整して、GPUリソースが在庫切れになる前にスケールアウト操作が完了するようにすることができます。 また、アイドルリソースが存在するときにスケールイン操作を実行して、コストを削減し、クラスタ効率を向上させます。
ステップ1: Metricsアダプタのデプロイ
クラスターで使用されているPrometheusインスタンスの内部HTTP APIエンドポイントを取得します。
ARMSコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
[Prometheusモニタリング] ページの上部で、クラスターがデプロイされているリージョンを選択し、クラスターで使用されているPrometheusインスタンスをクリックします。 インスタンスの詳細ページにリダイレクトされます。
インスタンスの詳細ページの左側のナビゲーションウィンドウで、設定HTTP API Addressセクションに内部エンドポイントを記録します。
ack-alibaba-cloud-metrics-adapterをデプロイします。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
[マーケットプレイス] ページで、[アプリカタログ] タブをクリックします。 ack-alibaba-cloud-metrics-adapterを見つけてクリックします。
右上隅にack-alibaba-cloud-metrics-adapterページでデプロイをクリックします。
基本情報ウィザードページ,クラスターと名前空間をクリックし、次へ.
[パラメーター] ウィザードページで、[チャートバージョン] パラメーターを設定し、手順1で取得した内部HTTP APIエンドポイントを、[パラメーター] セクションの
prometheus.url
パラメーターの値として指定します。 次に、[OK] をクリックします。
ステップ2: AHPAを使用してGPUメトリックに基づいて予測スケーリングを実行する
この例では、推論サービスがデプロイされています。 次に、AHPAがGPUメトリックに基づいて予測スケーリングを実行できるかどうかを確認するためのリクエストが推論サービスに送信されます。
推論サービスをデプロイします。
次のコマンドを実行して、推論サービスをデプロイします。
次のコマンドを実行して、ポッドのステータスを照会します。
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>
次のコマンドを実行して、推論サービスに要求を送信し、サービスがデプロイされているかどうかを確認します。
kubectl get svc bert-intent-detection-svc
コマンドを実行して、推論サービスがデプロイされているGPUアクセラレーションノードのIPアドレスを照会できます。 次に、次のコマンドの47.95.XX.XX
を、取得したIPアドレスに置き換えます。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
され、クエリ結果が返されると、推論サービスがデプロイされます。
AHPAを設定します。
この例では、ポッドのGPU使用率が20% を超えると、AHPAはポッドをスケーリングするように構成されています。
AHPAのメトリクスを収集するようにデータソースを設定します。
application-intelligence.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。
prometheusUrl
パラメーターを、手順1で取得したPrometheusインスタンスの内部エンドポイントに設定します。apiVersion: v1 kind: ConfigMap metadata: name: application-intelligence namespace: kube-system data: prometheusUrl: "http://cn-shanghai-intranet.arms.aliyuncs.com:9090/api/v1/prometheus/da9d7dece901db4c9fc7f5b*******/1581204543170*****/c54417d182c6d430fb062ec364e****/cn-shanghai"
次のコマンドを実行して、アプリケーションインテリジェンスをデプロイします。
kubectl apply -f application-intelligence.yaml
AHPAのデプロイ
fib-gpu.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。
この例では、
観察者
モードが使用される。 AHPAに関連するパラメーターの詳細については、「パラメーター」をご参照ください。次のコマンドを実行してAHPAをデプロイします。
kubectl apply -f fib-gpu.yaml
次のコマンドを実行して、AHPAのステータスを照会します。
kubectl get ahpa
期待される出力:
NAME STRATEGY REFERENCE METRIC TARGET(%) CURRENT(%) DESIREDPODS REPLICAS MINPODS MAXPODS AGE fib-gpu observer bert-intent-detection gpu 20 0 0 1 10 50 6d19h
出力では、
0
はCURRENT(%)
列で返され、20
はTARGET(%)
列で返されます。 これは、現在のGPU使用率が0% であり、GPU使用率が20% を超えるとポッドのスケーリングがトリガーされることを示します。
推論サービスで自動スケーリングをテストします。
次のコマンドを実行して、推論サービスにアクセスします。
次のコマンドを実行して、AHPAのステータスを照会します。
kubectl get ahpa
期待される出力:
NAME STRATEGY REFERENCE METRIC TARGET(%) CURRENT(%) DESIREDPODS REPLICAS MINPODS MAXPODS AGE fib-gpu observer bert-intent-detection gpu 20 189 10 4 10 50 6d19h
出力は、現在のGPU使用率 (
current (%)
) がスケーリングしきい値 (TARGET(%)
) より高いことを示しています。 したがって、ポッドのスケーリングがトリガーされ、予想されるポッド数が10
されます。これは、[DESIREDPODS]
列で返される値です。次のコマンドを実行して、予測結果を照会します。
kubectl get --raw '/apis/metrics.alibabacloud.com/v1beta1/namespaces/default/predictionsobserver/fib-gpu'|jq -r '.content' |base64 -d > observer.html
次の図は、過去7日間の履歴データに基づくGPU使用率の予測結果を示しています。
GPUリソースオブザーバーの予測: 実際のGPU使用率は青い線で表されます。 AHPAによって予測されるGPU利用は、緑色の線によって表される。 予測されたGPU使用率が実際のGPU使用率よりも高いことがわかります。
PODオブザーバーの予測: スケーリングイベントで追加または削除されるポッドの実際の数は、青い線で表されます。 AHPAがスケーリングイベントで追加または削除されると予測するポッドの数は、緑色の線で表されます。 予測されるポッドの数が実際のポッドの数よりも少ないことがわかります。 スケーリングモードを
自動
に設定し、予測されるポッド数に基づいて他の設定を行うことができます。 これにより、AHPAはポッドリソースを節約できます。
結果は、AHPAが予測スケーリングを使用して、変動するワークロードを予想どおりに処理できることを示しています。 予測結果を確認したら、スケーリングモードを
auto
に設定できます。これにより、AHPAはポッドを自動的にスケーリングできます。
関連ドキュメント
Knativeを使用すると、サーバーレスKubernetes (ASK) クラスターでAHPAを使用できます。 アプリケーションが定期的なパターンでリソースを要求する場合、AHPAを使用してリソース要求の変更を予測し、スケーリング活動のためにリソースをプリフェッチできます。 これにより、アプリケーションのスケーリング時のコールドスタートの影響が軽減されます。 詳細については、「KnativeでAHPAを使用した予測スケーリングの有効化」をご参照ください。
一部のシナリオでは、HTTPリクエストのQPSやメッセージキューの長さなど、カスタムメトリックに基づいてアプリケーションをスケーリングする必要がある場合があります。 AHPAは、alibaba-cloud-Metrics-adapterコンポーネントと連携して、カスタムメトリクスに基づいてアプリケーションをスケーリングできる外部メトリクスメカニズムを提供します。 詳細については、「AHPAを使用したアプリケーションスケーリングのカスタムメトリックの設定」をご参照ください。