t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

Unityで機械学習になんとか入門できた話

先日購入した書籍でUnityを使って機械学習に入門しようと思ったのだが、環境構築で派手に躓いてしまった。最終的にライブラリの公式サイトに従ってなんとかスタートラインに立つことができたのでそのあたりの苦労を記しておこうと思う。

購入した書籍

こちらの書籍で今回躓いたのだが、けっして内容や構成が悪い本ではない。

ただ機会学習の分野はまだまだ伸びているとろこなので新陳代謝が激しく、ごく短い期間でツールやライブラリのバージョンがどんどん上がってしまう。

今から約5か月前(2020年の8月)に出版されたこの書籍で使用されているのはml-agentsというUnity用のライブラリのRelease 3だが、現在の安定版リリースはRelase 12である。あまりにも早い。

中で使われている機械学習ライブラリもTensorFlow(Google製)からPyTorch(Facebook製)に変わってるようで、このことからもml-agentsライブラリにも大きな変更があったものと思われる。

上手く行かなかった環境構築の方法

まずは最新の環境でとりあえず試してみた。Unity2019とml-agentsのRelease 12とPython3.8である。
結果は、書籍にない設定項目がでてきたり書籍のコードが古いためエラーになったりと、書籍に沿った学習が進められなかった。

次に、ml-agentsをRelease 3に変更してみた。画面は書籍通りになったが、機械学習用のツールであるmlagents-learnが動かない。
Unityを2018にしてみたが効果なし。まさかPythonは関係ないだろうと決めつけていたのでここでも数時間溶かした。あとから調べて分かったのだが、どうやらml-agentsのRelease 3で使用されているTensorFlowのバージョンがPython3.7以下でないと動かないらしい。

それで、Pythonも書籍に合わせて3.6を導入。とりあえずmlagents-learnは動くようになった。
しかしUnity側でPlayボタンを押しても何も始まらない。しばらく待っているとmlagents-learnがタイムアウトして終了してしまう。

Unity側で次のようなエラーが出ていたので、一応ファイアウォールも全部開けたり、検索して出てきた英語サイトを片っ端から読んでいったけど解決しなかった。

Couldn't connect to trainer on port 5004 using API version 1.0.0. Will perform inference instead.

構成は以下の通り。書籍の環境になるべく近づけたのだがダメだったのでここで一旦断念。

  • Windows 10 Home バージョン2004(OSビルド 19041.746)
  • Unity: 2018.4.30f1
  • Anaconda: 4.9.2
  • Python: 3.7.6
  • TensorFlow: 2.4
  • ML-Agents:Release 3

上手くいった環境構築の方法

書籍を参考にセットアップするのは諦めて、根気よく公式のGitHubからInstallation Guideを読むことにした。
セットアップをやり直すにあたり、まずはML-AgentsのRelease 3を削除し、Anacondaをアンインストール(Pythonも消えた)。
Unityはそのまま。

以下のサイトを読みながらセットアップを進めていく。
一応Release 12のインストールガイドにリンクしたが、この記事にたどり着いたタイミングによっては既により新しいバージョンが出ている可能性があるのでその場合はGoogle検索等で探していただけると良いかと思う。
github.com

ステップごとにごく簡単に解説してみる。

Install Unity 2018.4 or Later

Unityをインストールする。
元のサイトが2018版で解説されていたので素直にUnity2018を入れたけれど、2019でも同じように進められるかもしれない。
ここは特に私はハマらなかったので解説することはない。

Install Python 3.6.1 or Higher

書籍だとAnacondaをインストールする手順になっていて確かに便利だったけどまた変なところで躓いても困るので公式にしたがって素でインストールすることにした。
他にPythonで運用しているものがある方はpyenvとかAnacondaとか使うと良いかと思う。
3.6にしようかと思ったけれど公式サイトでは既にソースコードしか配布されていないようなのでインストーラーが配布されている3.7.9にした。

Clone the ML-Agents Toolkit Repository (Optional)

Gitでクローンしろという指示。
Optionalと書いてあるが、ml-agentsに付いてくるサンプルを動かすのに必要で、初心者はまずサンプルを動かさないことには右も左も分からないので実質必須。
これはまずGitをダウンロードする必要がある。Gitのバージョンは特にこの後の作業と関係ないので普通に最新版で良い。
インストール時にやたらと細かい設定を聞かれるのだが、全部デフォルトで良い。大丈夫。私もあんまり分かってない。
そしてコマンドプロンプトでml-agentsフォルダーを作りたい場所に移動し、以下のコマンドでml-agentsフォルダーがダウンロードされる。

git clone --branch release_12 https://github.com/Unity-Technologies/ml-agents.git

GitHubから直接ダウンロードじゃだめなのか?→GitでCloneしないと上手く行かないという英語の意見を1件だけ検索で見つけてしまったので念のためインストールガイドに案内の通りGitでクローンした。

Install the com.unity.ml-agents Unity package

これは書籍のとおりでうまくいくので割愛。

(Windows) Installing PyTorch

Windowsの場合はPyTorchを別途インストールする必要があるのでインストレーションガイドに従ってpip3コマンドでインストールする。

pip3 install torch==1.7.0 -f https://download.pytorch.org/whl/torch_stable.html

Installing mlagents

mlagentsは次のコマンドでインストールする。

pip3 install mlagents

Advanced: Local Installation for Development

Advanced(高度な~)なので特にやってない。

次にやること

Getting Started Guideに従って、サンプルを使った演習を進めることになる。
ml-agents/Getting-Started.md at release_12_docs · Unity-Technologies/ml-agents · GitHub

内容的には以下の記事でも同じことをやってるので英語が辛い場合はこちらをおススメ。
qiita.com

その次にやること

Making a New Learning Environmentという記事に進むと、ようやく書籍で躓いたボール転がしの演習が出てくる。
ml-agents/Learning-Environment-Create-New.md at release_12_docs · Unity-Technologies/ml-agents · GitHub

書籍のコードだとRelease 12では動作しないのと設定項目が若干変わっているので書籍と上記のサイトを見比べながら、基本的にはサイトのやり方に合わせて進めると良いと思う。

完成したもの

以下はボールが四角いターゲットを目指すだけのもので、機械学習中の様子。学習が終わるまでだいたい40分くらいかかるのでバックグラウンドにしてYouTubeを視聴しながら待機する。
f:id:t-hom:20210123235630g:plain

学習が終わるとモデルが出来上がるので、ボールにそれを設定してPlayボタンを押す。するとフロアーから脱落することなく綺麗にターゲットを追いかけるようになる。
f:id:t-hom:20210123235914g:plain

これの何が凄いのかというと、ターゲットを目指して進むという直接的な処理をどこにもコーディングしていない点である。
エージェントはターゲットの位置・自分の位置・自分のベクトル(速度と方向)を観察することができ、その結果を自分が持つポリシーに照らし合わせて動くことができる。
この部分は確かにコーディングした。


しかし、ターゲットの方向に近づこうというポリシー自体は人がプログラムしたのではない。
エージェントがターゲットと接触したら報酬が与えられる(これはコーディングした部分)、エージェントはいろんなパターンを試す中で、観察された条件ごとに報酬がより多くもらえる行動を強化するようポリシーを変更する(これは機械学習ライブラリの担当する領域)。それの積み重ねによって徐々に床から落ちることなくターゲットを追い続ける仕組みが出来上がるのだ。機械学習のなかでも、強化学習と呼ばれる手法である。


とりあえず無事に機械学習のスタートラインに立てて良かった。
購入した本も、コードはそのままじゃ動かないけど解説は役に立ちそうなのでしばらく色々やってみようと思う。

以上。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。