OpenShift on NVIDIA GPU(概要編)

執筆日:

更新日:

こんにちは、もーすけです。
本日はOpenShiftにNVIDIA GPUのノードを追加して利用する方法2つのブログ(概要編と導入編)に分けて紹介したいと思います。 あまりまだ日本語での情報がないので、挑戦したいと考えている人の参考になればと思います。 また、非常に進化が速く、情報が古くなる可能性もあります。なるべく更新していきたいと思っていますが、最新情報は公式情報をみてください。。 導入編では、OpenShiftを取り扱いますが、他のKubernetesディストリビューションをお使いの方も参考になるところはあると思います。

NVIDIA GPU Operator

Kubernetes上でGPUを利用するには、次の3つを最低限準備する必要があります。 Workerノードは当然ですよね。NVIDIAのGPUを利用するためのDriver、そしてKubernetesからNVIDIA GPUをリソースとして制御できるようにするためのDevice Pluginがさらに必要です。

  1. GPU搭載のWorkerノード
  2. NVIDIA Driver
  3. NVIDIA k8s device plugin

NVIDIA DriverとNVIDIA k8s device pluginを個別にインストールしてKubernetes上でGPUを利用することはできます。 しかし、それらの管理やその他の追加コンポーネントもあったりします。自前でやろうと思うとそれなりに大変かと思います。

そこででてくるのが、NVIDIA GPU Operatorです。
このOperatorは、KubernetesでNVIDIAのGPUを動かして運用するのに必要なコンポーネントをセットにして提供してくれるソフトウェアです。 NVIDIA GPU Operatorには、下記のコンポーネントが含まれています。(以下はv1.4.0の例です。詳しくは公式ドキュメントを参照してください。)

Component Version Memo
NVIDIA Driver 450.80.02
NVIDIA Container Toolkit 1.4.0
NVIDIA K8s Device Plugin 0.7.1
NVIDIA DCGM-Exporter 2.1.2 GPUメトリックを出力するPrometheus exporter
Node Feature Discovery 0.6.0 Helmを利用する場合のみインストール可能。詳細は後述
GPU Feature Discovery 0.2.2 v1.3.0からbetaとして追加。GPUの詳細情報をノードのラベルに付与。

NVIDIAのGPUを利用するために必要なコンポーネントのみならず、運用などを見越したツールセットを管理してくれます。 実際にインストールする場合にはこちらを利用したほうが楽ではないかと思います。

Node Feature Discovery

概要

