【機械学習】NVIDIA GeForce RTX 2080 をゲームだけに使うのはもったいないので機械学習(Deep Learning)に使ってみた

NVIDIA GeForce RTX 2080 を購入してから、英語学習と称して様々なオープンワールドゲームを英語でプレイしてきました。

さすがにゲームのグラフィック設定を最高レベルにしていてもなめらかに動き、計算パワーがすごいことを実感しています。

というわけで、ふと、今流行の機械学習 (Deep Learning) に使ったらどれぐらい恩恵があるのかを試してみました。

機械学習の環境をセットアップ

Windows ベースで GPU を使った機械学習環境を設定したいのであれば、Anaconda を使うのが簡単です。

NVIDIA RTX シリーズが出始めた頃は、対応している CUDA や tensorflow をソースコードからコンパイルする必要などもあったようですが、今となっては最新バージョンの Anaconda をダウンロードしてインストーラを実行すればそれで事足ります

Anaconda のインストール中に、システムワイドでインストールするか、個人ユーザフォルダの下にインストールするか聞かれますが、後者を選択すれば C:\Users\%USERNAME%\Anaconda3 以下にすべて入るので、アンインストールや再インストールなどもやりやすそうです。

CPU のみで計算した場合

まずは GPU を使わずに CPU のみで計算させてみます。

後で簡単に GPU の有無を切り替えられるように、Anaconda の仮想環境を作成します。名前は “tensorflow” としました。

conda create -n tensorflow
activate tensorflow

そして、通常版の Tensorflow とKeras をインストールします。Tensorflow は Google により開発された機械学習のライブラリです。Keras はニューラルネットワークのコードを使いやすくするラッパーライブラリです。バックエンドとして Tensorflow だけでなく他のライブラリも使うこともできます。

conda install tensorflow
conda install keras

テストプログラムとしては、有名な Keras の MNIST のサンプルプログラムをそのまま使用します。

Build software better, together
GitHub is where people build software. More than 65 million people use GitHub to discover, fork, and contribute to over 200 million projects.

これは手書きの数字画像データ (28×28 ピクセル) を、Convolution 2層にプーリング、そして全結合層1層に出力層も組み合わせて、認識率 99% を実現する比較的シンプルなモデルです。

>python mnist_cnn.py
Using TensorFlow backend.
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
... 
I tensorflow/core/common_runtime/process_util.cc:71] Creating new thread pool with default inter op setting: 12. Tune using inter_op_parallelism_threads for best performance.
...
60000/60000 [==============================] - 56s 934us/step - loss: 0.2652 - acc: 0.9176 - val_loss: 0.0576 - val_acc: 0.9821
Epoch 2/12
60000/60000 [==============================] - 56s 935us/step - loss: 0.0897 - acc: 0.9738 - val_loss: 0.0446 - val_acc: 0.9846
...
Epoch 12/12
60000/60000 [==============================] - 53s 881us/step - loss: 0.0272 - acc: 0.9917 - val_loss: 0.0259 - val_acc: 0.9920
Test loss: 0.025859333508704913
Test accuracy: 0.992

ログにも表示されているとおり、マルチスレッドを駆使しているので何もしなくてもデフォルトですべてのCPUコアを使用してくれるようです。

当方の環境は CPU i7-8086K (4GHz 6 コア / 12 スレッド) で、タスクマネージャで確認したところ 6 コア 12 スレッドすべて 100% の利用率でフル計算してくれていました。

その条件で、1 epoch あたり約56秒(1 step あたり約 935マイクロ秒)ほど時間をかけて学習が進んだことが分かります。

GPU (GeForce RTX 2080) を使って計算した場合

次に、GPU を利用するための Anaconda 環境を別途作成します。

conda create -n tensorflow-gpu
activate tensorflow-gpu

そして GPU 対応版の Tensorflow (と Keras)をインストールします。

conda install tensorflow-gpu
conda install keras

あとは同じ MNIST サンプルプログラムを走らせるだけで GPU を使った機械学習ができます。

>python mnist_cnn.py
Using TensorFlow backend.
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
...
2019-05-15 06:37:21.623727: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433] Found device 0 with properties:
name: GeForce RTX 2080 major: 7 minor: 5 memoryClockRate(GHz): 1.815
...
2019-05-15 06:37:23.055101: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 6284 MB memory) -> physical GPU (device: 0, name: GeForce RTX 2080, pci bus id: 0000:01:00.0, compute capability: 7.5)
2019-05-15 06:37:23.611047: I tensorflow/stream_executor/dso_loader.cc:152] successfully opened CUDA library cublas64_100.dll locally
60000/60000 [==============================] - 10s 161us/step - loss: 0.2626 - acc: 0.9188 - val_loss: 0.0538 - val_acc: 0.9822
Epoch 2/12
60000/60000 [==============================] - 3s 52us/step - loss: 0.0884 - acc: 0.9738 - val_loss: 0.0388 - val_acc: 0.9868
...
Epoch 12/12
60000/60000 [==============================] - 3s 52us/step - loss: 0.0283 - acc: 0.9912 - val_loss: 0.0362 - val_acc: 0.9887
Test loss: 0.03616291589878747
Test accuracy: 0.9887

最初の epoch の計算だけ 10 秒と余分に時間がかかっていますが(初期化のため?)、その後は 1 epoch 3秒 (1 step 52マイクロ秒)ぐらいずつ学習が進みました。

これは、先ほど CPU のみで計算した場合よりも 18倍ぐらい速いです。

しかも、タスクマネージャで確認していたところ、GPU 利用率は 20% 程度までしか上がっていませんでした。おそらく、今回使用したニューラルネットワークがそもそもシンプルでノード数もそんなに多くないためだと思われます。もう少し大規模なニューラルネットワークであれば、CPU に対する GPU の優位性はさらに上がることが予想されます。

結論

NVIDIA GeForce RTX 2080 はゲームだけでなく機械学習に使っても役に立つことが実感できました。

利用した CPU i7-8086K もある程度スペックの高い CPU なのですが(6コア 12スレッド 4GHz)、それに比べても 18倍速く学習させることが可能でした。

それでも GPU 利用率 20% 程度ということは、仮に GPU 性能をフルに使うことができるようなニューラルネットワーク・プログラムを組むことができれば、CPU に対して最大100倍近くの速度を目指すことも不可能では無いのかもしれません。

それにしても、GPU を利用した機械学習環境を、こんなに簡単にセットアップ、そして利用できるとは思っていませんでした・・・。恵まれた世の中になったものです。

タイトルとURLをコピーしました