コンピュータ囲碁プログラムの「
GLOBIS-AQZ」が「
GitHub」上でオープンソース化されたのを機に、自宅コンピュータの「CUDA」環境を一新することにしました。
Linux用およびWindows用の実行バイナリも配布されているので、基本的にはきちんと要件を満たす「CUDA」環境を構築できれば、問題なく「GLOBIS-AQZ」を動かすことができるはずです。
1. 前提となる環境
インストールするコンピュータの仕様は以下のとおり。
--
Dell Inspiron 14 7472 Core i7モデル 18Q42P
OS:Ubuntu 18.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 18.04 LTS 日本語 Remix)
--
2. 構築すべき「CUDA」環境
まずは目標設定ですが、最終的には「GLOBIS-AQZ」とFacebook「ELF OpenGo」を動かしたいと思っているので、それらが動作する「CUDA」環境を構築するということになります。
まず、
「GLOBIS-AQZ」GitHubレポジトリの記述によれば、「GLOBIS-AQZ」の動作条件は以下のとおりです。
・OS : Windows 10, Linux (64-bit)
・GPU : Nvidia's GPU (Compute Capability >3.0)
・CUDA Toolkit 10.0 or 10.2
・TensorRT 7.0.0
「ELF OpenGo」のほうは、
「ELF Opengo」GitHubレポジトリの記載によれば、動作保証しているのは以下の条件です。
・Ubuntu 18.04
・Python 3.7
・GCC 7.3
・CUDA 10.0
・CUDNN 7.3
・NCCL 2.1.2
とりあえずこれで動かしていたので間違いないというだけで、リソースの制限もあるので互換性の検証はしていないそうなので、じっさいにはもっとゆるやかな条件で動作するはずです。
「GLOBIS-AZQ」を動かすためには「TensorRT 7.0.0」の動作要件を満たす必要があるので、「Ubuntu 18.04」に「CUDA 10.0」+「cuDNN 7.6.5」+「NCCL 2.6.4」をインストールして、そこにさらに「TensorRT 7.0.0」を導入するという方針でいきたいと思います。
いずれ試行錯誤することになるとは思いますが、とりあえず以下の構成を基本に、作業をはじめてみることにしました。
・Ubuntu 18.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 18.04 LTS 日本語 Remix」で「GeForce MX150」用ドライバをインストールするには、「ソフトウェアとアップデート」を起動し、「追加のドライバー」タブを開きます。
すこし時間がかかって、使用できるドライバの一覧が表示されます。
型式が「NVIDIA Corporation: GP108M [GeForce MX150]」と表示されているのを確認して、いくつか選択肢が示されたら基本的に最新のものを選択します。
2020年5月14日現在の最新バージョンは「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 18.04 LTS」は対応ディストリビューションのリストにはいっているので、このまますすめていきます。
$ uname -m && cat /etc/*release
x86_64
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"
VERSION_ID="18.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=bionic
UBUNTU_CODENAME=bionic
コンパイラの存在およびバージョンを確認。「CUDA 10.0」は「Ubuntu 18.04 LTS」に対応していて、「gcc-7」と 互換性があるので問題ありません。
$ gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 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.
Linuxカーネルのバージョン確認。
$ uname -r
4.15.0-99-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, replacing with 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」インストール
「GLOBIS-AZQ」では「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 18.04 TLS」上に「CUDA 10.0」+「TensorRT 7.0.0」環境を構築する作業は完了し、「GLOBIS-AQZ」を導入する準備がととのったことになります。
最初から「GLOBIS-AZQ」を動かすことが目的なので、動作要件となっている「CUDA 10.0」+「TensorRT 7.0.0」環境の構築をめざした記述になっていますが、 より広い意味で現時点で一般性の高い「Ubuntu 18.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
参考ウェブページ一覧表(順不同)