2018年07月15日

「Ubuntu 18.04 LTS 日本語 Remix」に「CUDA 8.0」+「cuDNN 6.0」をインストールする

Ubuntu18.04上で「CUDA 8.0」+「cuDNN 6.0」環境が必要になった場合、Ubuntu16.04用インストールファイルをそのまま使うことはできません。
Ubuntu16.04用のdebファイルもrunファイルも、Ubuntu18.04上ではエラーをともない、インストールを完了することはできないからです。
しかし、Ubuntu16.04用のdebファイルもしくはrunファイルを解凍し、抽出したファイルを手動で配置してやることで、Ubuntu18.04上に「CUDA 8.0」+「cuDNN 6.0」環境を導入することは可能です。

1. コンパイラ設定
Ubuntu18.04では「gcc-7」が標準ですが、「CUDA 8.0」は「gcc-7」と互換性がなく、コンパイル作業には「gcc-5」以下が必要です。
そのため、「gcc-5」「g++-5」をインストールのうえ「update-alternatives」コマンドを使って「gcc-7」「g++-7」より優先順位をあげて、一時的に自動モードで「gcc-5」「g++-5」が使われるように設定します。

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 70

$ sudo apt-get install gcc-5 g++-5

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 80
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 80


ただし、「CUDA」を使う作業が終わったら「gcc-5」「g++-5」の優先順位をさげて、自動モードでシステム標準の「gcc-7」「g++-7」が使われるように設定をもどしておきます。

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 50


GPU版「TensorFlow」をソースからインストールする場合、GPU版「PyTorch」をソースからインストールする場合、「gcc-4.8」が必要になるようです。
そうしたケースでは、「gcc-4.8」「g++-4.8」をインストールのうえ「update-alternatives」コマンドを使って優先順位をあげて、一時的に自動モードで「gcc-4.8」「g++-4.8」が使われるように設定します。

$ sudo apt-get install gcc-4.8 g++-4.8

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 90
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 90


おなじく、インストール作業が終わったら「gcc-4.8」「g++-4.8」の優先順位をさげて、自動モードでシステム標準の「gcc-7」「g++-7」が使われるように設定をもどしておきます。

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 48
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 48


2. 「CUDA 8.0」インストール

CUDA Toolkit 8.0 - Feb 2017」ページで「Linux」「x86_64」「Ubuntu」「16.04」「runfile (local)」を選択し、「Download Installers for Linux Ubuntu 16.04 x86_64」タブを開きます。
そこの表示にしたがって、「Base Installer」の「ダウンロード」ボタンをクリックして「cuda_8.0.61_375.26_linux.run」を、「Patch 2 (Released Jun 26, 2017)」の「ダウンロード」ボタンをクリックして「cuda_8.0.61.2_linux.run」をダウンロードします。
まずは、ベースインストーラのrunファイルを解凍し、ツールキット、サンプル、ドライバそれぞれのrunファイルをえます。

$ chmod +x cuda_8.0.61_375.26_linux.run
$ ./cuda_8.0.61_375.26_linux.run --extract=absolute_pass_to_the_target_directory
$ cd absolute_pass_to_the_target_directory
$ ls
cuda-linux64-rel-8.0.61-21551265.run
cuda-samples-linux-8.0.61-21551265.run
NVIDIA-Linux-x86_64-375.26.run


必要なファイルを取りだすため、さらにそれぞれのファイルを解凍し、ツールキットを「/usr/local/cuda-8.0」ディレクトリへ配置、サンプルを「~/NVIDIA_CUDA-8.0_Samples」ディレクトリへ配置します。

$ sudo move cuda-linux64-rel-8.0.61-21551265.run /usr/local/cuda-8.0
$ sudo /usr/local/cuda-8.0/cuda-linux64-rel-8.0.61-21551265.run --tar mxvf # ツールキットファイルを「/usr/local/cuda-8.0」に展開。
$ mv cuda-samples-linux-8.0.61-21551265.run /home/username/NVIDIA_CUDA-8.0_Samples
$ ~/NVIDIA_CUDA-8.0_Samples/cuda-samples-linux-8.0.61-21551265.run --tar mxvf # サンプルファイルを「~/NVIDIA_CUDA-8.0_Samples」に展開。
$ ./NVIDIA-Linux-x86_64-375.26.run -x #ドライバファイル抽出。今回は不要。


ここまでの作業が完了したら、以下のコマンドを実行して、「/usr/local/cuda」からリンクをはっておきます。

$ sudo ln -s /usr/local/cuda-8.0 /usr/local/cuda


そして、「~/.bashrc」に以下二行を追加して、パスをとおしておきます。

export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}


いくつかライブラリがたりない(「libGLU.so」「libX11.so」「libXi.so」「libXmu.so」「libGL.so」など)ので、必要な場合はあとで該当パッケージをインストールし、パスのとおった「/usr/lib」からライブラリファイルへシンボリックリンクをはっておけば問題ありません。

