OpenShiftのGPU設定の方法について

はじめに

こんにちはサイオステクノロジーの小野です。前回はOpenShiftにGPUを追加する方法について解説しました。今回はそのGPUをクラスタ内で利用する設定の方法を解説します。

また、GPUはいくつかの会社が作成していますが、多くのAI開発ライブラリが対応しているNVIDIA製のGPUの設定を行います。

OpenshiftでGPUを利用するためのオペレータ

Node Feature Discovery (NFD) オペレータ

クラスター内のノードのハードウェア機能やカーネル機能を自動的に検出し、それらの機能をラベルとしてノードに追加するオペレータです。これによりノードにGPUがあることを検出できます。NVIDIA GPUオペレータを利用するために必要なオペレータです。

NVIDIA GPU オペレータ

NVIDIA GPUを搭載したサーバーでGPUリソースを管理し、活用できるようにするためのオペレータです。

Intel Device Plugins オペレータ

Intelのハードウェア機能をOpenshiftクラスタに認識させるために使用されるオペレータです。IntelのGPUを利用する際はこのオペレータを使用してください。

AWSにおけるGPU利用設定手順

設定手順概要

これからAWSに構築したOpenshiftでNVIDIAのGPUを利用する方法を解説します。手順は以下の流れで進んでいきます。

  • NFDオペレータの設定
  • NFDオペレータの正常性確認
  • NVIDIA GPU オペレータの設定
  • NVIDIA GPU オペレータの正常性確認
  • GPUモニタリングの設定

提条件

  • OpenShift:4.17
  • 構築する環境:AWS(amd64)
  • リージョン:us-east-2
  • クラスター名:ocp-test
  • AWSにNVIDIAのGPUノードを追加済み

NFDオペレータの設定

NodeFeatureDiscoveryオペレータのインストール

最初にOperator > OperatorHubでNFDと検索します。

OperatorHubでNFDと検索

Node Feature Discovery Operatorが2つ存在するのでRed Hatと書かれている方を選択して、インストールを押します。

NFD Operatorの説明

インストール時の設定は何も変更せず、インストールを押します。

NFDのインストール設定

インストールが完了するまで待ちます。
ステータスがSucceededになったらインストール完了です。

NFDのステータスがSucceededになったらインストール完了

CRの設定 (NodeFeatureDiscovery)

続いてカスタムリソースの設定を行います。インストール済みOperatorの画面からNFDオペレータをクリックします。

NFDオペレータの詳細画面に遷移するので、提供されるAPIからNodeFeatureDiscoveryのインスタンスの作成を押します。

NFDの詳細

NFDの設定は何も変更せず、作成を押します。

NFDのカスタムリソース編集

作成が完了するまで待ちます。

ステータスが「Conditions: Available Upgradeable」となっていれば作成完了です。

カスタムリソースのステータスがConditions: Available Upgradeableなら作成完了

NFDオペレータ正常性確認

NFDオペレータの導入によって、GPUノードにGPUのラベルが付与されていることを確認します。

以下のコマンドを入力します。

$ oc describe node | egrep 'Roles|pci' | grep -v master
Roles:              worker
                    feature.node.kubernetes.io/pci-1d0f.present=true
Roles:              worker
                    feature.node.kubernetes.io/pci-10de.present=true
                    feature.node.kubernetes.io/pci-1d0f.present=true
Roles:              worker
                    feature.node.kubernetes.io/pci-1d0f.present=true
Roles:              worker
                    feature.node.kubernetes.io/pci-1d0f.present=true

NFDオペレータの導入が正常に行われたら、GPUが搭載されたノードに「pci-10de」というラベルが付与されていることが確認できます。

NVIDIA GPU オペレータの設定

NVIDIA GPU オペレータのインストール

次にNVIDIA GPU オペレータのインストールを行います。Operator > OperatorHubでNVIDIAと検索します。

OperatorHubでNVIDIAと検索

NVIDIA GPU Operatorを選択してインストールを押します。

NVIDIA GPU Operatorの説明

インストール時の設定は何も変更せず、インストールを押します。

NVIDIA GPU オペレータのインストール設定

インストールが完了するまで待ちます。
ステータスがSucceededになったらインストール完了です。

NVIDIA GPU オペレータのステータスがSucceededになったらインストール完了

CRの設定 (ClusterPolicy)

続いてカスタムリソースの設定を行います。インストール済みOperatorの画面からNVIDIA GPU オペレータをクリックします。

NVIDIA GPUオペレータの詳細画面に遷移するので、提供されるAPIからClusterPolicyのインスタンスの作成を押します。

NVIDIA GPU オペレータの詳細

ClusterPolicyの設定は何も変更せず、作成を押します。

ClusterPolicyのカスタムリソース編集

