HDDが壊れたので新しくSSDを買ってUbuntuを入れ直して、CUDAを入れたが、インストールされたNVIDIAドライバーがうまく動作せず、nvidia-smiを打つとこのようなメッセージが出て困った
$ nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running."
結論としては、Ubuntuの最新カーネルではnvidiaドライバが機能しないトラブルが起きているようなので、ubuntuカーネルを古いものに変えると正常になった。
環境
- Ubuntu 16.04
- GTX 1080
- CUDA 8.0
一応作業手順
$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda
$ sudo init 6
これでcuda-toolkitとnvidia-387が自動でインストールされて、以前なら問題なく動作していた。
しかしnvidiaドライバにアクセスできない、ドライバが合ってないみたいなことを言われて困った。
起動時も解像度が合っておらず、うまくドライバが読み込めていない模様。
$ nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running."
もしかしてnvidiaドライバのバージョンが違う?と思い、nvidiaのサイトで対象GPUのドライバのバージョンを確認してみる。
GTX1080だと384と出たので、nvidia-387を削除してnvidia-384を入れようと試みる。
削除するときは、
$ sudo apt-get --purge remove nvidia-*
$ sudo apt-get --purge remove cuda-*
で削除する。一応関連するものが残っていないか以下で確認し、残っていたら個別に削除する。
$ dpkg -l | grep nvidia
$ dpkg -l | grep cuda
でnvidia-384を入れる
$ sudo apt-get install nvidia-384
これならば、nvidia-smiが通る。
しかしCUDAパッケージはnvidia-387に依存しているかつnvidia-384を入れるとnvidia-387が削除されるので、CUDAは削除されてしまう。
解決方法
似たような状況になっている人がいないか調べたところ、ここ数日で同じ状況に遭遇している人がそこそこいた。
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver" Ubuntu 16.0...
どうやら、Ubuntu16.04のカーネルが最近4.10から4.13に変わり、環境を新しくした場合にnvidia-ドライバがうまく働かない状況になっている模様。
そこで暫定的に、PC起動時にESCキーを押してブート選択メニューに入り、Advanced Option for Ubuntuを選択
デフォルトでは4.13.26になっていたが、前の4.10.28があったのでそれを選択して起動する。
画像は借り物なのでバージョンが違うので注意。
すると解像度も正常になり、nvidia-smiもちゃんと返ってくるようになった
$ nvidia-smi
Sat Jan 13 14:05:15 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 387.26 Driver Version: 387.26 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 1080 Off | 00000000:01:00.0 On | N/A |
| 55% 82C P2 146W / 180W | 842MiB / 8111MiB | 98% Default |
+-------------------------------+----------------------+----------------------+
| 1 GeForce GTX 1080 Off | 00000000:03:00.0 Off | N/A |
| 48% 67C P2 166W / 198W | 783MiB / 8114MiB | 99% Default |
+-------------------------------+----------------------+----------------------+
| 2 GeForce GTX 1080 Off | 00000000:04:00.0 Off | N/A |
| 48% 67C P2 185W / 198W | 783MiB / 8114MiB | 98% Default |
+-------------------------------+----------------------+----------------------+
起動時のデフォルトカーネルを変更
さすがに再起動のたびに毎回カーネルを変更するのは面倒なので、デフォルトで設定しておく。
まずはGRUBの起動オプションの確認をする。
$ grep menuentry /boot/grub/grub.cfg
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-e0077458-0564-44fa-8774-8de1e30bfe34' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-e0077458-0564-44fa-8774-8de1e30bfe34' {
menuentry 'Ubuntu, with Linux 4.13.0-26-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-26-generic-advanced-e0077458-0564-44fa-8774-8de1e30bfe34' {
menuentry 'Ubuntu, with Linux 4.13.0-26-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-26-generic-init-upstart-e0077458-0564-44fa-8774-8de1e30bfe34' {
menuentry 'Ubuntu, with Linux 4.13.0-26-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-26-generic-recovery-e0077458-0564-44fa-8774-8de1e30bfe34' {
menuentry 'Ubuntu, with Linux 4.10.0-28-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.10.0-28-generic-advanced-e0077458-0564-44fa-8774-8de1e30bfe34' {
menuentry 'Ubuntu, with Linux 4.10.0-28-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.10.0-28-generic-init-upstart-e0077458-0564-44fa-8774-8de1e30bfe34' {
menuentry 'Ubuntu, with Linux 4.10.0-28-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.10.0-28-generic-recovery-e0077458-0564-44fa-8774-8de1e30bfe34' {
これは起動時にESCキーを押して入った起動メニューと対応している。
デフォルトでどのオプションで起動するかは、/etc/default/grub
にかかれている。
GRUB_DEFAULT=0
これだと、トップメニューの0番目、Ubuntuを選ぶようになる。
この部分を以下のように変更する。
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.10.0-28-generic"
確認していないが、おそらく以下でもOK
GRUB_DEFAULT="1>3"
2番目(Advanced options for Ubuntu)を選択→3番目(Ubuntu, with Linux 4.10.0-28-generic)を選択みたいな感じ。
GRUBの設定を反映させるために、以下を実行
$ sudo update-grub
その後、再起動して、使用カーネルを確認すると、4.10.28になっていた。
$ uname -r
4.10.0-28-generic
参考