次に、Node Feature Discoveryというソフトウェアについて説明します。なぜこの説明が必要かは後述します。 Node Feature Discovery(以下、nfd)は、Kubernetesクラスタ内のノードのハードウェア情報を調べ、ラベルとしてノードに情報を付与するソフトウェアです。Kubernetes SIGの中で開発がされています。(Github kubernetes-sig/node-feature-discovery

nfdは nfd-masternfd-worker の2つのコンポーネントから構成されます。
nfd-masterは、0.6.0以降のバージョンではdeploymentとして起動します。nfd-workerからの通信をListenして、nfd-workerから通知されたラベル情報をKubernetes APIへ更新する役割をになっています。
nfd-workerは、DaemonSetとして各ノードで起動します。そのノードのハードウェア情報を確認しnfd-masterへと通知します。

nfd-masterは、v0.4.0まではDaemonSetとしてMasterノード上で起動していましたが、v0.6.0でDaemonSetからDeploymentで動作するように変更が加わりました(該当のPull Request)。理由は、マネージドのKubernetesなどではmasterノードにPodの配置ができないからです。

nfdによって付与されるラベル

nfdが実際に動作すると以下のようなハードウェア情報がノードのラベルとして付与されます。 上の役割で説明しましたが、ハードウェア情報を検出しラベルを付与するように通知するのはnfd-workerです。 Masterノードにはラベルは付与されません。

  • CPU
  • IOMMU
  • Kernel
  • Memory
  • Network
  • PCI
  • Storage
  • System
  • USB
  • Custom (rule-based custom features)
  • Local (hooks for user-specific features)

実際にノード情報を確認してみます。feature.node.kubernetes.io/xxxxx がnfdによって付与されたラベルです。

$ oc get node xxxxxxx -o yaml
...
  labels:
    beta.kubernetes.io/arch: amd64
    beta.kubernetes.io/instance-type: m5.2xlarge
    beta.kubernetes.io/os: linux
    failure-domain.beta.kubernetes.io/region: ap-southeast-1
    failure-domain.beta.kubernetes.io/zone: ap-southeast-1b
    feature.node.kubernetes.io/cpu-cpuid.ADX: "true"
    feature.node.kubernetes.io/cpu-cpuid.AESNI: "true"
    feature.node.kubernetes.io/cpu-cpuid.AVX: "true"
    feature.node.kubernetes.io/cpu-cpuid.AVX2: "true"
    feature.node.kubernetes.io/cpu-cpuid.AVX512BW: "true"
    feature.node.kubernetes.io/cpu-cpuid.AVX512CD: "true"
    feature.node.kubernetes.io/cpu-cpuid.AVX512DQ: "true"
    feature.node.kubernetes.io/cpu-cpuid.AVX512F: "true"
    feature.node.kubernetes.io/cpu-cpuid.AVX512VL: "true"
    feature.node.kubernetes.io/cpu-cpuid.FMA3: "true"
    feature.node.kubernetes.io/cpu-cpuid.MPX: "true"
    feature.node.kubernetes.io/cpu-hardware_multithreading: "true"
    feature.node.kubernetes.io/kernel-selinux.enabled: "true"
    feature.node.kubernetes.io/kernel-version.full: 4.18.0-193.14.3.el8_2.x86_64
    feature.node.kubernetes.io/kernel-version.major: "4"
    feature.node.kubernetes.io/kernel-version.minor: "18"
    feature.node.kubernetes.io/kernel-version.revision: "0"
    feature.node.kubernetes.io/pci-1d0f.present: "true"
    feature.node.kubernetes.io/storage-nonrotationaldisk: "true"
    feature.node.kubernetes.io/system-os_release.ID: rhcos
    feature.node.kubernetes.io/system-os_release.VERSION_ID: "4.5"
    feature.node.kubernetes.io/system-os_release.VERSION_ID.major: "4"
    feature.node.kubernetes.io/system-os_release.VERSION_ID.minor: "5"
    kubernetes.io/arch: amd64
    kubernetes.io/hostname: ip-10-0-162-120
    kubernetes.io/os: linux
...

NVIDIA GPU Driverとnfdの関係性

いままでNVIDIA GPU OperatorとNode Feature Discoveryについて説明してきました。 そこで、あらためてこれらがどのような関係性にあるか図示しました。 まず、NVIDIA GPU Operatorに先立ってnfdを展開し、各ノードにハードウェア情報のラベルを付与します。 NVIDIA GPU Operatorが展開するコンポーネントのひとつのNVIDIA Driverは、nfdが付与したラベルからGPUが搭載されているノードだけに展開されるようになっています。それでようやくNVIDIA DriverとGPUノードが対応付けされるわけです。 厳密な実装でいうと、nfdが付与したGPUを搭載するノードのラベル(たとえばfeature.node.kubernetes.io/pci-10de.present: 'true')をNVIDIA GPU Operatorが探し出し、nvidia.com/gpu.present: 'true'のラベルを追加で付与します(該当ソースコード)。nvidia-driverのnodeSelectorではこのラベルが指定されています。

nfd-and-gpu-operator

次に向けて

さて、次は導入編です。
この基礎的な知識をもとにGPUを使える状態にしてみましょう。

記事の内容に関連した相談、仕事依頼したい New

記事の内容やクラウドネイティブ技術に関する相談、仕事依頼を開始しました。
仕事依頼、相談をしてみる

フィードバック

本記事に対して、フィードバックあればこちらのフォームからご記入ください。
記事の内容にフィードバックしてみる

このエントリーをはてなブックマークに追加