コンテンツに移動
Containers & Kubernetes

NVIDIA Data Center GPU Manager(DCGM)を使用した GKE 上の GPU ワークロードのモニタリング

2023年1月12日
Google Cloud Japan Team

※この投稿は米国時間 2022 年 12 月 3 日に、Google Cloud blog に投稿されたものの抄訳です。

人工知能(AI)と機械学習(ML)はますます重要なエンタープライズ機能となっており、そのユースケースは商品のレコメンデーション、自律走行車、アプリケーションのパーソナライズ、自動化された会話型プラットフォームなど多岐にわたります。ML モデルのビルドとデプロイには、高性能なインフラストラクチャが必要です。NVIDIA GPU を使用すると、トレーニングと推論のシステムを大幅に高速化することができます。これに伴い、GPU パフォーマンス指標をモニタリングしてワークロードの動作を把握することは、ML 開発プロセスの最適化にとって非常に重要です。

多くの組織が、Google Kubernetes Engine(GKE)を使用して NVIDIA GPU を管理し、本番環境用 AI の推論とトレーニングを大規模に実行しています。NVIDIA Data Center GPU Manager(DCGM)は、クラスタおよびデータセンター環境内における NVIDIA GPU の管理、モニタリングを行うために NVIDIA が提供しているツールセットです。DCGM には、GPU 使用率、メモリ指標、相互接続のトラフィックに関する詳細を収集するための API が組み込まれています。また、ML エンジニアがボトルネックを特定してパフォーマンスを最適化するため、あるいは、管理者が活用されていないリソースを特定してコストを削減するために必要な、システム プロファイリング指標も提供しています。

このブログ投稿では、次のことを説明します。

  • GKE クラスタに NVIDIA DCGM を設定する方法

  • Cloud Monitoring ダッシュボードまたは Grafana のいずれかと Prometheus を使用して GPU 使用率を確認する方法

NVIDIA Data Center GPU Manager

NVIDIA DCGM を使用すると、構成の設定、ヘルスチェックの実行、詳細な GPU 使用率の指標のモニタリングをはじめとする GPU 管理を簡素化できます。詳しくは、NVIDIA の DCGM ユーザーガイドをご覧ください。

ここでは、GKE クラスタにおける GPU 使用率の指標の収集とモニタリングに焦点を当てます。そのために、NVIDIA DCGM exporter も使用します。このコンポーネントは、NVIDIA DCGM を使用して GPU 指標を収集し、それらを Prometheus スタイルの指標としてエクスポートします。

GPU モニタリング アーキテクチャ

次の図は、NVIDIA DCGM、NVIDIA DCGM exporter、および Google Cloud の Prometheus 向けマネージド サービスである Google Managed Prometheus を使用した GPU モニタリング設定のアーキテクチャの概要を示しています。

https://storage.googleapis.com/gweb-cloudblog-publish/images/1_DCGM.max-1400x1400.jpg

上の図で「NVIDIA A100 GPU」とあるボックスは、Google Compute Engine(GCE)の VM インスタンスに接続された NVIDIA GPU を表しています。コンポーネント間の依存関係が、各ボックスをつなぐ線で表されています。 

「AI/ML Workload」は、1 つ以上の GPU が割り当てられた Pod を表します。「NVIDIA DCGM」と「DCGM exporter」のボックスは、GKE クラスタ全体で特権付き daemonset として実行中の Pod です。ConfigMap には、収集する DCGM フィールド(特に GPU 指標)のリストが含まれます。

「Managed Prometheus」ボックスは、GKE クラスタにデプロイされたマネージド Prometheus コンポーネントを表します。このコンポーネントは、「DCGM exporter」エンドポイントから Prometheus スタイルの指標をスクレイピングするように構成されています。「Managed Prometheus」は、それぞれの指標を「prometheus.googleapis.com/DCGM_NAME/gauge」として Cloud Monitoring にエクスポートします。この指標には、Metric Explorer ページをはじめとする、さまざまな Cloud Monitoring API からアクセスできます。

また、より高い柔軟性を提供するために、クラスタ内の Grafana ダッシュボードを設定できるコンポーネントも組み込まれています。これは、データソースとしての「Prometheus UI」フロントエンドを通じて、利用可能な GPU 指標にアクセスする「Grafana」Pod で構成されています。Grafana ページには、「Inverse Proxy」エージェントを通じて、Google がホストするエンドポイントからアクセスできるようになります。 

