こんにちは、もーすけです。
本日はOpenShiftにNVIDIA GPUのノードを追加して利用する方法2つのブログ(概要編と導入編)に分けて紹介したいと思います。
あまりまだ日本語での情報がないので、挑戦したいと考えている人の参考になればと思います。
また、非常に進化が速く、情報が古くなる可能性もあります。なるべく更新していきたいと思っていますが、最新情報は公式情報をみてください。。
導入編では、OpenShiftを取り扱いますが、他のKubernetesディストリビューションをお使いの方も参考になるところはあると思います。
NVIDIA GPU Operator
Kubernetes上でGPUを利用するには、次の3つを最低限準備する必要があります。 Workerノードは当然ですよね。NVIDIAのGPUを利用するためのDriver、そしてKubernetesからNVIDIA GPUをリソースとして制御できるようにするためのDevice Pluginがさらに必要です。
- GPU搭載のWorkerノード
- NVIDIA Driver
- 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-master と nfd-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ではこのラベルが指定されています。
次に向けて
さて、次は導入編です。
この基礎的な知識をもとにGPUを使える状態にしてみましょう。