作成が完了するまで待ちます。少し時間がかかるので注意してください(10分前後)。

ステータスが「State: ready」となっていれば作成完了です。

カスタムリソースのステータスがState: readyなら作成完了

NVIDIA GPU オペレータの正常性確認

GPUが動作するかの正常性の確認を行います。今回は2種類の正常性確認を行います。

サンプルアプリ実行

GPUを利用してベクトルの加算を行うサンプルアプリを実行します。(参考:https://docs.nvidia.com/datacenter/cloud-native/openshift/latest/install-gpu-ocp.html#running-a-sample-gpu-application

以下のコマンドを実行してpodを作成します。

$ cat << EOF | oc create -f -

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vectoradd
spec:
restartPolicy: OnFailure
containers:
- name: cuda-vectoradd
  image: "nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0-ubi8"
  resources:
    limits:
      nvidia.com/gpu: 1
EOF
pod/cuda-vectoradd created

コンテナのログでサンプルアプリが動作していることを確認します。

$ oc logs cuda-vectoradd
[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

GPUの状態確認

GPUの状態を表示するコマンドを実行します。(参考:https://docs.nvidia.com/datacenter/cloud-native/openshift/latest/install-gpu-ocp.html#getting-information-about-the-gpu

nvidia-gpu-operator プロジェクトに変更します。

$ oc project nvidia-gpu-operator
Now using project "nvidia-gpu-operator" on server "https://api.ocp-test.cpawstest.ps.staging-test.sios.jp:6443".

pod名を取得します。

$ oc get pod -owide -lopenshift.driver-toolkit=true
NAME                                                  READY   STATUS    RESTARTS   AGE   IP           NODE                                        NOMINATED NODE   READINESS GATES
nvidia-driver-daemonset-417.94.202410090854-0-n7xjw   2/2     Running   0          28m   10.130.2.9   ip-10-0-18-161.us-east-2.compute.internal   <none>           <none>

取得したpod内でnvidia-smiコマンドを実行します。GPUのメモリ使用量、使用率、温度が確認できます。

$ oc exec -it nvidia-driver-daemonset-417.94.202410090854-0-n7xjw -- nvidia-smi
Mon Oct 28 08:36:36 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.90.07              Driver Version: 550.90.07      CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| 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 T4                       On  |   00000000:00:1E.0 Off |                    0 |
| N/A   26C    P8             14W /   70W |       1MiB /  15360MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

GPU のモニタリング設定

GPUの管理に必要なモニタリングの設定方法について説明します(参考:https://docs.nvidia.com/datacenter/cloud-native/openshift/latest/enable-gpu-monitoring-dashboard.html)。

GitHub の DCGM エクスポーター リポジトリから最新の NVIDIA DCGM エクスポーター ダッシュボードをダウンロードします。

$ curl -LfO https://github.com/NVIDIA/dcgm-exporter/raw/main/grafana/dcgm-exporter-dashboard.json
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 18114  100 18114    0     0  19498      0 --:--:-- --:--:-- --:--:-- 19498

namespaceにダウンロードしたファイルからconfigmapを作成します。

$ oc create configmap nvidia-dcgm-exporter-dashboard -n openshift-config-managed --from-file=dcgm-exporter-dashboard.json
configmap/nvidia-dcgm-exporter-dashboard created

configmapにラベルをつけて、管理者のコンソールでGPUのダッシュボードを確認できるようにします。

$ oc label configmap nvidia-dcgm-exporter-dashboard -n openshift-config-managed "console.openshift.io/dashboard=true"
configmap/nvidia-dcgm-exporter-dashboard labeled

同様に開発者のコンソールでGPUのダッシュボードを確認できるようにします。

$ oc label configmap nvidia-dcgm-exporter-dashboard -n openshift-config-managed "console.openshift.io/odc-dashboard=true"
configmap/nvidia-dcgm-exporter-dashboard labeled

作成されたリソースを表示し、ラベルがつけられていることを確認します。

$ oc -n openshift-config-managed get cm nvidia-dcgm-exporter-dashboard --show-labels
NAME                             DATA   AGE   LABELS
nvidia-dcgm-exporter-dashboard   1      90s   console.openshift.io/dashboard=true,console.openshift.io/odc-dashboard=true

コンソール画面のモニタリング > ダッシュボードに移動し、ダッシュボードのリストから「NVIDIA DCGM Exporter Dashboard」を選択します。

GPUの各種情報をコンソール画面でモニタリングできるようになりました。

GPUのモニタリング画面

最後に

NFDオペレータとNVIDIAオペレータを導入することで、OpenShiftでGPUを取り扱えるようになりました。

これでようやくOpenShift AIを導入するための準備が完了しました。次回はいよいよOpenShift AIを導入する方法について解説したいと思います。

次回:OpenShift AIを導入してみた

参考

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です