5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Proxmox 8.x】LXC コンテナに NVIDIA GPU をパススルーする方法

Posted at

はじめに

最近 AI が面白すぎるので自宅で AI を動かせる環境作りたいなと思い、買ってきた GPU を自宅サーバーに組み込んでみました。
自宅サーバーは Proxmox が入っているため、VM か コンテナにパススルーする必要があります。
VM (仮想マシン) へのパススルー (PCIe Passthrough) は何回かやったことがあったので、今回は LXC (コンテナ) にパススルーしてみました。

コンテナへのパススルーは VM と違いホストとカーネルを共有するため、少しセットアップに手間が必要でした。
そのためこの記事では、ホスト側へのドライバーインストールから、コンテナ側での認識まで、一連の流れをメモのような形で紹介します。

目次

  1. ホスト側の準備
    1-1. NVIDIA ドライバーのインストール
    1-2. NVIDIA Container Toolkit の設定
    1-3. デバイスファイルの確認
  2. LXC コンテナの設定 (Device Passthrough)
    2-1. コンテナの作成
    2-2. パススルー設定 (GUI / CLI)
  3. コンテナ内の設定
    3-1. CUDA Toolkit のインストール
    3-2. ドライバーのインストール (重要!)
  4. 動作確認
  5. おわり

環境

  • OS: Proxmox VE 8.4.14
  • GPU: NVIDIA GeForce RTX 5060Ti 16GB
  • Container: Ubuntu 24.04 LTS (LXC, Unprivileged)

1. ホスト側の準備

LXC コンテナはホストのカーネルを共有するため、ホスト側にも NVIDIA ドライバーが必要になる。
(VM へのパススルーの場合はホスト側でドライバーを当ててはいけないが、LXC の場合は逆です)

1.1 NVIDIA ドライバーのインストール

まずはホスト (Proxmox VE) にドライバーをインストールする。
apt で入れる方法もあるが、最新版を確実に入れるために NVIDIA 公式の .run ファイルを使用するのがおすすめ。

Official Drivers | NVIDIA から Linux 64-bit 用のドライバーを探して URL をコピーしておく。

# Proxmoxホストにssh接続
ssh root@<ホストのIPアドレス>

# 1. 既存のドライバーがある場合は削除
apt remove --purge nvidia-*
apt autoremove

# 2. 必要なビルドツールを入れる
apt update
apt install build-essential pve-headers-$(uname -r)

# 3. ドライバーのダウンロード (例: 580.xx 系)
wget https://download.nvidia.com/XFree86/Linux-x86_64/590.44.01/NVIDIA-Linux-x86_64-590.44.01.run
chmod +x NVIDIA-Linux-x86_64-590.44.01.run

# 4. インストール実行
./NVIDIA-Linux-x86_64-590.44.01.run

インストーラーが起動したら、基本的には YesOK で進めていけば OK。

インストーラーの画面はトグルに入れておく
  • MIT 選択

  • image.png

  • YES 選択

  • image.png

  • NO 選択

  • image.png

  • 完了

  • image.png

このようなエラーが出たらカーネルソースが不足している可能性があるため、以下のコマンドを入力してインストールすると直るかも。

ERROR: Unable to find the kernel source tree for the currently running kernel.  Please make sure you have installed the kernel source files for your kernel and that they are properly configured; on Red Hat Linux systems, for example, be sure you have the 'kernel-source' or 'kernel-devel' RPM installed.  If you know the correct kernel source files are installed, you may specify the kernel source path with the '--kernel-source-path' command line option.
apt update && apt dist-upgrade -y
apt install linux-headers-$(uname -r)

1.2 NVIDIA Container Toolkit の設定

ホスト側でコンテナランタイムを適切に扱うために、Toolkit も入れておく。

# 1. NVIDIAリポジトリの追加
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
  gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# 2. ツールキットのインストール
apt update
apt install nvidia-container-toolkit

# 3. LXC用の設定
cat > /etc/nvidia-container-runtime/config.toml << 'EOF'
[nvidia-container-runtime]
no-cgroups = true
EOF

1.3 デバイスファイルの確認

インストールが完了したら、デバイスファイルが生成されているか確認する。

ls -la /dev/nvidia*

以下のように表示されれば OK。

crw-rw-rw- 1 root root 195,   0 ... /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 ... /dev/nvidiactl
crw-rw-rw- 1 root root 508,   0 ... /dev/nvidia-uvm
...

また、nvidia-smi コマンドを叩いて、GPU が正しく認識されていることも確認しておく。
以下のように表示されていれば OK!

