コミケのカタログで遊ぶの巻 その3 GPU&TensorFlow編

序文

コミケのサークル画像で更に遊ぶ為に、Deep Learningの準備って事で一通り書いてみる。

目的

Windows環境でNVidiaのGPUを使用するのを前提としてTensorFlowのインストールまで書く。
TensorFlowのサイトに行くと日本語で丁寧に書いてあるので、基本的には問題は少ない気がします。
しかし、嵌まる所もあるので、そこを補足しようと思います。

計画

残念な事にTensorFlowの各Version毎に依存するソフトウェアのバージョンが書いてあるわけではないです。
案外とざっくり書いてあります。
細かすぎるのも困るんですが。

ホームページに書いてあるのはTensorFlow Ver2の環境が書いてあるので、逆らわずVer2を入れます。
と、言ってもリリースヒストリーには、[2.3.0][2.2.0][2.1.1][2.1.0][2.0.2][2.0.1]もあります。
これで後々嵌まるのですが、それは後で。

文章を読む限りでは、TensorFlow V2.1.0以降はCUDA V10.1ってのが一番断定的。
よって、これを基準に進める事にします。

Visual C++ Redistributable Packages

はじめに嵌まる所を先に書いてしまいます。
TensorFlowの説明には、

Windows 7 以降(64 ビット)、Python 3 のみ

Visual Studio 2015、2017、および 2019 用 Microsoft Visual C++ 再頒布可能パッケージ

って書いてありますが、TensorFlow Ver2.1以降は”2019 用 Microsoft Visual C++ 再頒布可能パッケージ”が必要です。
2017用が入ってるので問題無いだろうと思っていると、「ImportError: DLL load failed:」と怒られます。

なので、”2019 用 Microsoft Visual C++ 再頒布可能パッケージ”をインストールしておきます。
これは重要です。

Python

これを読まれている方は既にPythonは入ってると思いますが、Ver3.5-3.7と指定があるので、入れてない場合は入れる。
TensorFlowは” 64 ビットシステムでテストされ、サポート”と書いてあるので、64Bit版をインストールしてください。
ここは方々で書かれていますし、NEXTボタン連打でOKです。

VirtualEnv

作成したいプログラムによって、必要なPythonのパッケージや依存性が違ってて困る事があります。
「Foo Ver3を使う時にはBar Ver4が必要だが、Hoge Ver2にはFoo Ver2が必要」
こういう場合ですね。
そこで、プログラム毎に環境を作り分けます。
他の言語では、プロジェクトやソリューションがあるので、あんまりこういう事はないかもです。

まずインストール

pip install virtualenv

次の仮想環境の作成

virtualenv [hoge]

仮想環境に入る

.[hoge]\Scripts\Activate

仮想環境から出る

deactivate

なんですが、仮想環境から出る場合には、DOS窓を閉じてしまっても良いかと。
上記例では現在のディレクトリに[hoge]ディレクトリが作成されますので、作成前に都合の良いディレクトリに移動すればOKです。

NVidia GPU Driver

グラフィックボードのドライバーバージョンのチェックです。
逆に言えば、ゲームやってるからって、下手にバージョンアップとかはしない方が無難かもです。
TensorFlowのマニュアルにはCUDA V10.1はNVidia GPU Driver 418.x以降と書いてあるので、まずはそれをチェックします。

一番手っ取り早いは、「NVIDIAコントロールパネル」ってソフトがスタートメニューに入ってると思うので、それを立ち上げればVerは表示されます。
こんな感じ。

418.x以降ならOKです。

CUDAツールキット

TensorFlow V2.1.0以降にするって決めたので、CUDA V10.1を入れる必要があります。
と言っても、Ver10.1も1st Release,Update1,Update2と3種類ありますが、Update2を入れます。
バグフィクスされてるだろうからってだけの理由です。
普通にダブルクリックでインストールすればOKです。
私の場合、Visual Studio Integration,Driver Componentsはチェックしませんでした。
Driverは現在のDriverのが新しかったし、自宅でCUDAを使用してVisual Studioでアプリ開発の予定もなかったから。
結果、こんなディレクトリ構成になってると思います。

CUDA
 v10.1
 bin
 doc
 extras
 include
 lib
 linnvvp
 nvml
 nvvm
 src
 tools

CUDAツールキットのインストールで、CUPTIもインストールされています。
\extras\CUPTI\がある事を確認しておきましょう。

cuDNN SDK

Ver7.6以降とあります。
最新がそれでしたので、現在の所は迷う事は無かろうと思います。
今回はVer7.6.5.32でした。
解凍をします。以下のような結果になるかと思います。

cuda
 bin
 include
 lib

CUDAツールキットと同じ構成なので、cuDNNのファイルをCUDAツールキットのディレクトリにコピーします。

Path & CUPTI

環境変数を設定します。
基本的に概ねインストーラーが処理してくれてます。
結果として以下のようにしますが、各自の環境に合わせてください。
以下は、どノーマル設定です。

CUDA_PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1
CUDA_PATH_V10_1=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1
CUDNN_PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1
NVCUDASAMPLES10_1_ROOT=C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.1
NVCUDASAMPLES_ROOT=C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.1
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin;
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\libnvvp;
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;
C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;
C:\Program Files\NVIDIA Corporation\Nsight Compute 2019.4.0\;
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\CUPTI\lib64;

ここでCUPTIにPathを通す事を忘れがちなので、要注意です。

TensorFlow

ここまで来れば、もう8割ほど終わってます。
TensorFlowをインストールします。
もう忘れていると思いますが、ここで仮想環境に入る事を忘れないようにしましょう。

.[hoge]\Scripts\Activate
pip install tensorflow

実はここで嘘を書いてます。
と言うのも、この段階で”2019 用 Microsoft Visual C++ 再頒布可能パッケージ”を入れ忘れており、「ImportError: DLL load failed:」に悩まされていました。
そこで、TensorFlow Ver2.0.2まで一度下ってます。
それだとエラーは発生しませんでしたが、”TensorFlow V2.1.0以降はCUDA V10.1”って制約に引っかかってるので、暫し考えてた次第です。
なので、実際にはVer2.1.0を入れてます。
そういう事なので・・・

pip install tensorflow==2.1.0

が正しい表記です。でもそのままVer2.3でも動くんじゃなかろうかと。

確認

以下のコマンドでGPUと表示されればグラフィックボードが認識されています。
CPUだけの表示ならば認識されてません。

python -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"

実行するとこんな感じの行が出る筈。

先ほどの「ImportError: DLL load failed:」のようなエラーの確認だけなら、以下のようにVer表示で良かろうと思います。

python -c "import tensorflow as tf; print( tf.version )"

次回

OCRをやるって言って、今回また違いますが、次回こそはOCRをやろうかと。
延期してる理由は、認識率がまだ納得いかないからなんですが。
既に十分っちゃ十分ですが、OCR後の手数が多いんで、どうしようかと。

あと、今回はTensorFlow&GPUでしたが、KerasなどはCNNの時に書こうと思ってます。