インストールするコンピュータの仕様は以下のとおり。
--
Dell Inspiron 14 7472 Core i7モデル 18Q42P
OS:Ubuntu 20.04 LTS 日本語 Remix
CPU:インテル Core i7-8550U (4Mキャッシュ、最大4.0GHz)
GPU:NVIDIA GeForce MX150 GDDR5 2GB
メモリー:8GB DDR4 2400MHz(最大16GB)
保存装置:128GB SSD (Windows10 Home 64bit) + 1TB 5400rpm HDD (Ubuntu 20.04 LTS 日本語 Remix)
--
2. 構築すべき「CUDA」環境
Ubuntu 18.04用のファイルを使ってUbuntu 20.04上に「CUDA 10.0」+「TensorRT 7.0.0」環境を構築する。
・Ubuntu 20.04 LTS
・CUDA 10.0
・cuDNN 7.6.5
・NCCL 2.6.4
・TensorRT 7.0.0
3. NVIDIA製GPU「GeForce MX150」ドライバのインストール
今回作業するコンピュータはNVIDIA製GPU「GeForce MX150」を搭載しているので、まずはこのGPUに対応する最新のドライバをインストールします。
じっさいの作業はむずかしくありませんが、基本的な考えかたを学ぶうえで、「Ubuntu 16.04 LTSにNVIDIA製ドライバーをインストールする3つの方法」がたいへん参考になりました。
「Ubuntu 20.04 LTS 日本語 Remix」で「GeForce MX150」用ドライバをインストールするには、「ソフトウェアとアップデート」を起動し、「追加のドライバー」タブを開きます。
すこし時間がかかって、使用できるドライバの一覧が表示されます。
型式が「NVIDIA Corporation: GP108M [GeForce MX150]」と表示されているのを確認して、いくつか選択肢が示されたら基本的に最新のものを選択します。
2020年6月2日現在の最新バージョンは「440」なので、「NVIDIA driver metapackageをnvidia-driver-440から使用します(プロプライエタリ、検証済み)」ボタンにチェックをいれます。
その状態で「変更の適用」をクリックすると、インストール処理がはじまりますが、終わるまでじゃっかん時間がかかります。
インストール処理が終わったら、「閉じる」をクリックして「ソフトウェアとアップデート」ウインドウを閉じてからシステムを再起動すると、標準の「Nouveau」ドライバではなくNVIDIA製「nvidia-440」ドライバで立ちあがります。
ターミナルをひらいて、「$ nvidia-smi」コマンドをたたいてみて、ドライバのバージョンやGPUの型式が正しく表示されることを確認しておきます。
$ nvidia-smi
デスクトップ関連の設定は、「$ nvidia-settings」コマンドを使って、グラフィカルにおこなうことができます。
$ nvidia-settings
設定内容は「~/.nvidia-settings-rc」に保存され、ログインのたびに「/etc/xdg/autostart/nvidia-settings-autostart.desktop」がこの設定内容を読みこんで、反映させる仕組みです。
NVIDIA製「nvidia-440」ドライバのドキュメント類は、「/usr/share/doc/nvidia-driver-440/index.html」に保管されています。
インストールしたNVIDIA製ドライバのバージョンは、以下のコマンドで確認できます。
$ cat /proc/driver/nvidia/version
4. 「CUDA 10.0」インストールまえの準備作業
「CUDA 10.0」をインストールする方法はいくつかありますが、NVIDIAウェブサイト「CUDA Toolkit 10.0 Archive」ページからUbuntu18.04用runファイル「cuda_10.0.130_410.48_linux.run」をダウンロードして、手動で「CUDA 10.0」をインストールすることにしました。
やってみてからの感想ですが、いろいろなところで互換性の問題がおこりやすい「CUDA」関連ライブラリについては、結果的にrunファイルでインストールして手動でバージョンを管理するのが一番いいと思います。
パッケージの競合という問題がないので、複数のバージョンをインストールしたうえで、パスとショートカットでバージョンを切りかえて使う、ということができるのもおおきなメリットといえます。
GPUドライバのみ別途Ubuntuパッケージで管理したうえで、ツールキットをrunファイルからインストールするだけなら、すべての処理をグラフィカルログイン状態で完了でき、システムに致命的なダメージをあたえかねないむずかしいプロセスもありません。
「NVIDIA CUDA Installation Guide for Linux」ページの指示にしたがって、「CUDA 10.0」をインストールするまえに必要な確認作業、準備作業をおこないます。
「CUDA 10.0」に対応したGPUの確認。
$ lspci | grep -i nvidia
01:00.0 3D controller: NVIDIA Corporation GP108M [GeForce MX150] (rev a1)
Linux OSの対応状況確認。「Ubuntu 20.04 LTS」は対応ディストリビューションのリストにはいっていませんが、このまますすめていきます。
$ uname -m && cat /etc/*release
x86_64
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04 LTS"
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
コンパイラの存在およびバージョンを確認。「CUDA 10.0」は「Ubuntu 20.04 LTS」には対応しておらず、「Ubuntu 20.04 LTS」標準の「gcc-9」と の互換性に問題があります。
$ gcc --version
gcc-9 (Ubuntu 9.3.0-10ubuntu2) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
そのため、あらかじめ互換性のある「gcc-7」をインストールし、「CUDA-10.0」ライブラリのインストール作業および「CUDA-10.0」環境でのビルド作業では優先的に「gcc-7」が使用されるように設定します。
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 90
$ sudo apt-get install gcc-7 g++-7
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 100
こうした「gcc-7」が必要なインストール作業が終わったら、かならず「gcc-7」「g++-7」の優先順位をさげて、自動モードでシステム標準の「gcc-9」「g++-9」が使われるように設定をもどしておきます。
$ 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
Linuxカーネルのバージョン確認。
$ uname -r
5.4.0-33-generic
Linuxカーネルのヘッダと開発キットをインストール。
$ sudo apt-get install linux-headers-$(uname -r)
5. 「CUDA 10.0」のインストール
「CUDA Toolkit 10.0 Archive」ページで「Linux」「x86_64」「Ubuntu」「18.04」「runfile (local)」を選択し、「Download Installers for Linux Ubuntu 18.04 x86_64」タブを開きます。
「Base Installer」「Patch 1 (Released May 10, 2019)」それぞれの「Download」ボタンを押して、「cuda_10.0.130_410.48_linux.run」「cuda_10.0.130.1_linux.run」をダウンロードします。
ファイルをダウンロードしたディレクトリへ移動し、ベースインストーラのrunファイルに実行権限を付与してから、「sudo」で実行します。
長い使用許諾書を「Enter」キーを押して全部表示してから「accept」し、「Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48?」には、すでに最新ドライバ「440」をインストールしているので「no」と回答します。
「Install the CUDA 10.0 Toolkit?」に「yes」と回答し、「/usr/local/cuda-10.0」にライブラリをインストールのうえ「/usr/local/cuda」からシンボリックリンクをはり、動作確認のためのサンプルファイルは「~/NVIDIA_CUDA-10.0_Samples」にコピーする設定にします。
$ chmod +x cuda_10.0.130_410.48_linux.run
$ sudo ./cuda_10.0.130_410.48_linux.run
Do you accept the previously read EULA?
accept/decline/quit: accept
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48?
(y)es/(n)o/(q)uit: no
Install the CUDA 10.0 Toolkit?
(y)es/(n)o/(q)uit: yes
Enter Toolkit Location
[ default is /usr/local/cuda-10.0 ]:
Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: yes
Install the CUDA 10.0 Samples?
(y)es/(n)o/(q)uit: yes
Enter CUDA Samples Location
[ default is /home/username ]:
Installing the CUDA Toolkit in /usr/local/cuda-10.0 ...
Installing the CUDA Samples in /home/username ...
Copying samples to /home/username/NVIDIA_CUDA-10.0_Samples now...
Finished copying samples.
===========
= Summary =
===========
Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-10.0
Samples: Installed in /home/username
Please make sure that
- PATH includes /usr/local/cuda-10.0/bin
- LD_LIBRARY_PATH includes /usr/local/cuda-10.0/lib64, or, add /usr/local/cuda-10.0/lib64 to /etc/ld.so.conf and run ldconfig as root
To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-10.0/bin
Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-10.0/doc/pdf for detailed information on setting up CUDA.
***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 384.00 is required for CUDA 10.0 functionality to work.
To install the driver using this installer, run the following command, replacingwith the name of this run file:
sudo.run -silent -driver
Logfile is /tmp/cuda_install_4325.log
ベースインストーラのインストール処理が終わったら、パッチをあてていきます。
「CUDA 10.0 Toolkit」をインストールしたディレクトリ「/usr/local/cuda-10.0」をターゲットに、パッチファイルを実行するだけです。
chmod +x cuda_10.0.130.1_linux.run
$ sudo ./cuda_10.0.130.1_linux.run
Do you accept the previously read EULA?
accept/decline/quit: accept
Enter CUDA Toolkit installation directory
[ default is /usr/local/cuda-10.0 ]:
Installation complete!
Installation directory: /usr/local/cuda-10.0
ここまでの作業が終わったら、「~/.bashrc」に以下二行を追加して、パスをとおしておきます。
export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
あるいは、以下のようなかたちで「CUDA_HOME」変数を使ってもO.K.です。
# CUDA 10.0 path
export CUDA_HOME="/usr/local/cuda-10.0"
export PATH=$PATH:$CUDA_HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_HOME/lib64:/usr/lib/x86_64-linux-gnu/
export CPATH=$CPATH:$CUDA_HOME/include
いったんターミナルを閉じるか、「$ source ~/.bachrc」コマンドを実行して、パスの変更を反映させます。
いくつかライブラリがたりない(「libGLU.so」「libX11.so」「libXi.so」「libXmu.so」「libGL.so」など)ことがあるので、必要な場合はあとで該当パッケージをインストールし、パスのとおった「/usr/lib」からライブラリファイルへシンボリックリンクをはっておけば問題ありません。
$ sudo apt install g++ freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libglu1-mesa libglu1-mesa-dev
ここまででインストール作業は完了です。
以下のコマンドを実行して、インストールした「CUDA 10.0」のバージョンが正しく表示されることを確認します。
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:01_CDT_2018
Cuda compilation tools, release 10.0, V10.0.130
問題なければ、サンプルのビルドを実行します。
$ cd ~/NVIDIA_CUDA-10.0_Samples
$ make
ビルド処理が終わったら、「~/NVIDIA_CUDA-10.0_Samples/bin/x86_64/linux/release/」以下に「deviceQuery」が生成するので、それを実行してみます。
$ ~/NVIDIA_CUDA-10.0_Samples/bin/x86_64/linux/release/deviceQuery
デバイスが検出され、「Result = PASS」と表示されていれば、インストールは正常に完了しています。
NVIDIA公式インストール手順書にも記載がありますが、「CUDA Toolkit 10.0」をrunfileを使ってインストールしたときは、以下のスクリプトを実行することでアンインストールできます。
$ sudo /usr/local/cuda-10.0/bin/uninstall_cuda_10.0.pl
なお、今回のインストール方法では必要ありませんが、NVIDIA製ドライバをrunfileを使ってインストールしたときのアンインストールコマンドは以下のとおりです。
$ sudo /usr/bin/nvidia-uninstall
6. 「cuDNN 7.6.5」のインストール
基本的には、NVIDIA公式の「cuDNN Installation Guide」の指示にしたがって、インストール作業をすすめていきます。
まず「cuDNN Download」ページへいき、必要におうじてログインしたうえで、「I Agree To the Terms of the cuDNN Software License Agreement」にチェックをいれます。
ここで「Download cuDNN」をクリックして、「cuDNN Download」ページへ飛び、「Download cuDNN v7.6.5 (November 5th, 2019), for CUDA 10.0」をクリックしてタブをひらきます。
一覧表のなかから「cuDNN Library for Linux」をクリックして、「cudnn-10.0-linux-x64-v7.6.5.32.tgz」をダウンロードします。
ダウンロードしたディレクトリへ移動してファイルを解凍のうえ、「CUDA 10.0」ライブラリをインストールした「/usr/local/cuda-10.0」ディレクトリ以下に配置し、読み込み権限をあたえておきます。
$ tar -xzvf cudnn-10.0-linux-x64-v7.6.5.32.tgz
cuda/include/cudnn.h
cuda/NVIDIA_SLA_cuDNN_Support.txt
cuda/lib64/libcudnn.so
cuda/lib64/libcudnn.so.7
cuda/lib64/libcudnn.so.7.6.5
cuda/lib64/libcudnn_static.a
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
「cuDNN」ライブラリの配置が完了したら、以下のコマンドで正しく配置されているかどうか確認します。
$ cat /usr/local/cuda/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"
インストールしたバージョン「7.6.5」が正しく表示されれば、問題ありません。
最後に、debian package「cuDNN Code Samples and User Guide for Ubuntu18.04 (Deb)」をクリックしてダウンロードした「libcudnn7-doc_7.6.5.32-1+cuda10.0_amd64.deb」からサンプルを抽出、ビルドしてみます。
$ dpkg-deb -x libcudnn7-doc_7.6.5.32-1+cuda10.0_amd64.deb ./
$ cp -r usr/src/cudnn_samples_v7/ ~/
$ cd ~/cudnn_samples_v7/mnistCUDNN
$ make clean && make
$ ./mnistCUDNN
.....
Test passed!
「Test passed!」と表示が出れば、「cuDNN 7.6.5」のインストール作業は完了しています。
7. 「NCCL 2.6.4」のインストール
「NCCL 2.6.4」をインストールするには、NVIDIA公式の「NCCL 2.6.4 Installation Guide」にしたがって、作業をすすめます。
まず「NVIDIA Collective Communications Library (NCCL) Download Page」へいき、必要におうじてログインしたうえで、「I Agree To the Terms of the Software License Agreement」にチェックをいれます。
「Download NCCL v2.6.4, for CUDA 10.0, March 26,2020」をクリックしてタブをひらき、「O/S agnostic local installer」をクリックして、「nccl_2.6.4-1+cuda10.0_x86_64.txz」をダウンロードします。
ダウンロードしたディレクトリに移動したら、ファイルを解凍のうえ、「/usr/local/nccl-2.6」ディレクトリ以下へ配置します。
$ tar xvf nccl_2.6.4-1+cuda10.0_x86_64.txz
nccl_2.6.4-1+cuda10.0_x86_64/include/
nccl_2.6.4-1+cuda10.0_x86_64/include/nccl_net.h
nccl_2.6.4-1+cuda10.0_x86_64/include/nccl.h
nccl_2.6.4-1+cuda10.0_x86_64/lib/
nccl_2.6.4-1+cuda10.0_x86_64/lib/pkgconfig/
nccl_2.6.4-1+cuda10.0_x86_64/lib/pkgconfig/nccl.pc
nccl_2.6.4-1+cuda10.0_x86_64/lib/libnccl.so
nccl_2.6.4-1+cuda10.0_x86_64/lib/libnccl.so.2
nccl_2.6.4-1+cuda10.0_x86_64/lib/libnccl_static.a
nccl_2.6.4-1+cuda10.0_x86_64/lib/libnccl.so.2.6.4
nccl_2.6.4-1+cuda10.0_x86_64/LICENSE.txt
$ sudo cp -r nccl_2.6.4-1+cuda10.0_x86_64 /usr/local/nccl-2.6
最後に、「.bashrc」に以下の行を追加し、「/usr/local/nccl-2.6」へパスをとおしておきます。
export NCCL_ROOT="/usr/local/nccl-2.6"
export CPATH=$CPATH:$NCCL_ROOT/include
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NCCL_ROOT/lib/
export LIBRARY_PATH=$LIBRARY_PATH:$NCCL_ROOT/lib/
いったんターミナルを閉じるか、「$ source ~/.bachrc」コマンドを実行して、パスの変更を反映させます。
8. 「TensorRT 7.0.0」インストール
「
NVIDIA TensorRT 7.x Download」ページへいき、必要におうじてログインしたうえで、「I Agree To the Terms of the Software License Agreement」にチェックをいれます。
「Tar File Install Packages」リストのなかの「TensorRT 7.0.0.11 for Ubuntu 18.04 and CUDA 10.0 tar package」をクリックして、「TensorRT-7.0.0.11.Ubuntu-18.04.x86_64-gnu.cuda-10.0.cudnn7.6.tar.gz」ファイルをダウンロードします。
ダウンロードしたディレクトリへ移動して、ファイルを解凍のうえ、適当なディレクトリ(ここでは「/usr/local/TensorRT-7.0.0」)に配置します。
$ tar xzvf TensorRT-7.0.0.11.Ubuntu-18.04.x86_64-gnu.cuda-10.0.cudnn7.6.tar.gz
$ sudo cp -r TensorRT-7.0.0.11 /usr/local/TensorRT-7.0.0
「.bashrc」に以下の行を追加し、「TensorRT-7.0.0」ディレクトリへパスをとおしておきます。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/TensorRT-7.0.0/lib
あとは、NVIDIA公式の「TensorRT 7.0.0 Installation Guide」の手順どおり、「Python TensorRT」「Python UFF」「Python graphsurgeon」パッケージをインストールします。
「TensorRT 7.0.0」をインストールしたディレクトリの「samples/sampleMNIST/」へいき、サンプルをmakeしてみます。
「TensorRT 7.0.0」をインストールしたディレクトリの「bin」に「sample_mnist」ができているので、これを実行して「TensorRT 7.0.0」が正しくインストールされていることを確認します。
この生成したサンプルファイルをきちんと動かすためには、あらかじめ「data/mnist/download_pgms.py」を実行しておく必要があるかもしれません。
9. 「CUPTI」パス登録
「CUPTI」は「CUDA 10.0 Toolkit」にふくまれているため、あらためてインストールする必要はありませんが、パスをとおしておく必要はあります。
「.bashrc」に以下の一行を追加し、いったんターミナルを閉じるか「$ source ~/.bachrc」コマンドを実行するかして、パスの変更を反映させます。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-10.0/extras/CUPTI/lib64
以上で、「Ubuntu 20.04 TLS」上に「CUDA 10.0」+「TensorRT 7.0.0」環境を構築する作業は完了です。
今回は「TensorRT 7.0.0」環境が必要だったため、動作要件となっている「CUDA 10.0」+「cuDNN 7.6.5」環境の構築をめざした記述になっていますが、 より広い意味で現時点で一般性の高い「Ubuntu 20.04 LTS」+「CUDA 10.0」+「cuDNN 7.6.5」+「NCCL 2.6.4」という環境を構築するための手引きとしてもご参照いただければ幸甚です。
上記手順にしたがってインストールすれば、だいたいうまくいくと思いますが、「CUDA」の動作に問題が発生するときは以下のパス設定(上記手順のなかで設定した「CUDA」関連ライブラリに関係する部分のみ)を再確認してみてください。
$ printenv
LD_LIBRARY_PATH=:/usr/local/cuda-10.0/lib64:/usr/local/cuda-10.0/extras/CUPTI/lib64:/usr/local/nccl-2.6/lib/:/usr/local/TensorRT-7.0.0/lib
CPATH=:/usr/local/cuda-10.0/include:/usr/local/nccl-2.6/include
PATH=/usr/local/cuda-10.0/bin
参考ウェブページ一覧表(順不同)