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

Rootless Podmanの運用

CDIスペックを書く

TT Labで続きを見る

目標

CDI(Container Device Interface)のスペックを自分で作成し、文法と配置を検証して、podman run --deviceの引数の形式を正確に書きます。

なぜ重要なのか

CDIは、「このデバイスをコンテナに入れるには、どんなデバイスノード・ライブラリ・環境変数が必要か」を記述する、ベンダー中立の標準です。以前のランタイムフック方式よりも透明で、移植性が高く、podman・containerd・CRI-Oのすべてがサポートしています。実務では、nvidia-ctk cdi generateが自動的に作成してくれますが、ドライバーの更新後にGPUが認識されない事故の原因は、ほとんどがスペックの再生成漏れなので、その内容を読めるようになっておく必要があります。

この環境には、実際のGPUがありません。そのため、スペックの文法・構造・配置と、--device引数の形式を採点します。現場でミスが出る場所が、まさにそこです。

ステップ

  1. /etc/cdiディレクトリを作成してください。そして、/root/cdi作業ディレクトリも作成してください。
  2. /etc/cdi/nvidia.yamlを作成してください。最上位にcdiVersion: "0.6.0"とkind: nvidia.com/gpuがある必要があり、devices配列にname: "0"の項目が1つある必要があります。その項目のcontainerEdits.deviceNodesには、/dev/nvidia0、/dev/nvidiactl、/dev/nvidia-uvmの3つのパスが入る必要があります。
  3. そのファイルをYAMLとしてパースして、最上位のキーの一覧を/root/cdi/parsed.txtに保存してください。cdiVersion、kind、devicesの3つのキーがすべて見える必要があります。
  4. devices配列に、name: "all"の2つ目の項目を追加してください。その項目のdeviceNodesにも、最低2つのパスがある必要があります。
  5. name: "0"の項目のcontainerEditsに、mountsを追加してください。hostPathとcontainerPathが両方とも/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.550.90.07で、optionsにはro、nosuid、nodev、bindの4つの値が入る必要があります。
  6. name: "0"の項目のcontainerEditsに、hooksを追加してください。hookNameはcreateContainer、pathは/usr/bin/nvidia-ctk、argsは["nvidia-ctk", "hook", "update-ldcache"]です。
  7. /root/cdi/run.shを作成してください。podman runでnvidia.com/gpu=allデバイスをリクエストするコマンドが入っている必要があります。--device引数の値の形式が、正確である必要があります。
  8. /root/cdi/report.txtを、次の5行で作成してください。値は、作成したスペックをパースして得る必要があります。 CDI_VERSION=0.6.0 / KIND=nvidia.com/gpu / DEVICES=<devices 배열 길이> / NODES_DEV0=<name 이 "0" 인 장치의 deviceNodes 개수> / SPEC_PATH=/etc/cdi/nvidia.yaml(プレースホルダーは、順に、devices配列の長さ、nameが"0"のデバイスのdeviceNodesの数です)

参考

CDIディレクトリを準備する

/etc/cdiディレクトリを作成してください。そして、/root/cdi作業ディレクトリも作成してください。

標準のパスは2か所です。永続的なスペックが置かれるほうを使ってください。

最小限のスペックを作成する

/etc/cdi/nvidia.yamlを作成してください。最上位にcdiVersion: "0.6.0"とkind: nvidia.com/gpuがある必要があり、devices配列にname: "0"の項目が1つある必要があります。その項目のcontainerEdits.deviceNodesには、/dev/nvidia0、/dev/nvidiactl、/dev/nvidia-uvmの3つのパスが入る必要があります。

最上位に、2つのキーとdevices配列が必要です。kindは、ドメイン形式のベンダーとクラスを、スラッシュでつなぎます。

YAMLの文法を検証する

そのファイルをYAMLとしてパースして、最上位のキーの一覧を/root/cdi/parsed.txtに保存してください。cdiVersion、kind、devicesの3つのキーがすべて見える必要があります。

python3のyamlモジュールで読んでみれば、文法エラーがすぐに表面化します。パース結果を要約して保存してください。

2つ目のデバイスを追加する

devices配列に、name: "all"の2つ目の項目を追加してください。その項目のdeviceNodesにも、最低2つのパスがある必要があります。

allは、慣例的にすべてのデバイスを意味する名前です。devices配列に、項目をもう1つ入れてください。

ライブラリのマウントを追加する

name: "0"の項目のcontainerEditsに、mountsを追加してください。hostPathとcontainerPathが両方とも/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.550.90.07で、optionsにはro、nosuid、nodev、bindの4つの値が入る必要があります。

mountsの項目は、hostPath、containerPath、optionsの3つのキーを持ちます。optionsは、文字列の配列です。

フックを追加する

name: "0"の項目のcontainerEditsに、hooksを追加してください。hookNameはcreateContainer、pathは/usr/bin/nvidia-ctk、argsは["nvidia-ctk", "hook", "update-ldcache"]です。

hooksの項目には、hookName、path、argsが入ります。コンテナ作成時点のフック名を書いてください。

実行コマンドを作成する

/root/cdi/run.shを作成してください。podman runでnvidia.com/gpu=allデバイスをリクエストするコマンドが入っている必要があります。--device引数の値の形式が、正確である必要があります。

--deviceの値は、kindとデバイス名を等号でつないだ形式です。スクリプトとして残してください。

スペックの検証レポートを作成する

/root/cdi/report.txtを、次の5行で作成してください。値は、作成したスペックをパースして得る必要があります。 CDI_VERSION=0.6.0 / KIND=nvidia.com/gpu / DEVICES=<devices 배열 길이> / NODES_DEV0=<name 이 "0" 인 장치의 deviceNodes 개수> / SPEC_PATH=/etc/cdi/nvidia.yaml(プレースホルダーは、順に、devices配列の長さ、nameが"0"のデバイスのdeviceNodesの数です)

値は、実際に作成したスペックをパースして得る必要があります。個数は、配列の長さです。