深層強化学習フレームワークmachinaを使ってみた


はじめに

深層強化学習フレームワークmachinaが気になったので、どんなものかとりあえずquickstartをやってみることにする

環境: Mac, pyenv viertualenv セットアップ済み

セットアップする

とりあえずvirtualenvで専用環境を作る。Python3.7.3をコンパイラに指定する

pyenv install 3.7.3
pyenv virtualenv 3.7.3 machina
pyenv activate machina
pip install -U pip
pip install numpy torch torchvision jupyter machina-rl

Pythonインストール中にzipimport.ZipImportError: can't decompress data; zlib not availableエラーが発生してインストールができなかった。以下の記事に記載されている対処法で無事インストールできた

[MacOS Mojave]pyenvでpythonのインストールがzlibエラーで失敗した時の対応

quickstartをやってみる

レポジトリをクローンする

git clone https://github.com/DeepX-inc/machina.git
cd machina

jupyter notebookを起動する

jupyter notebook

notebookで example -> quickstart -> ppo_acrobot.ipynb を開いてポチポチやってトレーニングし、結果を表示する。4.Visualize behavior after trainningを実行すると、トレーニング結果の動画が再生される

まあ100エポックほどなのでちゃんと立たないが、学習していることは確認できる

他のexampleをやってみる

ソースコードを追いかけるのは後でやるとして、quickstartがあっさり終わったので別のexampleをやってみようと思う。IMITATION.mdに記載されているBehavioral Cloningのサンプルコードを動かしてみる。

IMITATION.mdに記載されている手順でexpert_episをダウンロードしたりして、以下を実行する

cd example
python run_behavior_clone.py
{'batch_size': 256,
 'c2d': False,
 'check_rate': 0.05,
 'cuda': -1,
 'data_parallel': False,
 'deterministic': False,
 'env_name': 'Pendulum-v0',
 'epoch': 1000,
 'expert_dir': '../data/expert_epis',
 'expert_fname': 'Pendulum-v0_100epis.pkl',
 'gamma': 0.99,
 'h1': 32,
 'h2': 32,
 'lam': 1,
 'log': 'garbage',
 'max_epis': 100000000,
 'max_epis_per_iter': 10,
 'num_parallel': 4,
 'pol_lr': 0.0001,
 'record': False,
 'seed': 256,
 'tau': 0.001,
 'train_size': 0.7}
/Users/user/.pyenv/versions/machina/lib/python3.7/site-packages/gym/envs/registration.py:14: PkgResourcesDeprecationWarning: Parameters to load are deprecated.  Call .resolve and .require separately.
  result = entry_point.load(False)
WARN: gym.spaces.Box autodetected dtype as <class 'numpy.float32'>. Please provide explicit dtype.
WARN: gym.spaces.Box autodetected dtype as <class 'numpy.float32'>. Please provide explicit dtype.
2019-05-26 16:18:47.056642 JST | observation space: Box(3,)
2019-05-26 16:18:47.056818 JST | action space: Box(1,)
2019-05-26 16:18:47.224460 JST | expert_score=-203.31068420410156
2019-05-26 16:18:47.225109 JST | num_train_epi=70
2019-05-26 16:18:48.468546 JST | sample: 0.8718sec
2019-05-26 16:18:48.469228 JST | outdir /Users/user/machina/example/garbage
2019-05-26 16:18:48.475059 JST | ------------------  ------------
2019-05-26 16:18:48.475268 JST | PolLossAverage          1.16213
2019-05-26 16:18:48.475474 JST | PolLossStd              0.20314
2019-05-26 16:18:48.475698 JST | PolLossMedian           1.17578
2019-05-26 16:18:48.475883 JST | PolLossMin              0.743538
2019-05-26 16:18:48.476050 JST | PolLossMax              1.57056
2019-05-26 16:18:48.476134 JST | TestPolLossAverage      0.775926
2019-05-26 16:18:48.476208 JST | TestPolLossStd          0
2019-05-26 16:18:48.476281 JST | TestPolLossMedian       0.775926
2019-05-26 16:18:48.476547 JST | TestPolLossMin          0.775926
2019-05-26 16:18:48.476738 JST | TestPolLossMax          0.775926
2019-05-26 16:18:48.476887 JST | RewardAverage       -1289.41
2019-05-26 16:18:48.477021 JST | RewardStd              54.1989
2019-05-26 16:18:48.477150 JST | RewardMedian        -1285.32
2019-05-26 16:18:48.477271 JST | RewardMin           -1404.18
2019-05-26 16:18:48.477401 JST | RewardMax           -1200.5
2019-05-26 16:18:48.477508 JST | CurrentEpoch            0
2019-05-26 16:18:48.477638 JST | ------------------  ------------
2019-05-26 16:19:05.279398 JST | sample: 0.7552sec
2019-05-26 16:19:05.280429 JST | outdir /Users/user/machina/example/garbage
...(中略)...
2019-05-26 16:24:19.457548 JST | ------------------  -----------
2019-05-26 16:24:19.457641 JST | PolLossAverage        -2.19763
2019-05-26 16:24:19.457720 JST | PolLossStd             0.040569
2019-05-26 16:24:19.457795 JST | PolLossMedian         -2.19817
2019-05-26 16:24:19.457868 JST | PolLossMin            -2.2765
2019-05-26 16:24:19.458061 JST | PolLossMax            -2.06869
2019-05-26 16:24:19.458231 JST | TestPolLossAverage    -2.1701
2019-05-26 16:24:19.458352 JST | TestPolLossStd         0
2019-05-26 16:24:19.458442 JST | TestPolLossMedian     -2.1701
2019-05-26 16:24:19.458536 JST | TestPolLossMin        -2.1701
2019-05-26 16:24:19.458669 JST | TestPolLossMax        -2.1701
2019-05-26 16:24:19.458774 JST | RewardAverage       -254.439
2019-05-26 16:24:19.458955 JST | RewardStd             86.3936
2019-05-26 16:24:19.459045 JST | RewardMedian        -242.488
2019-05-26 16:24:19.459119 JST | RewardMin           -364.349
2019-05-26 16:24:19.459191 JST | RewardMax           -127.547
2019-05-26 16:24:19.459263 JST | CurrentEpoch         950
2019-05-26 16:24:19.459334 JST | ------------------  -----------

同階層にgarbageディレクトリが生成されてmodelやログが保存される

python take_movie.py

を実行すると、garbage/optimal_movieディレクトリが生成されて、中にベストモデルの結果動画が作成される

take_movie.py実行時にobjc[35514]: +[__NSCFConstantString initialize] may have been in progress in another thread when fork() was called.というエラーが発生する場合は、ここを参考に環境変数を追加して実行するとうまくいく

export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES

まとめ

サンプルコードをざっと眺めてみると、PytorchをベースにNNと学習のための環境、強化学習アルゴリズムがうまく抽象化されていてコンポーネントになっている。環境とアルゴリズムをテンプレ化しておいていろいろなNNを入れ替えて学習させてみるとか容易にできそう。ドキュメントで説明されている通りの印象を受けた

なんか実用してみたいところ