【機械学習】Tensorflow・CUDA・cuDNN環境づくりの手引き

機械学習やりたいけどGPU対応がややこしい…

機械学習の仕組みを勉強して、本格的にGPUで回してみるぞ!ってときに
環境構築で出ばなをくじかれてしまった、なんてこと経験したことはありませんか?

職場や研究室などでは先人がすでに環境構築をしてしまっていたので
自宅で同じ環境を作ろうにもバージョン関係がややこしくて挫折、なんてこともあると思います。

今回はそんなGPU環境構築でもう迷わないようにまとめていきたいと思います。

やることは大きく分けて4つだけ!

  1. GPUに対応した、Nvidiaドライバのインストール
  2. NvidiaドライバとTensorflowに対応した、CUDAをインストール
  3. CUDAに対応した、cuDNNをインストール
  4. PATHを通す

大事なのはこんなもんです。

1. GPUに対応した、Nvidiaドライバのインストール

まずはOSがGPUを認識してくれなきゃ何も始まりません。
公式から自分のGPUに対応したドライバをDLし、インストールしてください。
指示通りに進めばDLできると思います。

https://www.nvidia.co.jp/Download/index.aspx?lang=jp

もしリモートのCUI環境にインストールする場合は、DLリンクのアドレスをコピーしておいて
sshからログインしてwgetなどで持ってくるとよいです。

またインストールの過程で、セキュアブートを切らないといけない場合があるので、
ブートメニューからOFFにしてください。

2. NvidiaドライバとTensorflowに対応した、CUDAをインストール

機械学習環境づくりで一番面倒くさい部分です。
何が面倒かというと、自分でドライバーのバージョンとTensorflowのバージョンを
それぞれ照らし合わせながらインストールするCUDAを選択しなければならないからです。

表を参考に以下のリンクからDLし、インストールしてください。

https://developer.nvidia.com/cuda-toolkit-archive

TensorflowとCUDAの対応表
(※参考元 https://www.tensorflow.org/install/source#tested_build_configurations)
現在、pip installするとtensorflow-gpu1.14.0が入りますが、CUDA10.0をインストールするかtensorflow-gpuのダウングレードをしてください。
CUDA10.1に対応しているtensorflow-gpuはありません、間違えてインストールした場合はダウングレードしてください。

バージョン Python バージョン コンパイラ ビルドツール cuDNN CUDA
tensorflow_gpu-1.13.1 2.7、3.3-3.6 GCC 4.8 Bazel 0.19.2 7.4 10.0
tensorflow_gpu-1.12.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.11.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.10.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.9.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.11.0 7 9
tensorflow_gpu-1.8.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.10.0 7 9
tensorflow_gpu-1.7.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.9.0 7 9
tensorflow_gpu-1.6.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.9.0 7 9
tensorflow_gpu-1.5.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.8.0 7 9
tensorflow_gpu-1.4.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.5.4 6 8
tensorflow_gpu-1.3.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.4.5 6 8
tensorflow_gpu-1.2.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.4.5 5.1 8
tensorflow_gpu-1.1.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.4.2 5.1 8
tensorflow_gpu-1.0.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.4.2 5.1 8

NvidiaドライバとCUDAの対応表
(※参考元 https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#major-components__table-cuda-toolkit-driver-versions)

 

 
CUDA Toolkit Linux x86_64 Driver Version Windows x86_64 Driver Version
CUDA 10.1 (10.1.105 general release, and updates) >= 418.39 >= 418.96
CUDA 10.0.130 >= 410.48 >= 411.31
CUDA 9.2 (9.2.148 Update 1) >= 396.37 >= 398.26
CUDA 9.2 (9.2.88) >= 396.26 >= 397.44
CUDA 9.1 (9.1.85) >= 390.46 >= 391.29
CUDA 9.0 (9.0.76) >= 384.81 >= 385.54
CUDA 8.0 (8.0.61 GA2) >= 375.26 >= 376.51
CUDA 8.0 (8.0.44) >= 367.48 >= 369.30
CUDA 7.5 (7.5.16) >= 352.31 >= 353.66
CUDA 7.0 (7.0.28) >= 346.46 >= 347.62

3. CUDAに対応した、cuDNNをインストール

こちらはDLが面倒です。NvidiaDeveloperに登録する必要があります。面倒くさい(2回目)
またインストールもLinuxの場合手動インストールです。

https://developer.nvidia.com/rdp/cudnn-download

インストールしたCUDAのバージョンに合わせて指示に従ってDLしてください。
またwgetでDLする場合、ログイン情報を付け加えないといけないので無難に別GUIマシンで
DLしてからsftpなどで送るのが楽です。

このとき、Windows上でDLしたときに謎の拡張子に代わってしまう場合があるので、
リモートに送ったら拡張子をtarに変更してから解凍してください。

手動インストール方法

解凍したら以下の構造のディレクトリになります。(CUDA10.0, Linuxの場合)

  • cuda/
    •  include/
      • cudnn.h
    • lib64
      • libcudnn.so
      • libcudnn.so.7
      • libcudnn.so.7.6.3
      • libcudnn_static.a
    • NVIDIA_SLA_cuDNN_Support.txt

またCUDAをインストールしたときに、/usr/local/cuda
/usr/local/cuda-x.xができています(x.xはインストールしたCUDAバージョン)

それぞれのディレクトリ内にinclude/とlib64/があるので、
解凍したものをコピーしてそれぞれのディレクトリに入れてください。

4. PATHを通す

あとはPATHを通すだけです。
忘れがちな作業ですが、これをしないとCUDAが使えません。

~/bashrcなどに追加してください。全ユーザーに適応させる場合、/etc/profileなどに追加してください。

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

作業完了、あとはNvidiaドライバ、CUDA、cuDNNの動作確認

Nvidiaドライバの動作確認

以下のコマンドが実行できればインストールに成功しています。

nvidia-smi

CUDAの動作確認

以下のコマンドが実行できればインストールに成功しています。

nvcc -V

cuDNNの動作確認

Pythonコードが実行でき、ライブラリのNotFoundエラーが出ず、
list_local_devices()の実行結果にGPUの文字があれば成功しています。

python
>>> from tensorflow.python.client import device_lib
>>> device_lib.list_local_devices()

list_local_devices()実行時にライブラリのNotFoundエラーが起きた場合、

  1. PATHが正しく通っていない
  2. tensorflow-gpuがCUDAに対応していない

などが考えられます。
bashrcを変更したり、バージョンの見直しをしてください。

その他のエラー

tensorflowのimportでエラー

tensorflow-gpuとnumpyのバージョンがあっていない可能性が高いです。
デフォルトでpip install numpyするとバージョン1.17が入りますが、
tensorflow-gpuは1.16までしか対応していません。
以下のコマンドで1.17をアンインストールし、1.16をインストールしてください。

pip uninstall numpy
pip install numpy==1.16

Fedora30でそもそも画面が移らない

Fedora30 WorkstationはデフォルトでGPUドライバがインストールされていません。
そのためか、GPUがxserverに悪さして画面が乱れてしまいます。

解決方法としては、まず物理的にGPU自体を引っこ抜いてから(ケーブルだけ抜いても無理でした)
OSインストールし、GPUドライバをインストールしてから再度GPUを差して起動してみてください。

またFedora30は現時点でどのバージョンのCUDAも対応していません。
一応確認されている不具合はgccのバージョン違いだけらしいので、
gccのダウングレードをしておくといいでしょう。