LoginSignup
5
3

More than 3 years have passed since last update.

ML.NET による画像分類 GPU 編

Last updated at Posted at 2020-11-09

はじめに

前回の投稿では、ML.NET 1.4.0 で、画像分類がサポートされたことと、ML.NET による画像分類の実装方法を説明しました。
また、ML.NET の画像分類は、Tensorflow.NET を介して、Tensorflow が利用されていることにも触れました。
ML.NET 1.4.0 では、画像分類のサポートに加えて GPU サポートも追加されています。サポートされている GPU の種類は、NVIDIA CUDA 互換の GPU となります。
今回は、ML.NET での画像分類において、GPU を使った学習の方法を説明します。

TensorFlow.NET ライブラリのインストール

GPU を使った学習を行うためには、TensorFlow.NET 再配布ライブラリの GPU バージョンをインストールします。
前回の投稿の ML.NET のインストール では、TensorFlow.NET ライブラリの CPU バージョンとして "SciSharp.TensorFlow.Redist" をインストールしていましたが、代わりに、TensorFlow.NET ライブラリの GPU バージョン "SciSharp.TensorFlow.Redist-Windows-GPU" をインストールします。(Linux 環境の場合は、SciSharp.TensorFlow.Redist-Linux-GPU)

[ソリューション エクスプローラー] から、プロジェクトを選択し、右クリックメニューから、[NuGet パッケージの管理] を選択します。
[参照] タブの [検索] テキスト ボックスに "SciSharp.TensorFlow.Redist-Windows-GPU" と入力し、[SciSharp.TensorFlow.Redist-Windows-GPU] を選択、[インストール] を選択し、以降画面の指示に従い "SciSharp.TensorFlow.Redist-Windows-GPU" をインストールします。(*) "SciSharp.TensorFlow.Redist" がインストール済の場合は、アンインストールしておきます。
image.png

CUDA と cuDNN のインストール

次に、CUDA と cuDNN をインストールします。もちろん、先に CUDA と cuDNN をインストールしておいても良いのですが、TensorFlow のバージョンに対応する CUDA と cuDNN のバージョンも異なるため、今回は、TensorFlow インストール後に、CUDA と cuDNN をインストールしています。
TensorFlow.NET ライブラリのバージョンが、TensorFlow のバージョンと一致しています。先の手順では、TensorFlow.NET(SciSharp.TensorFlow.Redist-Windows-GPU) 2.3.1 をインストールしたので、TensorFlow 2.3.1 に対応する CUDA と cuDNN の各バージョンをインストールします。

TensorFlow GPU サポート ソフトウェア要件 にあるように、TensorFlow 2.1.0 以降では、CUDA 10.1 と cuDNN 7.6 が対応するバージョンとなります。
image.png

TensorFlow 2.1.0 より前のバージョンの場合は、以下に TensorFlow と CUDA, cuDNN とのテスト済のビルド構成の対応表があるので、ここで TensorFlow のバージョンに対応する CUDA, cuDNN のバージョンを確認します。

ここでは、TensorFlow 2.3.1 に対して、CUDA 10.1 と cuDNN 7.6 をインストールします。

NVIDIA CUDA 10.1 update2 ダウンロード サイト から、CUDA 10.1 update2 をダウンロードします。
image.png

ダウンロードしたモジュールを起動し、以降、インストーラーの指示に従い、インストールを完了します。この時、Visual Studio 2019 が起動状態だとインストールが中断してしまうため、Visual Studio 2019 を起動している場合は、先に Visual Studio 2019 を終了しておきます。

NVIDIA cuDNN ダウンロードサイト へアクセスし、[Archived cuDNN Releases] から、CUDA 10.1 に対応する最新の cuDNN v7.6.x をダウンロードします。今回は、cuDNN 7.6.5 が該当するので、これをダウンロードします。
image.png

ダウンロードした zip ファイルを解凍すると、以下のような構造になっています。

cuda
│  NVIDIA_SLA_cuDNN_Support.txt
│
├─bin
│      cudnn64_7.dll
│
├─include
│      cudnn.h
│
└─lib
    └─x64
       cudnn.lib

cudnn64_7.dll、cudnn.h、cudnn.lib を CUDA のインストール フォルダーへ移動します。
cudnn64_7.dll を %HOMEDRIVE%\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin 以下へ、
cudnn.h を %HOMEDRIVE%\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include 以下へ、
cudnn.lib を %HOMEDRIVE%\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib\x64 以下へそれぞれ移動します。

これで、セットアップは完了です。

GPU による学習の実行

あとは、前回の投稿と同様にプログラムを実行するのみです。
Visual Studio でプログラムを実行すると、以下のように、コンソール出力に、GPU を検出し、CUDA の DLL がロードされていることがわかります。

2020-11-10 00:47:15.081708: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library nvcuda.dll
2020-11-10 00:47:15.133701: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1716] Found device 0 with properties:
pciBusID: 0000:01:00.0 name: GeForce GTX 1650 Ti computeCapability: 7.5
coreClock: 1.485GHz coreCount: 16 deviceMemorySize: 4.00GiB deviceMemoryBandwidth: 178.84GiB/s
2020-11-10 00:47:15.153863: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cudart64_101.dll
2020-11-10 00:47:15.164522: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cublas64_10.dll
2020-11-10 00:47:15.175347: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cufft64_10.dll
2020-11-10 00:47:15.185020: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library curand64_10.dll
2020-11-10 00:47:15.195719: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cusolver64_10.dll
2020-11-10 00:47:15.202931: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cusparse64_10.dll
2020-11-10 00:47:15.216774: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cudnn64_7.dll

私の環境では、CPU では、20分くらいかかっていたものが、GPU では、3 分ほどで終わるようになりました。

もし、学習の実行時に以下のように CUDNN_STATUS_ALLOC_FAILED エラーが出力される場合は、環境変数で、"TF_FORCE_GPU_ALLOW_GROWTH=true" とすると改善されます。


2020-11-04 01:01:27.824001: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cudnn64_7.dll
2020-11-04 01:01:29.049615: E tensorflow/stream_executor/cuda/cuda_dnn.cc:328] Could not create cudnn handle: CUDNN_STATUS_ALLOC_FAILED
2020-11-04 01:01:29.056108: E tensorflow/stream_executor/cuda/cuda_dnn.cc:328] Could not create cudnn handle: CUDNN_STATUS_ALLOC_FAILED
2 root error(s) found.
  (0) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
         [[{{node resnet_v2_50/conv1/Conv2D}}]]
         [[resnet_v2_50/SpatialSqueeze/_7]]
  (1) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.

環境変数の設定方法は、コマンドプロンプトを [管理者として実行] で、起動して、以下のコマンドを実行する。


>setx TF_FORCE_GPU_ALLOW_GROWTH true -m

もしくは、"sysdm.cpl" を起動して、[詳細設定] - [環境変数..] を選択、[システム環境変数] - [新規...] を選択し、[変数名] に "TF_FORCE_GPU_ALLOW_GROWTH"、[変数値] に "true" を設定して、[OK] - [OK] - [OK] を選択する。

環境変数設定後に、Visual Studio を再起動して、プログラムを再実行すると、エラーが改善されるはずです。

参考サイト

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3