【Unity】ML-AgentsでGPUを使おうと頑張った話【強化学習】

【Unity】ML-AgentsでGPUを使おうと頑張った話【強化学習】

ここ最近、UnityでML-Agentsを使った強化学習に挑戦しています。
使っている教材はこちらです.↓
Unityではじめる機械学習・強化学習
https://www.borndigital.co.jp/book/19053.html
内容として、序章でにUnity知ってる人向けと釘打ってはいたものの、全然Unityを触ったことがない私でも書籍の説明見ながらポチポチやっていけば何とかなる内容でした.(無論、別途調べたりは必要ですが)

そこから内容も中盤に差し掛かってきた頃、そういえばGPUを全く使っていないことに気づきまして、CUDA入れたりなんやかんやで四苦八苦していました.
色々手を加えることでなんとかうまくいった?と思うので、今回はそのプロセスを簡単にまとめておきます.

CUDA,cudnnをインストール

ここを参考に導入
https://github.com/miyamotok0105/unity-ml-agents/blob/master/docs/Installation-Windows.md
今回はCUDA10.1とそれにあったcudnnをダウンロードしました.

tensorflow-gpuのインストール

まずは仮想環境に入ります.
$conda activate 環境名

そしてtensorflow-gpuをインストール…してみましたが、特にバージョン指定せず最新版の2.8.0を入れたところ、後述の確認においてCUDA11を要求されて動きませんでした.
なので2.1.0にダウングレード.
$pip install –upgrade tensorflow-gpu==2.1.0
普通に入れるなら↓で大丈夫です.
$pip install tensorflow-gpu==2.1.0

確認

以下のコマンドでGPUが使われているか確認します.

$python
>>from tensorflow.python.client import device_lib
>>device_lib.list_local_devices()

すると、プロセス中に「cudnn101を読み込み成功!」と出力した直後に何故かcudnn7がないと怒られました.

cudnn7がない

対処法は以下の通りです.
cuda7.0に合ったcudnnをダウンロード、cudnn64_70.dllCUDA/v10.1/binディレクトリに追加します.(他のファイルはコピーしなくて良いです)
さらにcudnn64_70.dllの名前をcudnn64_7.dllに変更します.

再確認

cudnn7成功

GPU認識できてます.

ML-Agentsで学習してみる

早速mlagents-learnで動かしてみました…が、タスクマネージャーを見る感じだとGPUの稼働率が全く上がっていない…(GPU稼働率が4%ほど)

それから色々調べてみたところ、実行時に「–torch-device=cuda:0 」オプションを付けることでいけそうなことが判明しました.(参考:https://forum.unity.com/threads/setting-torch-device-results-in-runtime-error.1233835/)
$ mlagents-learn .\config\sample\CuriosityEx.yaml –run-id=CuriosityEx-ppo-2 –env=Curiosity –torch-device=cuda:0 –resume

GPU稼働率

cudaの稼働率が20%ぐらい(さっきは4,5%くらいしか使ってくれなかった)なので多分大丈夫なんでしょうが、GPUが思ったより(というより全く)使ってくれない…


気になったので調査再開.
以下の質問にたどり着きました.
https://forum.unity.com/threads/pytorch-gpu-setup-for-training.1174442/

VisualObservationでしか有効に使われないとのことです.
もう少し具体的に説明すると、ML-Agentsの殆どが1次元ベクトルによる計算だからそもそもGPUの効果が薄く、VisualObservation(視覚的観測)であればCNNで多次元ベクトルを活用するからGPUの効果が出てくるらしい.(推論なら勿論GPUは使ってくれる.)

終わりに

3Dモデルを使った強化学習を行っていたので、てっきりGPUもりもりで学習してくれるとばかり思っていました…
とはいえtesorflow,cuda,cudnnの関係性など、今後知ってて嬉しい?情報も沢山得られたので良かったです.
引き続きUnity触っていきます.