root@pve-server:~# nvidia-smi
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 590.44.01              Driver Version: 590.44.01      CUDA Version: 13.1     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 5060 Ti     Off |   00000000:01:00.0 Off |                  N/A |
| 42%   27C    P0              8W /  180W |       0MiB /  16311MiB |      2%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

2. LXC コンテナの設定 (Device Passthrough)

2.1 コンテナの作成

まずは普通に非特権コンテナ (Unprivileged Container) を作成する。
テンプレートは ubuntu-24.04-standard などを使用。

# コンテナ作成例 (Web UI からやっても OK)
pct create 100 local:vztmpl/ubuntu-24.04-standard_24.04-2_amd64.tar.zst \
  --hostname gpu-container \
  --cores 4 \
  --memory 8192 \
  --rootfs local-lvm:32 \
  --unprivileged 1 \
  --features nesting=1

2.2 パススルー設定 (GUI)

GUI の場合 (推奨)

  1. Proxmox Web UI で対象のコンテナ (100) を選択。
  2. Resources タブをクリック。
  3. Add -> Device Passthrough を選択。
    image.png
  4. パススルーしたいデバイスパスを入力。NVIDIA の場合は基本的に以下を全部追加しておくと安心。
    image.png
    • /dev/nvidia0 (GPU 本体)
    • /dev/nvidiactl (コントローラー)
    • /dev/nvidia-uvm (Unified Memory)
    • /dev/nvidia-uvm-tools
    • /dev/nvidia-caps/* (あれば)
      image.png

Mode は 0666 (全ユーザー読み書き可) にしておくと権限周りのトラブルが減るが、セキュリティ要件に合わせて調整しておく。GID はホスト側のグループと合わせる必要があるが、0666 ならあまり気にしなくても動くことが多い。

設定が終わったらコンテナを起動する。

3. コンテナ内の設定

コンテナ内でもドライバーのセットアップが必要なのでホストとほぼ同じ工程を踏む。

3.1 CUDA Toolkit のインストール

まずは必要なパッケージを入れる。

# コンテナ内で実行
apt update && apt upgrade -y
apt install -y build-essential curl wget git

次に CUDA Toolkit を入れる。NVIDIA 公式から Ubuntu 24.04 用のものを探す。

# CUDA Toolkit のインストール (例)
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb
dpkg -i cuda-keyring_1.1-1_all.deb
apt update
apt install -y cuda-toolkit-13-1  # バージョンは環境に合わせて

パスを通しておく。

echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

3.2 ドライバーのインストール (重要!)

ここが一番重要。
コンテナ内にも ホストと同じバージョン のドライバーをインストールする必要がある。
しかし、カーネルモジュールはホストのものを使うため、コンテナ内では カーネルモジュールをインストールしてはいけない

.run ファイルを使って、--no-kernel-module オプション付きでインストールする。

このようにホストからコンテナにファイルを転送してインストールすることもできる。

root@pve-server:~# pct push 100 NVIDIA-Linux-x86_64-590.44.01.run /root/downloads/NVIDIA-Linux-x86_64-590.44.01.run
# ホストと同じバージョンのインストーラーをダウンロード
wget https://us.download.nvidia.com/XFree86/Linux-x86_64/590.44.01/NVIDIA-Linux-x86_64-590.44.01.run
chmod +x NVIDIA-Linux-x86_64-590.44.01.run

# カーネルモジュールなしでインストール
./NVIDIA-Linux-x86_64-590.44.01.run --no-kernel-module
インストーラーの画面はトグルに入れておく
  • OK

  • image.png

  • OK

  • image.png

  • YES 選択 (どちらでも良い)

  • image.png

  • NO 選択

  • image.png

  • 完了

  • image.png

これで準備完了!

4. 動作確認

コンテナ内で nvidia-smi を実行してみる。

nvidia-smi

以下のように GPU 情報が表示されれば成功!

root@pve-container:~# nvidia-smi
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 590.44.01              Driver Version: 590.44.01      CUDA Version: 13.1     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 5060 Ti     Off |   00000000:01:00.0 Off |                  N/A |
| 42%   26C    P0              7W /  180W |       0MiB /  16311MiB |      3%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

おわり

コンテナにパススルーするためには、ホストとコンテナ両方にドライバーをインストールする必要があり、バージョンも揃えておく必要があります。
なので、少々面倒ですがコンテナであれば複数にまたがってパススルーすることが出来るので、役割を分けて使うことができたりして便利かな?と思いました。

また、リソース効率の良い LXC コンテナで GPU が使えるので、パフォーマンス上がったらいいなーとか思っています!

気になった方は参考にぜひやってみてください!
それでは、良き Proxmox ライフを!

参考

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?