背景#
最近、AI を実行するためのサーバーを家庭データセンターに構築しようとしています。私は手元に持っているのは 1 台の 3090 しか動かせないデバイスですが、新しいものを買うと高すぎるので、ESXi を使用して直通仮想マシンを選択しました。
仮想マシンの構成は次のとおりです:
- EPYC 7302 * 48
- ESXi-7.0U3 ベース
- NVIDIA GeForce RTX 3090
- 128GB のメモリ
- Debian GNU/Linux 12 (bookworm) x86_64
主な手順#
まず、仮想マシンを構成します。通常の手順に従って、次の設定を行います:
- すべてのメモリをロックする
hypervisor.cpuid.v0=FALSE
を設定するpciPassthru0.msiEnabled=FALSE
を設定する
詳細な手順は省略しますが、後で具体的な手順を補足するかもしれません。(未定)とにかく、これらの操作は多くの場所で見つけることができます。
仮想マシン内で、まず apt ソースを設定し、non-free-firmware
を含めます。 /etc/apt/source.list
にnon-free-firmware
を追加し、次のようになるようにします:
deb https://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
次に、次のコマンドを実行します:
sudo apt update
apt search ^nvidia-driver
正常に動作していれば、次のような結果が表示されるはずです:
nvidia-driver/unknown 545.23.06-1 amd64
NVIDIA metapackage
問題#
通常、物理マシンではsudo apt install nvidia-driver
とするだけでインストールできますが、仮想マシンではうまくいきません。
物理マシンの手順に従ってapt install
を実行するとどうなるか説明します。
まず、慣れているように cuda をインストールします。
sudo apt-get install software-properties-common
wget https://developer.download.nvidia.com/compute/cuda/12.3.0/local_installers/cuda-repo-debian12-12-3-local_12.3.0-545.23.06-1_amd64.deb
sudo dpkg -i cuda-repo-debian12-12-3-local_12.3.0-545.23.06-1_amd64.deb
sudo cp /var/cuda-repo-debian12-12-3-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo add-apt-repository contrib
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-3
次に、
sudo apt install nvidia-driver
再起動し、GPU の状態を確認します。
nvidia-smi
空の結果が表示され、GPU を検出しようとします。
sudo apt install nvidia-detect
nvidia-detect
すると、混乱するエラーメッセージが表示されます。
Detected NVIDIA GPUs:
1b:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA102 [GeForce RTX 3090] [10de:2204] (rev a1)
Checking card: NVIDIA Corporation GA102 [GeForce RTX 3090] (rev a1)
Uh oh. Your card is not supported by any driver version up to 545.23.06.
A newer driver may add support for your card.
Newer driver releases may be available in backports, unstable or experimental.
これは不合理です。最新のドライバーバージョンが 3090 をサポートしていない理由はありません。確認するためにNVIDIA ドライバーダウンロードページにアクセスしました。もちろん、結果は 3090 がサポートされていることを示しています。
解決策#
なぜこの問題が発生しているのかわからないまま、仮想マシンを繰り返し再起動していると、問題の鍵を見つけました。以前は常に ssh を使用して仮想マシンにリモート接続していましたが、VMRC で仮想マシンを再起動すると、次のようなエラーが起動時に表示されることに気付きました。
[ 12.699654] NVRM: loading NVIDIA UNIX x86_64 Kernel Module 530.41.03 Thu Mar 16 19:48:20 UTC 2023
[ 12.762447] nvidia-modeset: Loading NVIDIA Kernel Mode Setting Driver for UNIX platforms 530.41.03 Thu Mar 16 19:23:04 UTC 2023
[ 12.871331] [drm] [nvidia-drm] [GPU ID 0x00000b00] Loading driver
[ 12.972022] ACPI Warning: \_SB.PCI0.PE50.S1F0._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20210730/nsarguments-61)
[ 13.732645] NVRM: GPU 0000:0b:00.0: RmInitAdapter failed! (0x26:0x56:1474)
[ 13.732697] BUG: unable to handle page fault for address: 0000000000004628
[ 13.732784] NVRM: GPU 0000:0b:00.0: rm_init_adapter failed, device minor number 0
(上記のエラーメッセージはフォーラムからのコピーで、実際のものとは若干異なる場合があります)
Google で検索すると、結果が得られました。
要するに、デフォルトの代わりにオープンバージョンの NVIDIA ドライバーをインストールする必要があるということです。フォーラムの回答では、.run
ファイルを使用してインストールし、-m=kernel-open
オプションを追加する必要があると述べていますが、この問題を解決するための deb パッケージがあるかどうかはわかりません。
この解決策を適用する前に、以前のインストールをクリーンアップする必要があります。
sudo nvidia-uninstall
sudo apt purge -y '^nvidia-*' '^libnvidia-*'
sudo rm -r /var/lib/dkms/nvidia
sudo apt -y autoremove
sudo update-initramfs -c -k `uname -r`
sudo update-grub2
sudo reboot
次に、NVIDIA ドライバーダウンロードサイトから.run
形式のドライバーをダウンロードし、次のコマンドを実行します。
sudo ./NVIDIA-Linux-x86_64-525.116.04.run -m=kernel-open
sudo update-initramfs -u
sudo reboot
残念ながら、これによって問題は解決しませんでした。nvidia-smi
ではまだ何も見つかりません。ただし、これは確かに効果があり、起動時にエラーが表示されなくなりました。
検索した結果、別の解決策を見つけました。
この解決策では、/etc/modprobe.d/nvidia.conf
(存在しない場合は作成)に次の行を追加する必要があります。
options nvidia NVreg_OpenRmEnableUnsupportedGpus=1
再起動すると、問題が解決します。
最後に、NVIDIA cuDNN インストールガイドに従って cuDNN をインストールし、いくつかのモデルを正常に実行しました。