すべての GPU モニタリング コンポーネントは、Namespace である「gpu-monitoring-system」にデプロイされます。

要件

  • Google Cloud プロジェクト

  • NVIDIA GPU の割り当て(詳細は、GPU 割り当てをご覧ください)

  • GKE バージョン 1.21.4-gke.300 とマネージド Prometheus をインストールするための「ベータ版」コンポーネント

  • 利用可能なすべてのクラウド GPU タイプをサポートする GKE バージョン 1.18.6-gke.3504 以降

  • NVIDIA Datacenter GPU Manager で必要な NVIDIA ドライバ R450+

NVIDIA GPU を搭載したクラスタをデプロイする

1. GKE Standard ノードプールで GPU を実行するの手順に沿って、NVIDIA GPU を搭載した GKE クラスタを作成します。 

ここでは、それぞれ 2 つの NVIDIA A100 GPU を搭載した 2 つの A2 VM を含むクラスタをデプロイする例を示しています。リージョンごとの利用可能な GPU プラットフォームのリストについては、GPU のリージョンとゾーンを参照してください。
読み込んでいます...

「--enable-managed-prometheus」フラグの存在に注目してください。これにより、次の手順をスキップできます。デフォルトでは、クラスタは各 VM 上に Container-Optimized OS をデプロイします。

2. このクラスタ上でマネージド Prometheus を有効にします。これにより、GPU 指標を収集して Cloud Monitoring にエクスポートできます。これは Grafana のデータソースとしても使用されます。
読み込んでいます...

3. kubectl を使用して GKE クラスタを操作する前に、クラスタの認証情報を取得する必要があります。

読み込んでいます...

4. GPU を操作する前に、NVIDIA ドライバをインストールする必要があります。以下では、Contained-Optimized OS を実行している VM 用の NVIDIA ドライバをインストールしています。

読み込んでいます...

すべてのノードで「nvidia-gpu-device-plugin」が実行されるのを待ちます。この処理には数分かかる場合があります。

読み込んでいます...

GPU モニタリング システム マニフェストをダウンロードする

このガイドで後ほど使用する Kubernetes マニフェスト ファイルとダッシュボードをダウンロードします。

読み込んでいます...

GPU モニタリング システムを構成する

NVIDIA Data Center GPU Manager と関連アセットをデプロイする前に、クラスタから出力する GPU 指標を選択する必要があります。また、それらの GPU 指標をサンプリングする期間も設定します。この手順は省略可能です。デフォルトの設定のままにしておくこともできます。

1. quickstart/dcgm_quickstart.yml の ConfigMap セクションを表示、編集して、どの GPU 指標を出力するかを選択します。
読み込んでいます...

利用可能な NVIDIA DCGM フィールドの一覧は、NVIDIA DCGM のフィールド ID リストにあります。ここでは、デフォルト構成で設定された GPU 指標の概要を説明していますので参考にしてください。

最も重要なのは、GPU 利用率(「DCGM_FI_DEV_GPU_UTIL」)です。この指標は、GPU がアイドル状態でない時間の割合を示します。次に GPU 使用メモリ(「DCGM_FI_DEV_FB_USED」)です。これはワークロードごとに割り当てられた GPU メモリのバイト数を示しています。これにより GPU メモリにどれだけの空き容量が残っているかを確認できます。AI ワークロードの場合、この指標を使用して、より大きなモデルを実行できるか、またはバッチサイズを増やせるかを判断できます。

GPU SM 利用率(「DCGM_FI_PROF_SM_ACTIVE」)では、ワークロード実行中に使用されている GPU SM プロセッサの割合を確認できます。この割合が低いと、GPU に並列ワークロードを送信するための空き容量があることを示します。AI ワークロードでは、複数の推論リクエストを送信することができるといえます。SM 占有率(「DCGM_FI_PROF_SM_OCCUPANCY」)と合わせて、GPU が効率的かつ最大限に使用されているかどうかを確認できます。 

