- 投稿日:2021-03-06T08:48:52+09:00
TensorFlow-DirectMLでGPU使って機械学習できなかった話(2021/03/05現在)
低~中スペックのノートPCには、一般的にはCPUに統合されたGPUがあります。(Intel HD Graphics等)
Microsoftが開発しているDirectMLというAPIを使うと、この統合GPUを用いて機械学習ができます。
今回はこのDirectMLを使って機械学習に挑戦し、失敗した話をまとめます。ちなみに前提としてWindows環境でのお話です。
要約
ミドルレンジのノートPCでGPU使った機械学習をしようとしました。
メモリ不足でPythonごと落ちました。
現時点では統合GPUで機械学習するのは難しいようです。TensorFlow-DirectMLとは?
TensorFlow-DirectMLはTensorFlowのフォークプロジェクトで、DirectMLを活用したハードウェアアクセラレーションを提供します。
これによって様々なDirectX 12互換のハードウェアで機械学習モデルのトレーニングと推論が可能になります。要約するとNVIDIA GPU, AMD GPU, Intel HD Graphics等、Windowsで画面描画ができるGPUがあればTensorflowで機械学習ができるようになります。
また、このプロジェクトは現在開発中のプレビューバージョンです。
今回お話しする内容は開発が進んでいくことで改善されていくことがあるためご注意ください。筆者のPCスペック
今回用いるPCスペックは以下の通りです。
もういい加減型落ち感がしてきた第五世代Surfaceのミドルレンジモデルになります。
- Microsoft Surface Pro(第5世代)
- CPU: Intel Core i5-7300U
- GPU: Intel HD Graphics 620
- メモリ: DDR4-1867 8GB
- SSD: 256GB
実践
環境を用意して、実際に試していきます。
今回はTensorFlow公式のチュートリアルを使ってMNISTの手書き数字を分類します。
一応実際に用いたコードはGitHubに公開しておきます。
リポジトリはこちら最も重要なのはPythonのバージョンで、Pyhton 3.7である必要があります。
私はPython 3.7.8を使用しました。それでは仮想環境を作って動作時間を確認していきます。
まずはCPUを用いて計測> python -m venv .env-cpu > .env-cpu\Scripts\activate.bat (.env-cpu) > pip install tensorflow==1.15.5 (.env-cpu) > python main.py Epoch 1/5 60000/60000 [==============================] - 40s 659us/sample - loss: 0.1424 - acc: 0.9568 Epoch 2/5 60000/60000 [==============================] - 39s 656us/sample - loss: 0.0439 - acc: 0.9863 Epoch 3/5 60000/60000 [==============================] - 38s 633us/sample - loss: 0.0320 - acc: 0.9902 Epoch 4/5 60000/60000 [==============================] - 39s 658us/sample - loss: 0.0250 - acc: 0.9920 Epoch 5/5 60000/60000 [==============================] - 44s 732us/sample - loss: 0.0183 - acc: 0.9944 10000/10000 - 2s - loss: 0.0289 - acc: 0.9917 Test accuracy: 0.9917 実行時間:202.9410572052002[sec]main.pyの出力結果は一部削っています。
というわけでCPUでの実行時間は約203秒です。次にDiectML用の仮想環境を作って計測します。
> python -m venv .env-gpu > .env-gpu\Scripts\activate.bat (.env-gpu) > pip install tensorflow-directml (.env-gpu) > python main.pyここでPythonが動作を停止しエラー落ちしてしまいます。
落ちた瞬間のタスクマネージャーのスクリーンショットがこのようになっています。
グラフを見ていただければわかりますが、共有GPUメモリが全て使われた上、RAMも全て使用。
ディスクへのアクセスが大量に行われていることからメモリ不足でスワップが起きていることがわかります。終わりに
今回はメモリ不足から実行に失敗してしまいました。
(検証としてデスクトップPCにおいてTensorFlow-GPUとCUDAを用いて実行した際は1GB程度のメモリ使用でした。)現状のTensorFlow-DirectMLではメモリ割り当ての最適化ができていないようで、TensorFlow-GPUと同じように使用することはまだ難しいようです。
ノートPCでも機械学習を高速化できるのはとても面白いと思っているので、今後のバージョンアップに期待したいと思います。