nvidia-smi 実行時にFailed to initialize NVML: Driver/library version mismatchとなる場合の対処法

はじめに

nvidia-smiを実行する際に生じた以下のエラーを解決する方法に関して、つまづいた部分を忘備録として残します。

$ nvidia-smi
Failed to initialize NVML: Driver/library version mismatch

結論

nvidia 関連のドライバをアンロードします。アンロードとは、Linuxのカーネル本体とは別に管理されているモジュール(ここではドライバ)を取り除く動作のことです。

GPUのように、後付されるハードのドライバなどは、Linux本体からロード/アンロードすることによって管理されます。

手法

以下のコマンドで、使用されているnvidia関連のドライバを特定します。

$ lsmod | grep nvidia

私の環境では、以下のようになりました。一番右側に依存関係が表示されます。

nvidia_uvm            634880  8
nvidia_drm             53248  0
nvidia_modeset        790528  1 nvidia_drm
nvidia              12312576  86 nvidia_modeset,nvidia_uvm

アンロードのコマンドとして、rmmodコマンドを使用します。上に表示されたドライバを順次アンロードしていきます。(なぜアンロードすると解決するのか追記)

$ sudo rmmod nvidia_drm
$ sudo rmmod nvidia_modeset
$ sudo rmmod nvidia_uvm

最後に、

$ sudo rmmod nvidia

によって、nvidiaそのものをアンロードしてください。

以下に、作動中のプロセスによってrmmodができない場合の対処法を載せておきます。

作業中に生じたエラーとその解決法

rmmodコマンドでは、取り除こうとするモジュールが別のプロセスに使用されている場合、エラーが生じます。例えば、以下のようなエラーが出ました。

$ sudo rmmod nvidia_uvm
rmmod: ERROR: Module nvidia_uvm is in use

StackOverflow

https://stackoverflow.com/questions/43022843/nvidia-nvml-driver-library-version-mismatch

によると、

$ sudo lsof /dev/nvidia*

コマンドで、nvidia 関連のドライバを使用するプロセスが特定できるとありました。

lsof コマンドの表示内容は、man コマンドか、リンク先 で確認できます。

実行すると、nvidia_uvm を利用するプロセスは、/dev/nvidia-uvm で動作していることがわかり(アンダーバーがハイフンになっていることに注意)、更に

sudo lsof /dev/nvidia-uvm*

によって、nvidia-uvm を利用するプロセスをkillしても問題なさそうか確認してから、関連するPIDをすべてkillして、再び処理をやり直しました。

参考文献

NVIDIA NVML Driver/library version mismatch

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*