GPU Tensor アクティビティ(「DCGM_FI_PROF_PIPE_TENSOR_ACTIVE」)は、ワークロードが GPU 上の Tensor コアを活用しているかどうかを示しています。Tensor コアは、SM プロセッサ内の専用の IP ブロックで、行列乗算を高速化します。これは、ワークロードが高密度の行列演算にどの程度バインドされているかを示します。

FP64、FP32、FP16 のアクティビティ(例: 「DCGM_FI_PROF_PIPE_FP64_ACTIVE」)は、ワークロードが、特定の精度をターゲットにしている GPU エンジンをどの程度使用しているかを示します。科学的なアプリケーションでは FP64 計算に偏り、ML / AI ワークロードでは FP16 計算に偏る可能性があります。 

GPU NVLink アクティビティ(例: 「DCGM_FI_PROF_NVLINK_TX_BYTES」)は、高帯域幅の NVLink 接続を通して、ある GPU から別の GPU に直接送信されるトラフィックの帯域幅(バイト/秒)を示しています。これは、ワークロードが GPU の通信を必要とするかどうかを示します。通信を必要とする場合は、ワークロードが集団通信に費やしている時間の割合を示します。

GPU PCIe アクティビティ(例: 「DCGM_FI_PROF_PCIE_TX_BYTES」)は、ホストシステムとの間で送受信されるトラフィックの帯域幅(バイト/秒)を示しています。 

DCGM フィールド識別子に「_PROF_」を持つすべてのフィールドは、「プロファイリング指標」です。各指標の意味に関する詳しい技術的な説明については、NVIDIA DCGM Profiling Metrics をご覧ください。H100 以前の NVIDIA ハードウェアについては、いくつかの制限があります。特に注意が必要なのは、NVIDIA Nsight のようなプロファイリング ツールと同時に使用できないという点です。こうした制限について詳しくは、DCGM Features, Profiling Sampling Rate をご覧ください。

2. (オプション)デフォルトでは、スクレイピング間隔を 20 秒に構成しています。NVIDIA DCGM exporter が NVIDIA DCGM をスクレイピングする間隔と、GKE マネージド Prometheus が NVIDIA DCGM exporter をスクレイピングする間隔は、ご自身で調整できます。

読み込んでいます...

サンプル期間を短く選択すると(例: 1 秒)、GPU アクティビティとワークロード パターンが詳しく表示されます。ただし、より高いサンプルレートを選択すると、より多くのデータが Cloud Monitoring に送信されます。そのため、Cloud Monitoring の料金が高くなる可能性があります。料金を見積もるには、Cloud Monitoring の料金ページで「Google Cloud Managed Service for Prometheus の指標」をご覧ください。

3. (オプション)この例では、NVIDIA DCGM 2.3.5 を使用しています。NVIDIA DCGM バージョンを調整するには、NVIDIA コンテナ レジストリから異なるイメージを選択します。NVIDIA DCGM exporter のバージョンと NVIDIA DCGM のバージョンには互換性が必要です。そのため、別のバージョンを選択する際は、必ず両方を変更してください。

読み込んでいます...

ここでは、NVIDIA DCGM と NVIDIA DCGM exporter を別々のコンテナとしてデプロイしています。NVIDIA DCGM exporter が、そのコンテナ内で NVIDIA DCGM 処理を起動して実行することも可能です。DCGM exporter で利用可能なオプションの説明については、DCGM-Exporter のページをご覧ください。

GPU モニタリング システムをデプロイする

1. NVIDIA DCGM、NVIDIA DCGM exporter、マネージド Prometheus の構成をデプロイします。

読み込んでいます...

正常にデプロイできた場合、すべての GPU ノードで実行されている特権付き NVIDIA DCGM と NVIDIA DCGM exporter Pod が表示されます。

Cloud Monitoring ダッシュボードを設定する

1. マネージド Prometheus に出力される DCGM 指標を表示するには、カスタム ダッシュボードをインポートします。

読み込んでいます...

2. Cloud コンソールの Monitoring ダッシュボード ページに移動し、新しく追加された「Example GKE GPU」ダッシュボードを表示します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/2_DCGM.max-600x600.jpg

3. 各パネルでは、凡例を展開して以下のフィールドを含めることができます。

凡例では、以下のフィールドが利用できます。

「cluster」(GKE クラスタ名)

「instance」(GKE ノード名)

「gpu」(GKE ノードの GPU インデックス)

