はじめに
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して、再び処理をやり直しました。