UbuntuにNVIDIAのGPUドライバとかを入れるのって難しいですね。 かれこれ1年ぐらいUbuntuのお世話をしているんですが、Ubuntu 16.04 LTSでドライバの相性問題に悩まされて辛い思いをしました。 そろそろUbuntu 16.04 LTSも乗り換えの時期かと思いUbuntu 20.04 LTSに乗り換えたんですが、こっちでもドライバがうまくインストールできなかったことがあったのでまとめておきます。 なお、GPUが古いとnvidia-driver 440やCUDA 10.1すら入らない可能性があるのでその場合は以下の方法は使えません。 ハードウェアとドライバとCUDAの対応関係について
環境など
~$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=20.04 DISTRIB_CODENAME=focal DISTRIB_DESCRIPTION="Ubuntu 20.04 LTS"
~$ nvidia-smi Thu Jul 9 21:54:56 2020 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 440.100 Driver Version: 440.100 CUDA Version: 10.2 | |-------------------------------+----------------------+----------------------+ | 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 RTX 2080 Off | 00000000:01:00.0 Off | N/A | | 17% 40C P8 18W / 215W | 74MiB / 7973MiB | 0% Default | +-------------------------------+----------------------+----------------------+
~$ nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2019 NVIDIA Corporation Built on Sun_Jul_28_19:07:16_PDT_2019 Cuda compilation tools, release 10.1, V10.1.243
CUDA 10.1なのは、TensorFlow 2.2が動作する要件になっているためです。
~$ cat /usr/include/cudnn.h | grep CUDNN_MAJOR -A 2 #define CUDNN_MAJOR 7 #define CUDNN_MINOR 6 #define CUDNN_PATCHLEVEL 5 -- #define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL) #include "driver_types.h"
現時点でのメモ
Ubuntu 20.04 LTS向けにCUDAが公開されていますが、これはCUDA Toolkit 11.0でCUDA 10.1はインストールできません。apt search
を使っても該当するソフトウェアはヒットしませんでした。
CUDAのダウンロードアーカイブにあるCUDA Toolkit 10.1のダウンロードページにはUbuntu 20.04 LTSの項目がありませんが、代わりにUbuntu 18.04 LTSの項目と互換性があることを確認しています。
最新のCUDA Toolkitダウンロードページ(現時点ではCUDA Toolkit 11.0)
CUDA 10.01 update2ダウンロードページ
デフォルトのドライバを無効化する
UbuntuにはnouveauというOSSドライバがありますが今回は使わないので無効化しておきます。 以下のコマンドで有効か確認します。何も出なければ最初から入ってないかすでに無効化されています。
~$ lsmod | grep nouveau
もしエラーなく色々な情報が表示されればnouveauが動作している証拠なので以下の内容を/etc/modprobe.d/blacklist-nouveau.conf
というファイルを新規作成して書き込みます。
blacklist nouveau options nouveau modeset=0
そして変更を適用し再起動してください。
~$ sudo update-initramfs -u
~$ sudo reboot
nvidia-driverを入れる
CUDA 10.1を使うにはnvidia-driver 440が必要なのでインストールします。 PPAのリポジトリにNVIDIAがドライバを公開しているので、このリポジトリを追加します。
~$ sudo add-apt-repository ppa:graphics-drivers/ppa
画面に説明が英語や日本語で出るのでいい感じに読んでうまく追加してください。 次にリポジトリの情報を更新します。
~$ sudo apt update
推奨ドライバチェック
ドライバインストールの前に、本当に今入れようとしているドライバが推奨ドライバなのか確認します。
~$ ubuntu-drivers devices == /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 == modalias : pci:v000010DEd00001E82sv00001462sd00003723bc03sc00i00 vendor : NVIDIA Corporation model : TU104 [GeForce RTX 2080] driver : nvidia-driver-435 - distro non-free driver : nvidia-driver-440 - distro non-free recommended driver : xserver-xorg-video-nouveau - distro free builtin
すると、ドライバ一覧が表示されます。 ここでは、ちゃんとnvidia-driver-440がrecommendedとなっているので問題なさそうです。 環境によってはもっと古いドライバがrecommendedになっていたり、そもそもこのリストにnvidia-driver-440が出てないかもしれないのでその場合はこの記事ではインストールできません。
チャックが終わったところで、ドライバをインストールしましょう。 以下のコマンドでインストールできるはずです。
~$ sudo apt install nvidia-driver-440
一旦ここで再起動します。
~$ sudo reboot
再起動後、nvidia-smi
を実行し問題なく動作しているか確認します。
~$ nvidia-smi Thu Jul 9 22:15:39 2020 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 440.100 Driver Version: 440.100 CUDA Version: 10.2 | |-------------------------------+----------------------+----------------------+ | 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 RTX 2080 Off | 00000000:01:00.0 Off | N/A | | 17% 37C P8 18W / 215W | 74MiB / 7973MiB | 0% Default | +-------------------------------+----------------------+----------------------+
正しくインストールできていればDriver Versionが440.xxxとなるはずです。
cuda-toolkitのインストール
次にCUDAを使えるようにするためcuda-toolkitを入れます。
CUDA Toolkit 10.1 update2のダウンロードページの手順に従ってインストールを行います。
Linux→x86_64→Ubuntu→18.04→deb [network]を押してBase Installerの項目を表示します。
そこに記載の手順に従ってインストールを行いますが、最後の手順sudo apt-get -y install cuda
についてはsudo apt-get -y install cuda-10-1
など明確にバージョンを指定しましょう。
すでに上で書いたように最新のCUDA ToolkitはUbuntu 20.04に対応していますがcuda-10-1がないので現時点ではインストールできません。
インストールが終了したらCUDAにパスを通します。以下の内容を/etc/bash.bashrc
など全員で共有するプロファイルに追加します。
export PATH="/usr/local/cuda/bin:$PATH" export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
一人で使う場合は~/.bashrc
に追加しても問題ないと思います。
そして再び再起動します。
~$ sudo reboot
再起動後、nvcc -V
を実行し問題なく動作しているか確認します。
~$ nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2019 NVIDIA Corporation Built on Sun_Jul_28_19:07:16_PDT_2019 Cuda compilation tools, release 10.1, V10.1.243
正しくインストールできていればCuda compilization tools, release 10.1, V10.1.xxxとなるはずです。
cuDNNをインストールする。
cuDNNはNVIDIAの開発者ページに登録する必要があります。 cuDNNのページからダウンロードページへ移動し、インストールしたCUDAのバージョンに合うcuDNNを選択します。 Ubuntuのライブラリを選択します。ただし、Code Samples and User Guideについてはサンプルでしかないので環境構築だけに関して言えば不要です。 ダウンロードしたファイルをカレントディレクトリに置き、次のコマンドでインストールします。
~$ sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.2_amd64.deb ~$ sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.2_amd64.deb
cat /usr/include/cudnn.h | grep CUDNN_MAJOR -A 2
を実行し問題なく動作しているか確認します。
~$ cat /usr/include/cudnn.h | grep CUDNN_MAJOR -A 2 #define CUDNN_MAJOR 7 #define CUDNN_MINOR 6 #define CUDNN_PATCHLEVEL 5 -- #define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL) #include "driver_types.h"
おまけ1 Docker用にnvidia-container-runtimeを入れる
DockerでGPUを使用するためには、上のセットアップに加えてnvidia-container-runtimeもインストールする必要があります。 nvidia-container-runtimeのリポジトリにインストール方法が記載されているので、そのとおりに進めればインストールできます。 その後、Dockerデーモンを再起動すれば使えるようになります。
おまけ2 Rootless-Docker用に設定を変更する
Rootless-Dockerを使っている場合はおまけ1だけでは使うことができません。
/etc/nvidia-container-runtime/config.toml
を開き以下の箇所を変更します。
#no-cgroups = false
ここを以下のようにする。
no-cgroups = true
これで特に再起動は必要なく使用できるようになるはずです。