ページの先頭です

ページ内を移動するためのリンク
本文へ (c)

ここから本文です。

GPUプラットフォームにおけるAIモデルの開発と推論 - 推論サーバーのオートスケール

ライター:奈良 昌紀
通信事業者のデータセンターにおいてネットワーク・サーバー運用を経験した後、ネットワンシステムズに入社。帯域制御やWAN高速化製品担当を経て、2008年から仮想化関連製品を担当。現在は主にクラウド、仮想インフラの管理、自動化、ネットワーク仮想化を担当。

目次

はじめに

こちらのBlog記事ではコンテナ環境でGPUを活用するためのNVIDIA AI Enterprise + VMware vSphere® with VMware Tanzu® をご紹介しました。今回は2回の記事に分けて、この環境を利用して自然言語処理モデルであるBERTをチューニングし、開発したAIモデルをTriton Inference ServerによりKubernetes上でコンテナとして実行し、Kubernetesのオートスケール機能によってスケールアウト・スケールインを実現する方法をご紹介します。

Triton Inference Serverのオートスケール設定

KubernetesのHPAでカスタムメトリクスを利用してオートスケールを実現するために、Prometheusを利用します。Tanzu Kubernetes ClusterTanzu Mission Controlに登録すると、Tanzu Packageとしてソフトウェアのインストールが可能になります。今回はこのカタログに含まれるPrometheusをインストールします。

Prometheusをデフォルトの設定でインストールすると、Kubernetesの各種メトリックを格納する構成でPrometheusが構成されますが、今回はDCGM Exporterが出力するNVIDIA GPUのメトリックを格納するよう、Prometheusパッケージのインストール時にprometheus.config.prometheus_ymlを以下の内容で上書きします。尚、Triton Inference Serverもリクエストキュー滞留時間などのメトリックを出力することができ、これらのメトリックを利用してオートスケールすることも可能です。

|
global:
  scrape_interval: 15s
  evaluation_interval: 15s
alerting:
  alertmanagers:
  - static_configs:
    - targets:
rule_files:
scrape_configs: 
  - job_name: gpu-metrics
    scrape_interval: 1s
    metrics_path: /metrics
    scheme: http
    kubernetes_sd_configs:
    - role: endpoints
      namespaces:
        names:
        - gpu-operator
    relabel_configs:
    - source_labels: [__meta_kubernetes_pod_node_name]
      action: replace
      target_label: kubernetes_node

尚、クラスター外部からPrometheusのUIにアクセスするには、prometheus.service.typeとしてLoadBalancerを指定するか、monitoring.ingress.enabledと monitoring.ingress.virtual_host_fqdnを設定してIngressを構成します。

Prometheus Adapterのインストール

Prometheus AdapterはクラスターでDeploymentとして実行され、Prometheusに格納されたメトリクスをKubernetesのカスタムメトリクスAPI(custom.metrics.k8s.io)から参照することを可能にします。KubernetesのHorizontalPodAutoscalerはこのカスタムメトリクスを利用してリソースのスケーリングを行います。Prometheus AdapterはPrometheus Community Kubernetes Helm Chartsで公開されているHelm Chartを利用してインストールします。prometheus.urlには、Prometheus向けのServiceリソースの名前を指定します。Tanzu PackageとしてPrometheusをインストールした場合は「prometheus-server.tanzu-system-monitoring.svc.cluster.local」がデフォルトとなります。

$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm install --name-template prometheus-adapter \
   --set rbac.create=true,prometheus.url=http://prometheus-server.tanzu-system-monitoring.svc.cluster.local,prometheus.port=80 \
   prometheus-community/prometheus-adapter

Prometheus AdapterをインストールするとカスタムメトリクスAPI経由でDCGM Exporterのメトリクスにアクセス可能になります。

$ kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1 | jq  | grep DCGM_FI_DEV_GPU_UTIL
      "name": "namespaces/DCGM_FI_DEV_GPU_UTIL",
      "name": "jobs.batch/DCGM_FI_DEV_GPU_UTIL",
      "name": "pods/DCGM_FI_DEV_GPU_UTIL",

Horizontal Pod Autoscalerの構成

bert-qa Deploymentに対してHPAリソースを定義し、Podがオートスケールするように構成します。DCGM Exporterが出力し、Prometheusに格納されたDCGM_FI_DEV_GPU_UTILメトリックを指標として、40を超える値が続いた場合に最大で4つまでPodを増やす事が可能になります。

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: gpu-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: bert-qa
  minReplicas: 1
  maxReplicas: 4
  metrics:
  - type: Pods
    pods:
      metricName: DCGM_FI_DEV_GPU_UTIL
      targetAverageValue: 40

作成されたHPAリソースを確認すると現在のメトリックの状態と、Podの状態が表示されます。

$ kubectl get hpa
NAME      REFERENCE            TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
gpu-hpa   Deployment/bert-qa   0/40      1         4         1          4s

Triton Inference Serverのオートスケールの確認

以下のマニフェストによりクライアント用のPodを作成し、perf_clientスクリプトによりTriton Inference Serverに対して負荷をかけます。接続先はTriton ServerのClusterIPのgRPCポートを指定します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: perf-client
  labels:
    app: perf-client
