2021/12/19追記: より新しく確実な方法を書きましたので、そちらをご参照ください。これはもう古いです。こちら(Ubuntu 20.04 / 18.04 環境で CUDA 10.2, FSL 6.0.5, Tensorflow, PyTorch をセットアップする方法)になります。CUDA 10.2 ですが、他のバージョンにも容易に応用できる方法です。
Ubuntu 18.04で、ディープラーニング環境を構築したいと考えました。
いろいろネットの情報を得てトライしてみたのですが、苦戦しました。
しかし、トライしているうちに、いくつか大事なことがわかってきました。
ポイントは、以下のとおりです。
- グラフィックボードのドライバーによって使えるCUDAのバージョンが異なる
- NVIDIAはリポジトリをdebファイルで配布しているので、それを使うのがよい
- カーネルはデフォルトのものを使う
まずいちばん大事なのはこれです。ドライバーが古いものしか対応していないと、対応するCUDAのバージョンも古くなります。
これから詳しく記載します。
カーネルを最新のものを追いかけるとCUDAは動かないという事象が起きます。Ubuntu 18.04では、標準が4.15、そしてHWEが4.18です。CUDAは、この2つのバージョン(標準とHWEカーネル)だけサポートします。詳しくは、NVIDIAのページをご覧ください。
これらのコツをつかんだら、再現性が高くセットアップすることができるようになりました。
Step by Stepで示します。
- 搭載されているグラフィックボードを確認する
最初にグラフィックボードの確認を行います。
$ lspci | grep -i nvidia
lspciの結果から大文字小文字の区別なく”nvidia”というキーワードが入っている情報を検索します。
私の場合は、以下のような結果になりました。
$ lspci | grep -i nvidia 02:00.0 VGA compatible controller: NVIDIA Corporation Device 1f02 (rev a1) 02:00.1 Audio device: NVIDIA Corporation Device 10f9 (rev a1) 02:00.2 USB controller: NVIDIA Corporation Device 1ada (rev a1) 02:00.3 Serial bus controller [0c80]: NVIDIA Corporation Device 1adb (rev a1)
これだと、型番がわかりません。
このようなときは、以下のコマンドをタイプします。
sudo update-pciids
こうすると、情報がアップデートされます。
再度トライします。
$ lspci | grep -i nvidia 02:00.0 VGA compatible controller: NVIDIA Corporation TU106 [GeForce RTX 2070] (rev a1) 02:00.1 Audio device: NVIDIA Corporation TU106 High Definition Audio Controller (rev a1) 02:00.2 USB controller: NVIDIA Corporation TU106 USB 3.1 Host Controller (rev a1) 02:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU106 USB Type-C Port Policy Controller (rev a1)
今度は、GeForce RTX2070が搭載されていることがわかります。
このため、今後は、GeForce RTX2070に特化して進めていきます。
今の場合、GeForce RTX2070なので、これに対応するドライバをNVIDIAのサイトから確認します。なお、ダウンロードは必要ありません。
そうすると、今回の場合、バージョン430まで対応しているということがわかります。
グラフィックボードの対応ドライバがわかった中、GPUを使って並列計算をすることのできるCUDAの対応バージョンを確認します。これがまず第一の関門です。CUDAはNVIDIAのドライバーによって使えるバージョンが定まってきます。対応表は、CUDAのリリースノートにあるTable 1.に記載があります。
これを見ると、NVIDIAのバージョン418以上は、CUDA 10.1が使用できるようです。先程、RTX2070はドライバ430が対応ですから、CUDA 10.1を使うことにします。
ここまでわかったところで、インストールの準備を進めます。一番てっとり早い方法は、NVIDIAが提供してくれているリポジトリを使うことです。ここで注意することは、これから入手する deb ファイルは、ソフトウェアではなく、リポジトリの情報のみだということです。私は最初そこに気づかずによくわからないと思っていました。apt install で、リポジトリを設定しているんだと思ってください。ここで、CUDAのリポジトリと機械学習ライブラリのリポジトリの2つを追加します。
- CUDAリポジトリの検索
- wgetでリポジトリのdebパッケージを取得
https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ から cuda-repo-*を探します。2019年7月22日現在、Ubuntu 18.04用のCUDA 10.1のリポジトリは、cuda-repo-ubuntu1804_10.1.105-1_amd64.debでした。
以下で、CUDA 10.1のリポジトリのdebパッケージを取得します。
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.1.105-1_amd64.deb
ソフトウェアのインストールと同様に、apt installでインストールします。
sudo apt install ./cuda-repo-ubuntu1804_10.1.105-1_amd64.deb
そうすると、最後に以下のメッセージが表示されます。
The public CUDA GPG key does not appear to be installed. To install the key, run this command: sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
CUDAのパブリックGPGキーがないようだから、以下のコマンドでインストールしなさいと言われていますので、素直にそのままコピペします。
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub Executing: /tmp/apt-key-gpghome.QAwYOQT14T/gpg.1.sh --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub gpg: 鍵を'http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub'から要求 gpg: 鍵F60F4B3D7FA2AF80: 公開鍵"cudatools <cudatools@nvidia.com>"をインポートしました gpg: 処理数の合計: 1 gpg: インポート: 1
apt updateでリポジトリをアップデートします。
sudo apt update
次に、機械学習リポジトリを追加します。今度は、http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/から、nvidia-machine-learning-repo-ubuntu1804*を探します。2019年7月22日現在、nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.debでした。
これも先程と同様にしてwgetで入手し、aptで追加します。
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb sudo apt update
ubuntu-drivers というコマンドがとても便利で、上記のリポジトリ設定をした場合、このコマンドで、適切なグラフィックドライバを探すことができます。
$ ubuntu-drivers devices == /sys/devices/pci0000:00/0000:00:01.1/0000:02:00.0 == modalias : pci:v000010DEd00001F02sv000010DEsd000012FEbc03sc00i00 vendor : NVIDIA Corporation driver : nvidia-driver-418 - third-party free recommended driver : nvidia-driver-410 - third-party free driver : xserver-xorg-video-nouveau - distro free builtin
ここで、nvidia-driver-418 が recommended となっています。nvidia-430までが対応しているはずですが、ここでは、nvidia-418までしかインストールできなさそうです。しかし、上記Table 1.にあるように、バージョン418であれば、CUDA 10.1に対応できますので、このままいくことにします。
recommendedとあるものは、以下のコマンドで自動でインストールできます。
sudo ubuntu-drivers autoinstall
これができたら、再起動します。
reboot
nvidia-smi で、確認できます。
nvidia-smi Tue Jul 23 20:29:38 2019 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.67 Driver Version: 418.67 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+ | 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 RTX 2070 On | 00000000:02:00.0 On | N/A | | 12% 45C P8 10W / 175W | 58MiB / 7944MiB | 11% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | 0 1046 G /usr/lib/xorg/Xorg 56MiB | +-----------------------------------------------------------------------------+
ここまで来るとあともう少しです。
CUDAとDeep Neural Network LibraryであるcuDNNをインストールします。ポイントは、–no-install-recommends オプションを使って必要最低限のものだけインストールすることです。CUDAは cuda-10-1 とバージョンを明示します。
sudo apt install --no-install-recommends cuda-10-1 libcudnn7 libcudnn7-dev
TensorRTは、tensorflowなどで使うDeep Learningモデルを、GPU上で高速に実行できるように最適化してくれるライブラリです。ここでも –no-install-recommends オプションを使います。
sudo apt install --no-install-recommends libnvinfer5 libnvinfer-dev
最後にkerasとtensorflowを導入します。
- aptを使ったPython3関連パッケージのインストール
以下で、Ubuntuで提供されているPython3関連パッケージをインストールします。
sudo apt install build-essential pkg-config \ libopenblas-dev liblapack-dev libhdf5-serial-dev graphviz sudo apt install python3-venv python3-pip python3-dev \ python3-tk
以下で、pip3を使って、Python3系のDeep Learningに必要なパッケージをインストールします。ユーザー環境にいれることをおすすめします。
pip3 install cmake numpy scipy matplotlib pyyaml \ h5py pydot-ng opencv-python keras jupyter pillow \ python-dateutil --user
GPUを利用するtensorflowを使うために、以下をインストールします。
pip3 install tensorflow-gpu --user
これで準備は完了です。
最後にKerasのサンプルデータセットでテストします。
git clone https://github.com/fchollet/keras cd keras/ python3 examples/mnist_cnn.py
別のターミナルでnvidia-smiを実行すると、実際に使われているかを確認できます。
nvidia-smi -l 1 #1秒ごとにnvidia-smiを実行 Tue Jul 23 20:52:17 2019 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.67 Driver Version: 418.67 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+ | 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 RTX 2070 On | 00000000:02:00.0 On | N/A | | 0% 43C P8 12W / 175W | 161MiB / 7944MiB | 8% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | 0 1046 G /usr/lib/xorg/Xorg 56MiB | | 0 7604 C python3 93MiB | +-----------------------------------------------------------------------------+
GPUのプロセスに python3 があることから、python3 examples/mnist_cnn.pyがGPUを使っていることがわかります。
ここで紹介した方法は、GeForce RTX2070が搭載されているカスタムメイドのデスクトップと、Geforce MX150が搭載されているThinkPad T480sで実証しました。ともにできますので、かなりいい感じと思っています。