Note to Self by notekunst

ただの備忘録です

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

CUDA と cuDNN の適切なバージョンは GPU に応じて異なります。私の MacBookPro の GPUGeForce GT 750M)のアーキテクチャは Kepler で、Compute Capability は3.0です。この GPU を用いる試行錯誤の結果、以下の組み合わせを採用しました。

Display Driver 418.113
CUDA 10.1
cuDNN 7.6.5
gcc, g++ 8.5

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

Display Driver

ubuntu 22.04 のインストール時に"Install third-party..."をチェックしたからか、最初から以下のドライバが使用可能でした。

  • nvidia-driver-390 (proprietary, tested)
  • nvidia-driver-418-server (proprietary)

しかし、これらを使用する状態で CUDA をインストールする場合、nvidia-smi は GPU を認識できますが、CUDA のサンプルプログラムは GPU を認識できませんでした。そこで、Display Driver を入れ直します。

Nvidiaの以下のウェブサイトで "GeForce GT 750M"、"Linux 64-bit" に適するドライバのバージョンを確認します。
https://www.nvidia.co.jp/Download/index.aspx?lang=jp
以下の結果が得られました。

バージョン: 	418.113
リリース日: 	2019.11.5
オペレーティングシステム: 	Linux 64-bit
言語: 	Japanese
ファイルサイズ: 	104.78 MB 

このウェブページからドライバのインストーラをダウンロード可能ですが、このインストーラを実行しても、インストールに失敗しました(Linuxカーネルが新しすぎる?)
この代わりに、ドライバのパッケージを sudo apt install でインストールしました。

$ sudo apt remove --purge 'nvidia-*'
$ sudo apt remove --purge 'libnvidia*'
$ sudo apt autoremove
$ sudo apt autoclean
$ sudo reboot
$ sudo apt install nvidia-driver-418
$ sudo reboot

nvidia-smi は GPU を認識します。

$ nvidia-smi 
Sat Jul 16 00:00:24 2022       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.129.06   Driver Version: 470.129.06   CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| 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  NVIDIA GeForce ...  Off  | 00000000:01:00.0 N/A |                  N/A |
| N/A   59C    P0    N/A /  N/A |    244MiB /  1999MiB |     N/A      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

ドライバのバージョンが、"418" でなく "470.129.06"となっていますが、動くからよし、としました。

CUDAのバージョン

Nvidiaの以下のウェブサイトでドライバ 418.113 に適する CUDA のバージョンを確認すると CUDA 10.1 が最新でした。
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
一方、Nvidiaの以下のウェブサイトによると、Compute Capability 3.0には、CUDA10.2, cuDNN 8.4.1 が対応しています。
https://docs.nvidia.com/deeplearning/cudnn/support-matrix/index.html
念の為、ドライバ 418.113 に適合する CUDA 10.1 を採用しました。

ちなみに、CUDA 10.2 + cuDNN 8 シリーズをインストールする場合、CUDA のサンプルプログラムは動作しました。しかし、cuDNN のサンプルプログラム "mnistCUDNN" の実行時には、GT 750M の機能不足に起因すると思われるエラーが発生しました。
CUDA 10.2 + cuDNN 7.6.5 をインストールする場合、CUDA のサンプルプログラムも mnistCUDNN も正常に動作しました。CUDA 10.2 + cuDNN 7.6.5 の組み合わせでもよかったかもしれません。

CUDA のインストール

Nvidiaの以下のウェブサイトから、CUDA 10.1のパッケージをダウンロードします。
https://developer.nvidia.com/cuda-toolkit-archive
私は、"CUDA Toolkit 10.1 update2 (Aug 2019)"から先に進み、"Linux", "x86_64", "Ubuntu", "18.04", "deb (local)"を選択しました。すると、"Installation Instructions:"が表示されます。
ここで、最後の"sudo apt-get -y install cuda"を実行すると、toolkit に加えて Display Driver をインストールしようとします。Display Driver の更新は不要なので、cuda-toolkitをインストールします。

$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
$ sudo cp cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ wget https://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda-repo-ubuntu1804-10-1-local-10.1.243-418.87.00_1.0-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1804-10-1-local-10.1.243-418.87.00_1.0-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-10-1-local-10.1.243-418.87.00/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get -y install cuda-toolkit-10-1

".bashrc" などで、パスを設定します。

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

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 のサンプルを試してみます。しかし、ubuntu 22.04 の gcc-11 では、CUDA 10.1 のサンプルプログラムをコンパイルできません。CUDA 10.1 には gcc-8シリーズが上限のようです。

