banner
二階堂春希

春希のブログ

山雨欲来风满楼,故攻八面以铸无双。 孤战非所望,俗安不可期。
tg_channel
telegram
twitter
github

ESXiのDebian仮想マシンにNVIDIAグラフィックドライバーをインストールする

背景#

最近、家庭データセンターで AI を実行するためのサーバーを構築しようとしています。私が 3090 を動かせるデバイスを 1 台しか持っていないため、新しいものを購入するのは高すぎるので、ESXi を使用して仮想マシンを直通することにしました。

仮想マシンの構成は以下の通りです:

  • EPYC 7302 * 48
  • ESXi-7.0U3 プラットフォームに基づく
  • NVIDIA GeForce RTX 3090
  • 128G メモリ
  • Debian GNU/Linux 12 (bookworm) x86_64

主要プロセス#

まず仮想マシンを設定し、慣例に従って以下を設定します:

  • 全メモリをロック
  • hypervisor.cpuid.v0=FALSEを設定
  • pciPassthru0.msiEnabled=FALSEを設定

詳細は省略しますが、後で具体的なプロセスを補足するかもしれません。(グーグー)とにかく、これらの操作は多くの場所で見つけることができます。

仮想マシン内で、まず apt ソースを設定し、non-free-firmwareを含めるようにします。/etc/apt/source.listnon-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メタパッケージ

問題#

通常、物理マシンでは直接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

すると、混乱を招くエラーメッセージが表示されます。

検出されたNVIDIA GPU:
1b:00.0 VGA互換コントローラー [0300]: NVIDIA Corporation GA102 [GeForce RTX 3090] [10de:2204] (rev a1)

カードを確認中:  NVIDIA Corporation GA102 [GeForce RTX 3090] (rev a1)
おっと。あなたのカードは545.23.06までのどのドライバーでもサポートされていません。
新しいドライバーがあなたのカードのサポートを追加するかもしれません。
新しいドライバーリリースはバックポート、不安定、または実験的なものにあるかもしれません。

これは不合理です。最新の GPU ドライバーが 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 ドライバーではなく、オープンバージョンの 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 をインストールし、いくつかのモデルを正常に実行しました。

成功結果

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。