いつの間にか壊れてしまっていたGPU環境を直す
長らく使っていなかった Ubuntu の GPU 環境を開いたら,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.
またか.
電源がうまく切れていなかったり長時間使っていなかったりするとすぐドライバが逝く気がしますが,原因は知りません.
そもそも私がセットアップした環境ではなく,当時の資料もないのでどういう環境だったのかすらわかりません.
PC 環境
- Ubuntu 16.04
- NVIDIA Tesla P100 16GB x2
GPU の確認
搭載されている GPU がわからない場合は下記のコマンドで調べることができます.
terminal
$ lspci | grep -i nvidia
02:00.0 3D controller: NVIDIA Corporation GP100GL [Tesla P100 PCIe 16GB] (rev a1)
03:00.0 3D controller: NVIDIA Corporation GP100GL [Tesla P100 PCIe 16GB] (rev a1)
ドライバがイカれていると製品名が表示されず,ID みたいなのが表示されることもあります.
CUDA, cudnn のバージョン確認
NVIDIA のドライバを修正する前に CUDA や cudnn がちゃんと入っているか確認しておきます.
調べた結果
- CUDA 8.0.0.44
- cudnn 6.0.21
でした.古い.
各ドライバの更新
NVIDIA ドライバを入れようにも CUDA が古いので,すべて新しいものに更新します.
Ubuntu 16.04 なのでそれに対応したものを選択する必要がありますが,今回は TensorFlow のドキュメントに従って CUDA 10.1 を入れることにします.
そこで apt-get install
しようとしたらエラーが出ました.
terminal
$ sudo apt-get install gnupg-curl
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
linux-image-generic : Depends: linux-image-4.4.0-170-generic but it is not going to be installed or
linux-image-unsigned-4.4.0-170-generic but it is not going to be installed
linux-modules-extra-4.4.0-169-generic : Depends: linux-image-4.4.0-169-generic but it is not going to be installed or
linux-image-unsigned-4.4.0-169-generic but it is not going to be installed
linux-modules-extra-4.4.0-170-generic : Depends: linux-image-4.4.0-170-generic but it is not going to be installed or
linux-image-unsigned-4.4.0-170-generic but it is not going to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).
依存関係のあるパッケージが入っていないようです.
これを解決するためのコマンドを実行するもまたもやエラー.
terminal
$ sudo apt-get -f install
Reading package lists... Done
Building dependency tree
Reading state information... Done
Correcting dependencies... Done
The following packages were automatically installed and are no longer required:
linux-headers-4.4.0-150 linux-headers-4.4.0-150-generic linux-headers-4.4.0-151
linux-headers-4.4.0-151-generic linux-headers-4.4.0-157 linux-headers-4.4.0-157-generic
...
After this operation, 436 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://jp.archive.ubuntu.com/ubuntu xenial-updates/main amd64 linux-modules-4.4.0-186-generic amd64 4.4.0-186.216 [12.0 MB]
...
Unpacking linux-modules-4.4.0-186-generic (4.4.0-186.216) ...
dpkg: error processing archive /var/cache/apt/archives/linux-modules-4.4.0-186-generic_4.4.0-186.216_amd64.deb (--unpack):
cannot copy extracted data for './boot/System.map-4.4.0-186-generic' to '/boot/System.map-4.4.0-186-generic.dpkg-new': failed to write (No space left on device)
No apport report written because the error message indicates a disk full error
...
E: Sub-process /usr/bin/dpkg returned an error code (1)
No space left on device
とのことで,ストレージがいっぱいになっているようです.
この場合は以下の方法で解決できることがあります.
apt-get install
が動くようになったら,パッケージを取得してインストールしていきます.
最後の行の nvidia-418
の番号はドライバのバージョンです.
求められるバージョンは OS や GPU によって異なり,NVIDIA の ドライバダウンロードサイト で調べることができます.
terminal
# Add NVIDIA package repositories
# Add HTTPS support for apt-key
$ sudo apt-get install gnupg-curl
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_10.1.243-1_amd64.deb
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$ sudo dpkg -i cuda-repo-ubuntu1604_10.1.243-1_amd64.deb
$ sudo apt-get update
$ wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
$ sudo apt install ./nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
$ sudo apt-get update
# Install NVIDIA driver
# Issue with driver install requires creating /usr/lib/nvidia
# If not exist
$ sudo mkdir /usr/lib/nvidia
$ sudo apt-get install --no-install-recommends nvidia-418
ここで Ubuntu を再起動します.
terminal
$ sudo reboot
再起動後,改めて接続して nvidia-smi
を実行してみてください.
terminal
$ nvidia-smi
Mon Aug 3 03:38:10 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.152.00 Driver Version: 418.152.00 CUDA Version: N/A |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla P100-PCIE... Off | 00000000:02:00.0 Off | 0 |
| N/A 29C P0 32W / 250W | 0MiB / 16280MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 Tesla P100-PCIE... Off | 00000000:03:00.0 Off | 0 |
| N/A 31C P0 26W / 250W | 0MiB / 16280MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
直りました!!
あとは,CUDA と cudnn も更新しておきます.
terminal
# Install development and runtime libraries (~4GB)
$ sudo apt-get install --no-install-recommends \
cuda-10-1 \
libcudnn7=7.6.4.38-1+cuda10.1 \
libcudnn7-dev=7.6.4.38-1+cuda10.1ub
インストール後,バージョンを確認して更新されていれば OK です.
最後に,もう一度 nvidia-smi
を拝んでおこうと思ってコマンドを実行したら,なんとエラーが発生.
Failed to initialize NVML: Driver/library version mismatch
これは再起動で直ります.
そして,再起動後に表示された結果が以下のとおりです.
terminal
$ nvidia-smi
Mon Aug 3 03:56:09 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.51.06 Driver Version: 450.51.06 CUDA Version: 11.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Tesla P100-PCIE... Off | 00000000:02:00.0 Off | 0 |
| N/A 29C P0 28W / 250W | 0MiB / 16280MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 1 Tesla P100-PCIE... Off | 00000000:03:00.0 Off | 0 |
| N/A 31C P0 26W / 250W | 0MiB / 16280MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
ここで疑問に思ったことが二つ.
- CUDA, cudnn の更新によって NVIDIA ドライバもバージョンアップした
- CUDA の欄が 11.0 になっている
一つ目に関しては,バージョンアップの度に NVIDIA ドライバを再インストールしなくても,CUDA に応じてインストールされるようになっているのかもしれません.
二つ目に関しては,紛らわしいので表記変えてほしいです.
私の認識では,ここに表示されているのは NVIDIA ドライバが対応している CUDA バージョンであって,PC にインストールされているもののバージョンではありません.
実際,先ほど入れたのは CUDA 10.1 でした.
たまにミスリードしている記事があるっぽいので注意が必要です.(といいつつ,私が間違っている可能性も)
最後に
なにはともあれ,直ったので良かったです.
Windows で記事書きながら macOS から Ubuntu に SSH していたので効率は悪かったのですが,それでも4~5時間くらいあれば作業が終わるかと思います.
こういう悲劇を生まないために,NVIDIA Container Toolkit を使うのも良さそうです.