Kubernetes GPU Operator と CUDA の併用について

Posted on
この記事は、最終更新日から 2 年以上経過しています。 情報が古い可能性があります。

Kubernetes で NVIDIA の GPU を使うときのお話です。

この記事は、Kubernetes Advent Calendar 5日目の記事です。

サマリ

イントロ

NVIDIA の GPU を使うときは、 CUDA と呼ばれるソフトウェアを使用することが一般的と思います。

その CUDA は 主に、 Driver と Toolkit で成り立っており、「GPUの型番」、「Driverのバージョン」、「Toolkitのバージョン」の 整合性があっていないと、利用できない代物です。

また、機械学習のライブラリでは、要件となる Toolkit のバージョンが決まっており、決められたバージョン以上の Toolkit を 使用できる環境を準備するのが望ましいです。 たとえば、 PyTorch の最新 v1.10 では CUDA Toolkit 11.3 、 TensorFlow の最新 v2.7.0 では、 CUDA Toolkit 11.2 となっています。

コンテナで NVIDIA GPU を使うには

CUDA はハードウェアにも密接に関連するソフトウェアです。それをコンテナで使用する場合のインストール先のすみ分けは以下のようになります。

そして、コンテナを起動するときに、 Driver などを利用可能にしてくれるのが、 NVIDIA Container Toolkit というソフトウェアです。 (名前が紛らわしいかもしれませんが、CUDA Toolkit とは別物です。)

さらに、Kubernetes で CUDA を使って、マニフェストで、 GPU を resource 指定できるようにするために、 NVIDIA device plugin が必要です。

NVIDIA GPU Operator

ここまでの複雑なセットアップを簡易にしたのが NVIDIA GPU Operator です。

NVIDIA GPU Operator は、 Helm でインストールでき、インストールすると、 ClusterPolicy という Custom Resource が定義されます。 ClusterPolicy をデプロイすると、GPUの利用に必要な以下のコンポーネントが DaemonSet として起動します。

これにより、ノード側のGPUのセットアップは完了し、手動での、Driverのインストール などは不要になります。

あとは、Pod で以下のように、 resource 指定をすれば、 Pod で GPU が使用できます。

resources:
  limits:
    nvidia.com/gpu: 1

なお、GPUは limit でのみ指定されることが想定されています。この制限は、次のことを意味します。

Kubernetes での GPU 利用時の制限

GPU Operator で GPU を使えるようになりますが、以下の制限があります。

このように、Kubernetes では、GPU を必要以上に割り当ててしまう懸念があります。

NVIDIA GPU の Ampere シリーズでは、この課題に対処するため、1つのGPUを複数のGPUに分割する Multi Instance GPU (MIG) という機能があります。 MIG は GPU Operator でも利用することができます。(この記事では、MIGの詳細は割愛いたします)

CUDA の互換性

CUDA Driver は上記の通り、GPU Operator によってセットアップされるため、 Kubernetes Cluster で統一されたバージョンとなります。

そして、CUDA Driver と、コンテナにセットアップする CUDA Toolkit には以下の互換性があります。

基本的に、 CUDA Driver のバージョンが新しいことにデメリットはありませんので、 GPU Operator も最新のバージョンを利用することが良いと思います。

併用可能な CUDA のバージョン

まとめると GPU Operator を使用すると、以下のように、複数バージョンの CUDA Toolkit が、環境変数の変更等なしに 利用できます。

異なる CUDA Toolkit の利用 (コンテナなしの場合)

参考までに、コンテナを使用しない環境で、複数の CUDA Toolkit を利用したい際には、

OS に複数の CUDA Toolkit をインストールし、以下の要領で使用する CUDA Toolkit のバージョンを切り替えることができます。

参照