$ sudo apt-get install g++ freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libglu1-mesa libglu1-mesa-dev


つづいて「CUDA 8.0」パッチファイルも解凍し、取りだしたファイルを「/usr/local/cuda-8.0」ディレクトリの該当場所へ移動します。

$ chmod +x cuda_8.0.61.2_linux.run
$ ./cuda_8.0.61.2_linux.run --tar mxvf
$ sudo cp payload/cuda-linux64-mixed-rel-nightly/lib64/libcublan* /usr/local/cuda-8.0/lib64
$ sudo cp payload/cuda-linux64-mixed-rel-nightly/lib64/libnvblas* /usr/local/cuda-8.0/lib64


以下のコマンドを実行して、インストールした「CUDA 8.0」のバージョンが正しく表示されることを確認します。

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61


問題なければ、サンプルのビルドを実行します。
自動モードで「gcc-5」を使うよう、「update-alternatives」コマンドを使って、「gcc-5」「g++5」の優先順位をあげておきます。

$ cd ~/NVIDIA_CUDA-8.0_Samples
$ cd make


ビルド処理が終わったら、「~/NVIDIA_CUDA-8.0_Samples/bin」以下に「deviceQuery」が生成するので、それを実行してみます。
デバイスが検出され、「Result = PASS」と表示されていれば、インストールは正常に完了しています。

*****参考:必要なファイルをdebian packageから取りだす場合*****
dpkg-deb -x cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb output_dir


2. 「cuDNN 6.0 for CUDA 8.0」インストール

cuDNN Archive」ページから「Download cuDNN v6.0 (April 27, 2017), for CUDA 8.0」をクリックし、開いたタブのなかの「cuDNN v6.0 Library for Linux」をクリックして「cudnn-8.0-linux-x64-v6.0.tgz」をダウンロードします。
ダウンロードしたファイルを解凍のうえ、それぞれ適切な場所へ配置、読み込み権限をあたえておきます。

$ tar zxvf cudnn-8.0-linux-x64-v6.0.tgz
cuda/include/cudnn.h
cuda/lib64/libcudnn.so
cuda/lib64/libcudnn.so.6
cuda/lib64/libcudnn.so.6.0.21
cuda/lib64/libcudnn_static.a
$ sudo cp cuda/include/cudnn.h /usr/local/cuda-8.0/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda-8.0/lib64
$ sudo chmod a+r /usr/local/cuda-8.0/include/cudnn.h /usr/local/cuda-8.0/lib64/libcudnn*


以下のような指示がありますが、今回は「CUDA 8.0」とおなじディレクトリにインストールしたので、すでにパスはとおっています。
べつの場所にインストールした場合は、「cdDNN 6.0」ライブラリを設置したディレクトリへ、あらためてパスをとおしておく必要があります。

LINUX
cd /lib
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
Add to your build and link process by adding -I/include to your compile line and -L/lib -lcudnn to your link line.


「cuDNN」ライブラリの配置が完了したら、以下のコマンドで正しく配置されているかどうか確認します。

$ cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
#define CUDNN_MAJOR 6
#define CUDNN_MINOR 0
#define CUDNN_PATCHLEVEL 21
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)

#include "driver_types.h"


インストールしたバージョンが正しく表示されれば、問題ありません。
最後に、debian packageからサンプルを抽出、ビルドしてみます。
自動モードで「gcc-5」を使うよう、「update-alternatives」コマンドを使って、「gcc-5」「g++5」の優先順位をあげておきます。
ビルド処理が終わったら、「~/cudnn_samples_v6/mnistCUDNN」以下に「mnistCUDNN」が生成するので、それを実行してみます。
「Test passed!」と表示が出れば、「cuDNN 6.0」のインストール作業は完了しています。

$ dpkg-deb -x libcudnn6-doc_6.0.21-1+cuda8.0_amd64.deb ./
$ cp -r usr/src/cudnn_samples_v6/ ~/
$ cd ~/cudnn_samples_v6/mnistCUDNN
$ make clean && make
$ ./mnistCUDNN
...
Test passed!



参考ウェブページ一覧表(順不同)

https://devtalk.nvidia.com/default/topic/1032269/cuda-9-gcc-7-compatibility-with-nvcc/
https://medium.com/@Inoryy/compiling-pytorch-4-0-on-ubuntu-17-10-with-cuda-9-0-and-python-3-6-6769a0df56d5
https://github.com/nathtest/Tutorial-Ubuntu-18.04-Install-Nvidia-driver-and-CUDA-and-CUDNN-and-build-Tensorflow-for-gpu
https://stackoverflow.com/questions/50213089/linking-error-with-gcc-g-7-3-0-on-ubuntu-18-04/50232797
posted by hatakazu at 15:28| Comment(0) | Linuxとか | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください