強化学習による二足歩行の獲得 Part1<環境構築編>

# やりたいこと
現在、研究の為に最近の強化学習を勉強していますがCartPoleにも飽きたので、もう少し難しいモデルの学習に挑戦してみようと思い、二足歩行動作の獲得に挑戦してみます。
元々強化学習に興味を持ったのが、二足歩行ロボットの制御を獲得させてみたい！！という動機だったので非常に楽しみです。

# まずは環境を決める

## 1. 学習環境
まずは強化学習エージェントが学習を行う環境を決めていきます。
制約条件は「二足歩行」以外特にないので、メジャーどころである[Open AI の Gym](https://gym.openai.com/)を使っていきます。
3D環境を使ってみたいこともあり、[MujocoのHumanoid-v2](https://gym.openai.com/envs/Humanoid-v2/)を考えていたのですが、Mujocoの有料ライセンスが必要だったので断念して、[RoboschoolHumanoid-v1](https://gym.openai.com/envs/RoboschoolHumanoid-v1/)を使っていきます。

![tumbnail.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392863/f37ef48c-2e26-81d3-dc71-308352af4500.gif)

RoboschoolはOpen AIが無料の物理エンジンを利用して無償で利用できる3D学習環境を提供しているプロジェクトになります。
Open AI 神ですね！！！

## 2. 強化学習モデル
先行研究で二足歩行をさせている研究を調べてみると有名なモデルのベンチマークテストを行っている論文が見つかりました。強化学習界隈で有名なPieter Abbeel先生も名を連ねているので、こちらを参考にしてみます。
これによるとTNPGやTRPOあたりが良さそうです。

- [Benchmarking Deep Reinforcement Learning for Continuous Control](http://proceedings.mlr.press/v48/duan16.pdf)

私の知識との兼ね合いもあり、今回はTRPOの改良版であるPPOを使用して学習をしてみます。

## 3. 強化学習ライブラリ
私の知る限り、現状強化学習ライブラリでディフェクトスタンダートと呼べるものはまだない印象です。
以下の記事でまとめられているライブラリーのほかに、Deep Xが2019/3に発表した[machina](https://github.com/DeepX-inc/machina)やOpen AI baselinesをフォークして取り扱いやすくした[stable-baselines](https://github.com/hill-a/stable-baselines)などがあります。

- [強化学習ライブラリ一覧](https://qiita.com/namakemono/items/0eedb962a7c93150a833)

いくつか触ってみましたが、コードが簡潔でドキュメントも充実している[stable-baselines](https://github.com/hill-a/stable-baselines)を使っていきます。

※余談
個人的にPytorchを使いたかったのとインターフェースの使いやすさから、machinaを使いたかったのですが、連続な行動空間の場合のエラーを突破できずに断念しました。ドキュメントがもう少し充実していたらありがたかったです・・・。

# 環境の準備 
深層学習ライブラリ、Gym、強化学習ライブラリなどインストールするものが多岐にわたる為、いつも通りDockerで環境を構築します。

## 1. 環境構築を行うPCのスペック

- OS : Ubuntu 18.04
- GPU : Geforce GTX 1080 Ti
- docker, nvidia-docker2インストール済み

## 2. Dockerのリポジトリ
Dockerfileの入っているリポジトリはこちらになります。

- [kinziro/baselines_env-gpu](https://github.com/kinziro/baselines_env-gpu)

使い方はREADMEのUsageの通りですが、

1. リポジトリをgit clone
1. [cuDNN 7.4のインストーラをダウンロード](https://developer.nvidia.com/rdp/cudnn-download)して、cuDNNディレクトリ配下に置く
 - libcudnn7_7.4.1.5-1+cuda10.0_amd64.deb
 - libcudnn7-dev_7.4.1.5-1+cuda10.0_amd64.deb
 - libcudnn7-doc_7.4.1.5-1+cuda10.0_amd64.deb
1. run.shの「'localdir'」を自分の実行したいpythonファイルを置いているディレクトリに変更
1. Dockerfileをビルド
1. Dockerイメージをコンテナ化

1点注意点として、DockerからGUIをを表示するためにホストPC側で以下のコマンドを実行しておく必要があります。

``` bash
$ xhost local:
```

## 3. Dcokerfileの説明
基本的には以下のパッケージがインストールされた環境を構築しています。

- tensorflow
- cunDNN
- CUDA
- stable-baselines
- Gym
- roboschool
- OpenGL

実はDocker + Nvidia GPU の環境でOpenGLで描写するのは結構大変です。
そのため、今回はベースイメージとしてNvidiaが用意している[nvidia/cudagl](https://hub.docker.com/r/nvidia/cudagl)を使用しています。
こちらはNvidia GPU上でOpenGLが実行できるかつ、CUDAも入っている優れものです。
CUDAがいらない場合は[nvidia/opengl](https://hub.docker.com/r/nvidia/opengl)でも大丈夫かも(※未検証)

## 補足. GPUを搭載していないPCの場合
以下のリポジトリをご利用ください。

- [kinziro/baselines_env](https://github.com/kinziro/baselines_env)

# 動作確認してみる
以下のコマンドを実行するとDockerコンテナのbashが立ち上がると思います。

``` bash
$ # Dockerfileをビルド
$ sh build.sh
$ # Dockerイメージをコンテナ化
$ sh run.sh
```

立ち上がったら、コンテナ内で以下のGymの動作確認用pythonスクリプトを作成します。

``` python:gym_test.py
import roboschool
import gym
from OpenGL import GLU

env = gym.make('RoboschoolHumanoid-v1')
env.reset()
while True:
    env.step(env.action_space.sample())
    env.render()
```

テスト用pythonスクリプトを実行します。

``` bash
$ python3 test.py
```

こちらのような画面が表示されれば成功です。

![gym-test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392863/936635ac-a295-0985-b219-81ac63253ca3.gif)

環境構築はここまでになります。

# 次回予告
~~環境構築が終わったので、次回はとりあえず何も考えず学習をさせてみようと思います。
上手く歩いてくれるといいのですが・・・~~

二足歩行をシミュレーション上で獲得させてみました。

- [強化学習による二足歩行の獲得 Part2<既存の実装で学習>](https://qiita.com/kinziro/items/491506c65762c6cef7c3)

# 参考文献

- [強化学習ライブラリ一覧](https://qiita.com/namakemono/items/0eedb962a7c93150a833)
- [stable-baselines](https://github.com/hill-a/stable-baselines)
- [Benchmarking Deep Reinforcement Learning for Continuous Control](http://proceedings.mlr.press/v48/duan16.pdf)
- [NVIDIAが入っているPCにおいてdocker上でopenGLなプログラムを起動して手元で見る．nvidia-dockerのversion1と2の両方に対応．](https://qiita.com/eisoku9618/items/c2cca0f0bf764def2efd)
- [NVIDIA Docker で HW accelerated な OpenGL(GLX) を動かす(2019 年版)](https://qiita.com/syoyo/items/22a0db4d49495020f1bd)