spec:
  replicas: 1
  selector:
    matchLabels:
      app: perf-client
  template:
    metadata:
      labels:
        app: perf-client
    spec:
      imagePullSecrets:
        - name: nvaie-demo-default-image-pull-secret
      containers:
        - name: serving
          image: 10.44.187.8/nvaie-demo/tritonserver-2-0:22.02-nvaie-2.0-py3-sdk
          command: ["/bin/sh"]
          args: [ "-c", "/workspace/install/bin/perf_client -v --max-threads 10 -m bert -x 1 -p 200000 --input-data zero --concurrency-range 50 -i gRPC -u bert-qa:8001""]

perf-clientがPodとして追加されます。

$ kubectl get pod
NAME                           READY   STATUS    RESTARTS   AGE
bert-qa-74dbc5fcbc-7zsh9       1/1     Running   0          111s
perf-client-78cb995ddf-6clx4   1/1     Running   0          7s

HPAの状態を確認すると、TARGETSが40を超え、REPLICASが3に変化したことが確認できます。

$ kubectl get hpa
NAME      REFERENCE            TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
gpu-hpa   Deployment/bert-qa   0/40      1         4         1          91s
$ kubectl get hpa
NAME      REFERENCE            TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
gpu-hpa   Deployment/bert-qa   82/40     1         4         1          119s
$ kubectl get hpa
NAME      REFERENCE            TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
gpu-hpa   Deployment/bert-qa   41/40     1         4         3          2m

Podの状態を確認すると新たに2つのbert-qaが追加され合計3Pod実行されていことが確認できます。

$ kubectl get pod
NAME                           READY   STATUS    RESTARTS   AGE
bert-qa-74dbc5fcbc-7zsh9       1/1     Running   0          3m39s
bert-qa-74dbc5fcbc-hphjb       1/1     Running   0          53s
bert-qa-74dbc5fcbc-nvbgr       1/1     Running   0          53s
perf-client-78cb995ddf-6clx4   1/1     Running   0          115s

HPAを確認すると、DCGM_FI_DEV_GPU_UTILがTarget値を超えたため、Podがスケールアウトしたことを確認できます。

$ kubectl describe hpa gpu-hpa
Name:                              gpu-hpa
Namespace:                         triton-server
Labels:                            
Annotations:                       
CreationTimestamp:                 Fri, 24 Jun 2022 21:16:17 +0900
Reference:                         Deployment/bert-qa
Metrics:                           ( current / target )
  "DCGM_FI_DEV_GPU_UTIL" on pods:  27 / 40
Min replicas:                      1
Max replicas:                      4
Deployment pods:                   3 current / 3 desired
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    recommended size matches current size
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from pods metric DCGM_FI_DEV_GPU_UTIL
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:
  Type    Reason             Age   From                       Message
  ----    ------             ----  ----                       -------
  Normal  SuccessfulRescale  102s  horizontal-pod-autoscaler  New size: 3; reason: pods metric DCGM_FI_DEV_GPU_UTIL above target

perf-client podを停止してしばらくすると、TARGETSが0になり更にしばらく待つとPod数はMINPODSとして指定されている1つまで減少します。

$ kubectl get hpa
NAME      REFERENCE            TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
gpu-hpa   Deployment/bert-qa   0/40      1         4         3          6m48s
$ kubectl get hpa
NAME      REFERENCE            TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
gpu-hpa   Deployment/bert-qa   0/40      1         4         3          11m
$ kubectl get hpa
NAME      REFERENCE            TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
gpu-hpa   Deployment/bert-qa   0/40      1         4         1          11m
$ kubectl get pod
NAME                       READY   STATUS    RESTARTS   AGE
bert-qa-74dbc5fcbc-7zsh9   1/1     Running   0          14m

HPAを確認すると、全てのメトリックがTarget値を下回ったため、Pod数が1つに減らされたことが確認できます。

$ kubectl describe hpa gpu-hpa
Name:                              gpu-hpa
Namespace:                         triton-server
Labels:                            
Annotations:                       
CreationTimestamp:                 Fri, 24 Jun 2022 21:16:17 +0900
Reference:                         Deployment/bert-qa
Metrics:                           ( current / target )
  "DCGM_FI_DEV_GPU_UTIL" on pods:  0 / 40
Min replicas:                      1
Max replicas:                      4
Deployment pods:                   1 current / 1 desired
Conditions:
  Type            Status  Reason            Message
  ----            ------  ------            -------
  AbleToScale     True    ReadyForNewScale  recommended size matches current size
  ScalingActive   True    ValidMetricFound  the HPA was able to successfully calculate a replica count from pods metric DCGM_FI_DEV_GPU_UTIL
  ScalingLimited  True    TooFewReplicas    the desired replica count is less than the minimum replica count
Events:
  Type    Reason             Age   From                       Message
  ----    ------             ----  ----                       -------
  Normal  SuccessfulRescale  10m   horizontal-pod-autoscaler  New size: 3; reason: pods metric DCGM_FI_DEV_GPU_UTIL above target
  Normal  SuccessfulRescale  29s   horizontal-pod-autoscaler  New size: 1; reason: All metrics below target

Tanzu PackageにはPrometheusの他にGrafanaも含まれており今回DCGM Exporterによって出力したメトリックや、Triton Inference Serverのメトリック等をグラフとして可視化することも可能です。

まとめ

2回の記事に渡り、モデル開発と開発したモデルを利用してどのように推論をサービスとして提供するのかをご紹介しました。NVIDIA AI EnterpriseとvSphere with Tanzuの環境であれば、モデルの開発環境や、推論サーバーであるTriton Inference Server、KubernetesのHPAに必要なDCGM Exporter、vSAN File ServiceによるNFSファイル共有、コンテナイメージを格納するHarbor Registry、Tanzu Packageによるアプリケーションのインストール等がサポートされるため、プロダクション向けGPUプラットフォームの実現が可能になります。NVIDIA AI EnterpriseとvSphere with Tanzuの導入に関しては、是非弊社までお問合せください。

※本記事の内容は執筆者個人の見解であり、所属する組織の見解を代表するものではありません。

RECOMMEND