TT Lab
はじめる
学ぶ 学習パス コース

閉域網へのGPUドライバ搬入と導入

containerdにnvidiaランタイムを登録する

TT Labで続きを見る

目標

containerdにnvidiaランタイムを登録して、TOMLの文法を検証し、CDIスペックとRuntimeClassを作成します。実際のGPUがなくても、設定の正確さは、すべて検証できます。

なぜ重要なのか

「ドライバーはインストールしたし、nvidia-smiも動くのに、コンテナではGPUが見えない」という報告の原因は、たいていランタイム登録の漏れです。そして、インターネットから拾ってきたスニペットを貼り付けたのに、何の効果もなければ、たいていはconfig versionの不一致です。セクションヘッダーが、containerdのメジャーバージョンによって、丸ごと変わります。

もう1つ、重要な判断があります。default_runtime_nameをnvidiaに変えないことです。変えると、GPUを使わないPodまで、そのランタイムを経由することになり、ランタイムの問題が、クラスター全体に広がります。RuntimeClassで、必要なワークロードだけを指定するのが、安全です。

ステップ

  1. /etc/containerdディレクトリを作成して、/opt/fixtures/gpu-airgap/containerd/config.toml.baseを、/etc/containerd/config.tomlにコピーしてください。そして、/root/toolkit作業ディレクトリも作成してください。
  2. config.tomlに、nvidiaランタイムのセクションを追加してください。セクションヘッダーは[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]で、runtime_type = "io.containerd.runc.v2"が入っている必要があります。
  3. その下位に、オプションのセクションを追加してください。[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]の下に、BinaryName = "/usr/bin/nvidia-container-runtime"とSystemdCgroup = trueがある必要があります。
  4. default_runtime_nameの値を確認して、/root/toolkit/default.txtに、次の2行で書いてください。 DEFAULT=runc / WHY=runtimeclass (デフォルトのランタイムは、runcである必要があります。変えないでください。)
  5. config.tomlをTOMLパーサーで読んで、versionの値と、登録されたランタイム名の一覧を、/root/toolkit/parsed.txtに保存してください。runcとnvidiaが、両方見える必要があります。
  6. /etc/cdi/nvidia.yamlが存在して、kind: nvidia.com/gpuを含むかを確認してください。なければ作成してください。そして、最上位のキーの一覧を、/root/toolkit/cdi-keys.txtに保存してください。
  7. /root/toolkit/runtimeclass.yamlを作成してください。apiVersion: node.k8s.io/v1、kind: RuntimeClass、metadata.name: nvidia、handler: nvidiaの4つがある必要があります。
  8. /root/toolkit/report.txtを、次の5行で作成してください。 CONFIG_VERSION=2 / RUNTIME=nvidia / RUNTIME_TYPE=io.containerd.runc.v2 / SYSTEMD_CGROUP=true / HANDLER=nvidia

参考

基本設定ファイルを配置する

/etc/containerdディレクトリを作成して、/opt/fixtures/gpu-airgap/containerd/config.toml.baseを、/etc/containerd/config.tomlにコピーしてください。そして、/root/toolkit作業ディレクトリも作成してください。

フィクスチャに、省略された基本設定があります。実際の環境では、containerd config defaultで作成します。

nvidiaランタイムのセクションを追加する

config.tomlに、nvidiaランタイムのセクションを追加してください。セクションヘッダーは[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]で、runtime_type = "io.containerd.runc.v2"が入っている必要があります。

config version 2のCRIプラグインのパスの下の、runtimes.<名前>の形です。runtime_typeの値が核心です。

ランタイムのオプションを指定する

その下位に、オプションのセクションを追加してください。[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]の下に、BinaryName = "/usr/bin/nvidia-container-runtime"とSystemdCgroup = trueがある必要があります。

optionsは、ランタイムセクションの下位テーブルです。バイナリのパスと、cgroupドライバーの2つのキーが必要です。

デフォルトのランタイムを確認する

default_runtime_nameの値を確認して、/root/toolkit/default.txtに、次の2行で書いてください。 DEFAULT=runc / WHY=runtimeclass (デフォルトのランタイムは、runcである必要があります。変えないでください。)

default_runtime_nameは、runcである必要があります。なぜそうなのかも、一緒に記録してください。

TOMLの文法を検証する

config.tomlをTOMLパーサーで読んで、versionの値と、登録されたランタイム名の一覧を、/root/toolkit/parsed.txtに保存してください。runcとnvidiaが、両方見える必要があります。

python3.11以上には、標準ライブラリにTOMLパーサーがあります。パースに成功すれば、文法は正常です。

CDIスペックを配置する

/etc/cdi/nvidia.yamlが存在して、kind: nvidia.com/gpuを含むかを確認してください。なければ作成してください。そして、最上位のキーの一覧を、/root/toolkit/cdi-keys.txtに保存してください。

前のコースで作成したものと、同じ構造です。ここでは、配置パスと、最小限のキーだけを確認します。

RuntimeClassを作成する

/root/toolkit/runtimeclass.yamlを作成してください。apiVersion: node.k8s.io/v1、kind: RuntimeClass、metadata.name: nvidia、handler: nvidiaの4つがある必要があります。

apiVersionとkind、metadata.name、handlerの4つが必要です。handlerは、config.tomlのランタイム名と、同じである必要があります。

登録の検証レポート

/root/toolkit/report.txtを、次の5行で作成してください。 CONFIG_VERSION=2 / RUNTIME=nvidia / RUNTIME_TYPE=io.containerd.runc.v2 / SYSTEMD_CGROUP=true / HANDLER=nvidia

値は、作成したファイルをパースして得る必要があります。パスは、絶対パスで書いてください。