Note to Self by notekunst

ただの備忘録です

Nvidia Driver, CUDA, cuDNN, gcc, g++のインストール(Ubuntu 20.04 on MacBookPro 15" Late 2013)

NvidiaGPUは、"Compute Capability"と呼ばれるパラメータを用いて区分されます。 "Compute Capability" によって、利用可能なCUDAのバージョンとcuDNNのバージョンが決まります。

私のMacBookProに関しては、GPUは"GeForce GT 750M"であり、"Compute Capability"は3.0です。
この場合、以下の組み合わせを用いると、GPUを使うアプリがうまく動きました。

CUDA 10.2
cuDNN 7.6.5
gcc, g++ 8系列

参考

以下、インストールの記録です。

gcc-8, g++-8

インストール

Ubuntu 20.04がインストールされた環境では、gcc-9, g++-9が利用可能です。しかし、CUDA10.2, cuDNN7.6.5のサンプルプログラムは、この環境ではコンパイルできません。そこで、gcc-8, g++-8をインストールします。

$ sudo apt install gcc-8
$ sudo apt install g++-8
環境の制御

共存する8系列と9系列を使い分けるために、"update-alternatives"を用います。

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 70 --slave /usr/bin/g++ g++ /usr/bin/g++-9
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 50 --slave /usr/bin/g++ g++ /usr/bin/g++-8

上記2個のコマンドの実行後、以下のコマンドで8系列と9系列の間で環境を切り替えることができます。

$ sudo update-alternatives --config gcc
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).
Selection Path Priority Status
  0 /usr/bin/gcc-9 70 auto mode
* 1 /usr/bin/gcc-8 50 manual mode
  2 /usr/bin/gcc-9 70 manual mode

上記表示の後に、希望の選択肢を入力します。

  • リターンキー : 現状が維持されます。上記の例では、1番(8系列)が選択されています。
  • "1" : "gcc-8"とそれに紐付けられた"g++-8"が、"gcc","g++"にリンクされます。
  • "2" : "gcc-9"とそれに紐付けられた"g++-9"が、"gcc","g++"にリンクされます。
  • "0" : 優先度に基づいて自動的に環境が選択されます。上記の例では、9系列の優先度"70"が8系列の優先度"50"よりも大きいので、9系列の環境が選択されます。

CUDA 10.2

Nvidiaの"CUDA 10.2"の解説ページを参照して、作業を進めます。
https://docs.nvidia.com/cuda/archive/10.2/cuda-installation-guide-linux/index.html
具体的な手順は、以下の通りです。

"linux-headers"のインストール

自分のシステムのカーネルのバージョンと同じバージョンのヘッダをインストールします。

$ uname -r
5.4.0-39-generic
$ sudo apt install linux-headers-5.4.0-39-generic

Nvidiaのページには、以下のone linerがありました。

sudo apt-get install linux-headers-$(uname -r)
"CUDA Toolkit 10.2"のインストール

下記URLで自分のシステムの情報を入力すると、インストール用のコマンドセットが表示されます。
https://developer.nvidia.com/cuda-10.2-download-archive

  • "Ubuntu"のバージョンとして"18.04"を選びます。
  • "Installer Type"としては、私は"deb [local]"を選びました。

表示されたコマンドを入力して、CUDAをインストールします。

$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
$ sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ wget http://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-10-2-local-10.2.89-440.33.01/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get -y install cuda
パスの設定

~/.bashrc に、以下の設定を追加します。

export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"

以上により、CUDAがインストールされます。nvccを実行してみます。

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_19:24:38_PDT_2019
Cuda compilation tools, release 10.2, V10.2.89

また、CUDA10.2に適した nvidia driver (最新ではない)もインストールされます。nvidia-smiを実行してみます。

$ nvidia-smi 
Sat Jul  4 01:25:50 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.33.01    Driver Version: 440.33.01    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 GT 750M     On   | 00000000:01:00.0 N/A |                  N/A |
| N/A   52C    P8    N/A /  N/A |    332MiB /  1999MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0                    Not Supported                                       |
+-----------------------------------------------------------------------------+

CUDAのサンプルをビルドしてみます。

$ cuda-install-samples-10.2.sh ./
(カレントディレクトリにサンプルコードのセットがコピーされます)
$ cd NVIDIA_CUDA-10.2_Samples/
ここで、makeと入力すると、多数のサンプルをコンパイルしますが、時間もかかるので、
適当なサンプルを選んでコンパイルします。
$ cd 5_Simulations/smokeParticles/
$ make
$ ./smokeParticles

cuDNN 7.6.5

Nvidiaの下記ページから、cuDNNのパッケージをダウンロードします。
メンバー登録が必要です。
https://developer.nvidia.com/rdp/cudnn-download

CUDA10.2用のcuDNN v7.6.5の3つのパッケージをダウンロードします。

  • 1) libcudnn7_7.6.5.32-1+cuda10.2_amd64.deb
  • 2) libcudnn7-dev_7.6.5.32-1+cuda10.2_amd64.deb
  • 3) libcudnn7-doc_7.6.5.32-1+cuda10.2_amd64.deb

1,2は必須、3は任意です。

各パッケージをインストールします。

$ 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
$ sudo dpkg -i libcudnn7-doc_7.6.5.32-1+cuda10.2_amd64.deb

cuDNNのサンプルをビルドしてみます。

$ cp -r /usr/src/cudnn_samples_v7 ./
(サンプルコードのセットがカレントディレクトリにコピーされます)
$ cd ./udnn_samples_v7/mnistCUDNN/
$ make
$ ./mnistCUDNN
(これで"Test passed!"と表示されれば成功です)

以上で、インストールは終了です。