「modelName」(NVIDIA T4、V100、A100 など)

「exported container」(GPU をマッピングしたコンテナ)

「exported namespace」(GPU をマッピングしたコンテナの Namespace)

マネージド Prometheus は NVIDIA DCGM exporter を通じて GPU ワークロードをモニタリングするため、コンテナ名と Namespace が「exported container」および「exported namespace」というラベルにあることに留意してください。

モニタリングに関する GPU のストレステストを行う

実行中の GPU の指標を確認できるように、人工的な負荷を提供しています。また、独自の GPU ワークロードをデプロイすることもできます。

1. NVIDIA GPU 指標に人工的負荷テスターを適用します。

読み込んでいます...

この負荷テストでは、単一の GPU 上にコンテナを作成します。次に、表示されているすべての指標の負荷テストを順次繰り返していきます。NVLink 帯域幅は、VM に NVLink 接続によって接続された 2 つの NVIDIA GPU がある場合にのみ使用されます。

Grafana ダッシュボードを設定する

1. Prometheus UI フロントエンド、Grafana、逆プロキシの構成をデプロイします。

読み込んでいます...

<YOUR PROJECT ID> は、クラスタのプロジェクト ID に置き換えてください。

逆プロキシ構成マップに Grafana のエンドポイントが入力されるまで待ちます。

読み込んでいます...

Grafana のページにアクセスするには、上記の URL をコピーしてブラウザに貼り付けます。同じ GCP プロジェクトへのアクセス権を持つユーザーのみ、Grafana ページへのアクセスが許可されます。 

GKE クラスタにデプロイされた逆プロキシ エージェントは、sukha/inverse-proxy-for-grafana でホストされている Docker Hub イメージを使用します。詳細については、Building the Inverse Proxy Agent をご覧ください。

2. Grafana のページで [Add your first data source] をクリックし、[Prometheus] を選択します。次に、以下の Prometheus 構成を入力します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/3_DCGM.max-1300x1300.jpg

完全な URL は以下のとおりです。

”http://prometheus-ui.gpu-monitoring-system.svc:9090”

下部にある [Save and test] を選択します。[Data source is working] と表示されます。

3. Grafana ページの左側にある [+ Create] ウィジェット パネルから [Import] を選択し、Grafana ダッシュボードをインポートします。

次に、ローカルの JSON ファイル「grafana/gke-dcgm-grafana-dashboard.json」を選択します。

先ほどデプロイしたテスト用のワークロードの GPU 使用率と他のすべての指標が表示されます。ダッシュボードは、コンテナラベルが空の文字列ではない指標のみを表示するように構成されています。そのため、コンテナが接続されていないアイドル状態の GPU の指標は表示されません。

https://storage.googleapis.com/gweb-cloudblog-publish/images/4_DCGM.max-600x600.jpg

4. 「Explorer」ページで、利用可能な指標を直接検索することもできます。左側のパネルで [Explorer] ウィジェットを選択します。次に [Metrics Browser] をクリックすると、利用可能な指標とそのラベルのリストが表示されます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/5_DCGM.max-800x800.jpg

Metrics Explorer ページを使用して、利用可能な指標を検索できます。検索を活用することで、ケースに合ったクエリに基づいてカスタム ダッシュボードを構築できます。

まとめ

このブログを通して、NVIDIA GPU を搭載した GKE クラスタをデプロイし、ワークロードごとの GPU 使用率の指標を Cloud Monitoring に出力できるようになりました。また、Cloud Monitoring ダッシュボードを設定して、ワークロードごとの GPU 利用率を表示することもできました。

この GPU モニタリング システムは、NVIDIA Data Center GPU Manager を活用しています。利用可能なすべての NVIDIA DCGM 指標にアクセスしてモニタリングできます。また、利用可能な GPU 指標と、アプリケーション ワークロードにおけるその意味についても説明しました。

最後に、対応する Google Cloud プロジェクトへのアクセス権を持つユーザー向けに、Google がホストするエンドポイントからアクセス可能な Grafana GPU 使用率ダッシュボードをクラスタ内にデプロイする方法を紹介しました。

- AI アクセラレータ エクスペリエンス担当シニア ソフトウェア エンジニア Suffian Khan

- Google Kubernetes Engine シニア ソフトウェア エンジニア Tao He
投稿先