gcc-8.5 のインストール

sudo apt install で簡単にインストールできる gcc-8 のパッケージを探しましたが、見当たりませんでした。
そこで、ソースコードから gcc-8 シリーズをビルドしました。
GCC の以下のウェブサイトから適当なミラーサイト(例えば、Japan のミラーサイト)に移動します。
https://gcc.gnu.org/mirrors.html
"releases"の下には、歴代の gccディレクトリがあります。gcc-8 シリーズの最新の "gcc-8.5.0" に移動して "gcc-8.5.0.tar.gz" をダウンロードします。
gcc のビルドには、以下の記事が参考になります。
https://gcc.gnu.org/install/
https://gcc.gnu.org/onlinedocs/libstdc++/manual/configure.html
ソースコードを展開して configure, make, make install を行います。gcc-11 との共存のために、専用のディレクトリ(ここでは、"/usr/local/gcc-8.5")にgcc-8.5をインストールします。

$ tar zxf gcc-8.5.0.tar.gz
$ cd gcc-8.5/
$ ./configure --prefix=/usr/local/gcc-8.5 --program-suffix=-8.5 --disable-multilib --enable-languages=c,c++
$ make
$ sudo make install

なお、この設定では、検証用の3ステージのビルドのために時間がかかります。configure のオプションに "-disable-bootstrap" を追加して、1ステージのビルドで終わらせることも可能です。

また、gcc-11 と gcc-8.5 を使い分けるために、update-alternative を設定します。

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 70 --slave /usr/bin/g++ g++ /usr/bin/g++-11
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/local/gcc-8.5/bin/gcc-8.5 50 --slave /usr/bin/g++ g++ /usr/local/gcc-8.5/bin/g++-8.5

sudo update-alternatives --config gcc を実行して、gcc-8.5 を選択します。そして、CUDA のサンプルプログラムをコンパイルしてみます。サンプルプログラム集は、以下のコマンドでコピーできます。

$ cuda-install-samples-10.1.sh ./

いろいろなサンプルがあります。
1_Utilities/deviceQuery に移動して make を実行すると、deviceQuery が生成されます。 deviceQuery を実行すると、NVIDIA GeForce GT 750M の情報が表示されます。
5_Simulations/smokeParticles に移動して make を実行すると、smokeParticles が生成されます。smokeParticles を実行すると、きれいな動画が表示されます。

cuDNN のバージョン

cuDNN 8 シリーズを試したところ、サンプルプログラムの mnistCUDNN の実行時にエラーが発生しました。そこで、cuDNN 7 シリーズを採用します。Nvidia の以下のウェブサイトのリリースノートを参照して、GT 750M に適するバージョンを探します。
Release Notes :: NVIDIA Deep Learning cuDNN Documentation
cuDNN 7.6.4 のリリースノートには、以下のように、capability 5.3未満(Kepler等)の場合の Fixed Issues が記載されています。cuDNN 7.6.4 は、GT 750M でも動作しそうです。

Fixed Issues
The following issues have been fixed in this release:
Multihead attention will now return CUDNN_STATUS_ARCH_MISMATCH for true-half configuration on devices with compute capability less than 5.3 (for example, most of Maxwell and all of NVIDIA Kepler, and so on), which do not have native hardware support for true half computation. Previously, an error like CUDNN_STATUS_EXECUTION_FAILED may be triggered or inaccurate results may be produced. 

最新の cuDNN 7.6.5 のリリースノートには、capability 3.0 を除外するような記載は見当たりません。そこで、 cuDNN 7.6.5 を採用しました。

cuDNN のインストール

Nvidia の以下のページから、cuDNN 7.6.5 のパッケージをダウンロードします。メンバー登録が必要です。
https://developer.nvidia.com/rdp/cudnn-download
CUDA 10.1 用の cuDNN 7.6.5 の3つのファイルをダウンロードします。

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

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

$ sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.1_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.1_amd64.deb
$ sudo dpkg -i libcudnn7-doc_7.6.5.32-1+cuda10.1_amd64.deb

cuDNN のサンプルをコンパイルしてみます。

$ cp -r /usr/src/cudnn_samples_v7 ./
$ cd cudnn_samples_v7/mnistCUDNN
$ make
$ ./mnistCUDNN
(これで、"Test passed!" と表示されれば成功です)