Ubuntuでnvidiaドライバーが動作しない

More than 1 year has passed since last update.

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を選択

image.png

デフォルトでは4.13.26になっていたが、前の4.10.28があったのでそれを選択して起動する。

画像は借り物なのでバージョンが違うので注意。


image.png

すると解像度も正常になり、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


参考

http://sweng.web.fc2.com/ja/linux/ubuntu/change-default-boot-kernel.html

https://askubuntu.com/questions/216398/set-older-kernel-as-default-grub-entry