チラシの裏からうっすら見える外枠の外のメモ書き

新聞に挟まってる硬い紙のチラシの裏からうっすら見える外枠の外に走り書きされたようなものです。思いついたときにふらふらと。

Ubuntu 20.04 LTSにnvidia-driver-440とcuda-toolkit-10-1とcuDNNを入れた話

UbuntuNVIDIAGPUドライバとかを入れるのって難しいですね。 かれこれ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のダウンロードページの手順に従ってインストールを行います。 Linuxx86_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

これで特に再起動は必要なく使用できるようになるはずです。