TensorflowでGPUを使うと計算速度がすごく早くなります。以下のようなConvolutional Neural Network(Total parameter: 79,446,752)を設計し、GPU搭載デスクトップパソコンでepochを10で学習させると、CPUだと68分36秒、GPUだと4分38秒かかりました。AutoKerasもGPU使ってくれます。
詳細 | 学習までにかかった時間 | |
CPU | Core i5 3.2GHz 4core 4threds | 68分36秒 |
GPU | NVIDIA GeForce GTX 1650 | 4分38秒 |
Layer (type) | Output Shape | Param # |
conv2d (Conv2D) | (None, 140, 290, 32) | 11648 |
activation (Activation) | (None, 140, 290, 32) | 0 |
max_pooling2d (MaxPooling2D) | (None, 70, 145, 32) | 0 |
conv2d_1 (Conv2D) | (None, 68, 143, 64) | 18496 |
activation_1 (Activation) | (None, 68, 143, 64) | 0 |
max_pooling2d_1 (MaxPooling2D) | (None, 34, 71, 64) | 0 |
flatten (Flatten) | (None, 154496) | 0 |
dense (Dense) | (None, 514) | 79411458 |
activation_2 (Activation) | (None, 514) | 0 |
dropout (Dropout) | (None, 514) | 0 |
dense_1 (Dense) | (None, 10) | 5150 |
activation_3 (Activation) | (None, 10) | 0 |
Tensorflow以外の機械学習でこんなに時間かかるものあるんでしょうか。Rでは、caretパッケージでrandom forest、Gradient Boost Machine、Neural Networkとかやりましたけど、待つといっても5分程度だと思います。
GPUが使用できるまでの道のりは険しい
1度はあきらめて、今回なんとかできました。(2021年3月1日時点)
tensorflow公式サイトにGPUを使うためのチュートリアルがあります。一番わかりやすいけど、絶対チュートリアル通りいかないことでしょう。
https://www.tensorflow.org/install/gpu?hl=ja
作業1 tensorflow-gpuをpip installでインストール
(公式サイトに、今はtensorflow自体にgpuがサポートされているので、tensorflow-gpuは不要と書かれているような気がします。よくわかりません)
作業2 Visual studioのインストール
CUDAツールキットのインストール時にこれがないとエラーがでます。
作業3 CUDA® ツールキット をインストール
バージョンの整合性をめんどくさがらずに気にしてください。私はめんどくさがってとりあえず最新のやつをダウンロードしたら失敗しました。https://www.tensorflow.org/install/source_windows?hl=ja
インストールドライバーがついているので、それに従えばインストールできま、、せんでした。Visual studioがないというエラーがでました。Visual studioをインストールして、それから再度ドライバーを起動してインストールしました。
作業4 cuDNN SDKをダウンロード
ダウンロードしたら適当な場所に保管しておきます。インストールとか必要な類のものではありません。
チュートリアル通りコマンドプロンプトで、Pathの設定をします。
CUDA®、CUPTI、cuDNN の各インストール先ディレクトリを %PATH% 環境変数に追加します。たとえば、CUDA® ツールキットを C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0 にインストールし、cuDNN を C:\tools\cuda にインストールした場合は、%PATH% を次のように更新します。
一番下のcuDNNのパスは、さきほど保管した場所を指定します。私はパッケージがバラバラになるのが嫌だったので、CUDA®のフォルダのなかに入れ込みました。本当にどこでもいいようです。
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin;%PATH%
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\extras\CUPTI\lib64;%PATH%
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include;%PATH%
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\cuda\bin;%PATH%
さて、準備は整いました。GPUを認識しているか、pythonのコードから調べてみます。
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
ここで、一番下にCPUしか出てこなかったら失敗です。今までの作業のどこかがうまくいっていません。うまくいっているとGPUが出てきます。
GPUが認識されたので、tensorflowを使って学習します!
Tensorflow GPU Could not load dynamic library ‘cusolver64_10.dll’; dlerror: cusolver64_10.dll not found
始まりましたエラー地獄。pythonが嫌いになりそう、いや既にパッケージ関係はかなり嫌いになっている。Rに戻りたい。
どうやら、cusolver64_10.dllがないですよと言ってるみたい。んなこと言われても。。stack overflowを見ると以下の回答が。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\bin
を開いて、そのなかにあるcusolver64_11.dllの名前を、cusolver64_10.dll に変更すればいいよ。
え?そんなことでいいの?やってみると、確かにエラーがでなくなった!
と思ったつかの間、コード実行の最後のほうで違うエラーがでた。
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.
cuDNNが初期化できないよと言っている。これを調べると以下のコードを、スクリプトの先頭に設定するとうまくいくようだ。何をやっているのか全くわからない。とりあえずコピペ。
from tensorflow.compat.v1 import ConfigProto
from tensorflow.compat.v1 import InteractiveSession
config = ConfigProto()
config.gpu_options.allow_growth = True
session = InteractiveSession(config=config)
動いた!!やたらとmemory exceed ~とか fail ~とか、心配な文字がコマンドプロンプトに圧倒的な量・圧倒的な早さで出てくる。GPUでエラーを出すスピードさえも速くなったのか。tensorflowの⇢が進んでいくのが早い、嬉しい。無事に最後まで学習が終わりました!CPUの時と比べて計算が爆速!
その後
別の仮想環境でtensorflow(tensorflow-gpuじゃない)を使って作業していた。え、今まで動いていたコードなのに、エラーを吐くようになった!!
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.
なんだろうこれは。GPUを使おうとしてないかこれ。インストールした何かが悪さをしたに違いない。CPUを指定してtensorflowを実行しないといけないのかなと考え、以下のコードにたどり着く。このまじないを、スクリプトの先頭に入れることで、今までどおりのCPUがやっていたような感じで実行できるようになった。(GPUを使うときはコマンドプロンプトにすごい数の文字が出てくるのでGPUでやっているんだとわかる)
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
なんでGPUを使おうとしているのか謎だった。tensorflow-gpuが入っていない仮想環境で実行しているのに。よくエラーを見てみると、tensorflow-gpuが入っている仮想環境でtensorflowを実行しようとしたときと同じエラーがでている。
試しに、先ほどのGPUを使うための呪文を唱えてみる。あれ、計算が進んでいく。計算終了。
(公式サイトに、今はtensorflow自体にgpuがサポートされているので、tensorflow-gpuは不要と書かれているような気がします。よくわかりません)
さっきひっかかったところが、解決のカギなんでしょうか。ということは、tensorflow-gpuは一切インストール不要なのかもしれません。
GPUのセットアップに疲れてしまった人はGoogle colabを使いましょう。こんなめんどくさいセットアップは不要です。ただ、長い時間計算させているとランタイムエラーですべて初期化されてしまうことがあります。