WSL+ubuntu18.04+VcXsrv+OpenAI Gym 動くまでのメモ（修正）

# TL;DR

+ この資料は、[機械学習名古屋勉強会#16「強化学習ハンズオンパート2」](https://machine-learning.connpass.com/event/87484/) の補助資料です。
+ この資料を見るだけで、Windows10（Home可）上で OpenAI Gym が動くまでの環境設定ができることを目指します。

# はじめに

[OpenAI Gym](https://gym.openai.com/)。公式にサポートしているのは Linux / macOS のみで、Windows はサポート外です。
Windows で OpenAI Gym を動かすにはいくつか方法があるのですが、そこそこネイティブに近い（＝VirtualBoxやHyper-Vなどの仮想環境を利用しない）、Windows 10 Home でも利用可能な方法[^hurdle]を紹介します。
それが、「WSL（Windows Subsystem for Linux）」に「Ubuntu 18.04」を入れて、「VcXsrv（Windows用のXServer）」でGUIを表示する方法です。

目指すのは、↓こんな状態です：

![WSL_VcXsrv_OpenAIGym.jpg](https://qiita-image-store.s3.amazonaws.com/0/30400/f107ee06-d870-c4c5-22c4-e11cb479622a.jpeg)

【2020/01/31 修正】Python3.6のppaを現在有効なものに差し替えました（動作確認済）。

[^hurdle]: 「敷居が低い」とは言ってない…。

## 環境等

+ Windows 10 Home / Professional
+ WSL + Ubuntu 18.04
    + Python3 (3.6.x) + OpenAI Gym + chainerrl
+ VcXsrv

※ Python 等の環境は WSL に載せた Ubuntu 上に構築します。Windows にインストールした Python は（もし存在しても）利用しません。

# WSL（Windows Subsystem for Linux）のインストール・有効化

まずは WSL をインストール（有効化）します。

1. スタートメニュー（画面左下）を右クリックし、「アプリと機能(<ins>F</ins>)」をクリック
2. ウィンドウの最下部までスクロールして出てくる「関連設定」の「プログラムと機能」をクリック
3. 出てくるウィンドウの左ペインにある「Windowsの機能の有効化と無効化」をクリック
4. ↓のようなウィンドウが出てきます[^FallCreatorsUpdate]。  
  ![20180618_WSL_ON.png](https://qiita-image-store.s3.amazonaws.com/0/30400/0e0f2a09-22c6-a8eb-1d1c-040d83c74e1a.png)  
  「Windows Subsystem for Linux」にチェックが入っていればOK。
    + 入っていなければチェックを入れて[OK]ボタンをクリック。  
      指示に従って再起動等を実施。
    + もう一度上記手順（1.～）を踏んで↑のチェックが入っていればOK。

[^FallCreatorsUpdate]: 出てきた画面がこの通りでない（特に「Windows Subsystem for Linux (Beta)」のように後ろに **Beta** という文字列が続いている、もしくはそもそも「Windows Subsystem for Linux」が存在しない）場合、Windows が最新の状態ではない（特に 2017 Fall Creators Update 以降が適用されていない）可能性が高いです。まず Windows Update を実行してシステムを最新の状態に更新（[#補足](#補足)→[#Windows 10 April 2018 Update の適用](#windows-10-april-2018-update-の適用) 参照）してから、再度試してみてください。

# Ubuntu 18.04 のインストール

WSL 上に Ubuntu をインストールするには、「Microsoft Store」経由で行います。
なお、インストールできる Linux ディストリビューションは別に Ubuntu でなくてもたぶん大丈夫（未確認）ですが、分かりやすい（のと説明しやすい）ので Ubuntu で話を進めます。
あとここでは、最新の ubuntu 18.04 LTS をインストールしてみます[^Ubuntu1804]。

[^Ubuntu1804]: Ubuntu 16.04 LTS の方が情報も枯れているしトラブルも少ないと思うのですが、最初から Python3.6 が入っているし、将来性を考えて現時点の最新 18.04 のインストールを試みました。トラブルも1件解決できたのでその共有も兼ねて紹介します。

## インストール

1. Microsoft Store を開く
    + cortana さんに「microsoft store」を聞いても良いし、タスクバーに表示されている「白い買い物袋」のアイコン↓をクリックでもOK。  
      ![20180621_MSSTORE.png](https://qiita-image-store.s3.amazonaws.com/0/30400/5946f1a8-277c-f1b5-5ec3-52d95a3af633.png)

2. 検索欄に「Ubuntu」と入力、Enter
3. ↓  
  ![20180618_STORE_UBUNTU_SEARCHRESULT.png](https://qiita-image-store.s3.amazonaws.com/0/30400/be0c5264-aea0-b65a-2f05-f25adf511715.png)  
  「Ubuntu 18.04」を選択（クリック）[^ubuntu1604]
4. 指示に従ってインストール（ほぼダウンロードするだけ）[^ubuntu_cannot_be_installed]

[^ubuntu1604]: バージョン番号無しの「Ubuntu」を選択すると従来の「Ubuntu」アプリ（バージョン 16.04 LTS）、「Ubuntu 16.04」を選択すると「Ubuntu 16.04 LTS」がインストールされます。これらは別アプリケーション（個別にインストール可能で共存可能）。「18.04」でどうしてもうまくいかない場合は「16.04」の方を試してみてください。
[^ubuntu_cannot_be_installed]: ここで Ubuntu がインストールできない or 起動できない場合、WSL が有効になっていない可能性が高いです。[WSL（Windows Subsystem for Linux）のインストール・有効化](#wslwindows-subsystem-for-linuxのインストール有効化) を参考に WSL の状態を確認・有効化してください。

## 初期設定

インストール直後の初回起動時、ユーザ名とパスワーその入力を求められます↓

```bash
Installing, this may take a few minutes...
Installation successful!
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: 《ユーザ名入力》
Enter new UNIX password: 《パスワード入力》
Retype new UNIX password: 《パスワード再入力》
passwd: password updated successfully
Default UNIX user set to: USERNAME
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

USERNAME@HOSTNAME:~$
```

最初の `Installing, this may take a few minutes...` は結構待たされます。
`Enter new UNIX username: ` が出たら入力待ち状態になるので、自分の好きなユーザ名（半角英数字）を入力。でてくる説明にもある通りこれはWindowsのユーザ名と一致していなくても構いません[^yourID]。
次に `Enter new UNIX password: ` と聞かれるので、お好きなパスワードを入力します。注意点は2つ：

1. これはWindowsサインイン時のパスワードとは別です、一致させる必要はありません[^yourPW]。
2. キーをタイプしても画面に文字が表示されませんが、入力はされています（GUIじゃないシステムではよくあること）。注意深く入力してください。

さらに確認のために `Retype new UNIX password: ` と聞かれるので、今入力したパスワードをもう一度入力してください。やはり表示されませんが、先ほど入力したパスワードと一致していれば `passwd: password updated successfully` と出て完了です。エラーが出たらパスワードが間違っていたので、入力し直してください[^retypepw]。

最後に（おなじみの）bash のプロンプト[^prompt]が出現したら、インストール＆初期設定完了です。
以下のようなコマンドを打つと、バージョン確認が出来ます：

```bash
USERNAME@HOSTNAME:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04 LTS
Release:        18.04
Codename:       bionic
USERNAME@HOSTNAME:~$ cat /proc/version
Linux version 4.4.0-17134-Microsoft (Microsoft@Microsoft.com) (gcc version 5.4.0 (GCC) ) #112-Microsoft Thu Jun 07 22:57:00 PST 2018
```

[^yourID]: むしろ普段Windowsを開発用途以外でしか使わないような型だとユーザ名に日本語とか空白とか入っているかも、そういうのはトラブルの元なので半角英数字のみの分かりやすいIDを使いましょう。
[^yourPW]: 逆に（ユーザ名および）パスワードをWindowsサインイン時のものと一致させても良いのですが、セキュリティ的に心配なら、やっぱ分けた方が良いでしょう。
[^retypepw]: この記事は「勉強会の補助資料」という位置づけ上、初心者の方や「GUIしか使ったことないような（リテラシー低め）の方」にもなるべく伝わるよう、この辺ちょっとだけ丁寧に記述しています。中級者以上の方には退屈な説明も多々あると思われますが今しばらくご辛抱くださいm(_ _)m
[^prompt]: 最初の表示例で言うと、最後の「`USERNAME@HOSTNAME:~$ `」の部分が「（（Ubuntu の）Bashの）プロンプト」です（実際には、`USERNAME`は初期設定時に入力したユーザ名、`HOSTNAME`はコンピュータ名になります）。その後ろにコマンドを打っていくことになります。【初心者向け】コマンドを打つときに「`USERNAME@HOSTNAME:~$`」を打ち込む必要はありません。コピペする場合はそれより後ろのみコピペしてください。

## Ubuntu の更新

Ubuntu を最新の状態に更新します。以下のコマンドを実行してください。

```bash
USERNAME@HOSTNAME:~$ sudo apt update && sudo apt upgrade -y
[sudo] password for USERNAME: 《パスワード入力》
```

`apt` というのは Ubuntu 標準のパッケージマネージャです。少し時間がかかりますが、これで Ubuntu に最初からインストールされている各種ライブラリやコマンド類が最新状態になります。
このコマンドを実行してすぐに、上記のようにパスワードの入力を要求されることがあります。先ほど設定したパスワードを入力しましょう。先ほどと同じく画面には表示されないので入力注意。
なおこれは `sudo` というコマンドで管理者権限で処理を行うのに必要ですが、連続して実行する場合や、「`sudo` コマンドでパスワードの入力を免除できるよう設定されたユーザ」の場合はパスワードの入力は要求されません（その設定はここでは省きます）。

更新処理時、途中で以下のようなエラーが出て異常終了することがあります。

```
 * Error: insufficient privileges to access the ebtables rulesets.
invoke-rc.d: initscript ebtables, action "stop" failed.
dpkg: warning: old ebtables package pre-removal script subprocess returned error exit status 1
dpkg: trying script from the new package instead ...
invoke-rc.d: could not determine current runlevel
 * Error: insufficient privileges to access the ebtables rulesets.
invoke-rc.d: initscript ebtables, action "stop" failed.
dpkg: error processing archive /var/cache/apt/archives/ebtables_2.0.10.4-3.5ubuntu2.18.04.1_amd64.deb (--unpack):
 new ebtables package pre-removal script subprocess returned error exit status 1
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
invoke-rc.d: could not determine current runlevel
Errors were encountered while processing:
 /var/cache/apt/archives/ebtables_2.0.10.4-3.5ubuntu2.18.04.1_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

このエラーが出たら、以下のようなコマンドを実行して更新を再実行してください。

```bash
USERNAME@HOSTNAME:~$ sudo cp -p /bin/true /sbin/ebtables
USERNAME@HOSTNAME:~$ sudo apt update && sudo apt upgrade -y
```

詳細は [公式サイトのQ&A](https://answers.microsoft.com/en-us/windows/forum/windows_10-windows_install/errors-in-ubuntu-1804-on-windows-10/fe349f3d-3d58-4d90-9f8f-c14d7c12af8b) を参照してください。

# VcXsrv のインストール

ここで先に VcXsrv をインストールしておきます。
**[VcXsrv](https://sourceforge.net/projects/vcxsrv/)** とは、フリーの X Server クライアント[^xserver][^install_xserver]です。
X Server とは、ウィンドウを表示したりキー入力を受け付けたりするGUIバックエンドで、先ほどインストールした Ubuntu でウィンドウを表示するために必要になります。
特に OpenAI Gym ではシミュレーションの様子をウィンドウで表示するので、これが必要になってきます[^nogui]。

[^xserver]: Windowsで使える X Server には他に、[xming](https://sourceforge.net/projects/xming/)（フリー、2年前に開発停止？）、[MobaXTerm](https://mobaxterm.mobatek.net/)（フリー、有償版あり、X Server だけでなく teminal やなんか色々付いてくる）、[X410](https://www.microsoft.com/ja-jp/p/x410/9nlp712zmn9q)（有償、未検証）など色々ある模様です。
[^install_xserver]: X Server は WSL 上ではなく、Windows にインストールします（インストーラもGUI（対話形式）で分かりやすいです）。
[^nogui]: 実は別に GUI がなくても OpenAI Gym のデモを動かすだけなら動かせる（画面にシミュレーション結果が表示されないだけ）のですが、何も表示されないとやっぱつまらないので。

インストールの詳細は省略します。
[VcXsrv](https://sourceforge.net/projects/vcxsrv/) のサイトから最新版をダウンロードして実行、指示に従ってクリックしていけばインストールそのものは難しくないはずです。

インストールすると、スタートメニュー（やデスクトップ）に、「XLaunch」という項目が出来ます。これをクリック。

対話式でオプション設定できますが、取り敢えず「次へ(<ins>N</ins>)」を3回クリックして「完了」で起動できます。

起動するとタスクトレイに「X」を象ったアイコンが表示されます↓

![20180618_VcXsrv_005.png](https://qiita-image-store.s3.amazonaws.com/0/30400/cde88924-e0c0-8104-a211-862ff7512a4b.png)

マウスを載せるとこのように、「HOSTNAME:0.0 - x clients」のように表示されます。この「HOSTNAME:」の後の数字（この場合 `0`）が、ディスプレイIDと呼ばれるものになります。コマンドライン（ターミナル）からウィンドウを表示する際に必要になります。

その設定を、WSL 上の Ubuntu に設定します。
以下のコマンドにしたがってください：

```bash
USERNAME@HOSTNAME:~$ echo 'export DISPLAY=localhost:0.0' >> ~/.bashrc
USERNAME@HOSTNAME:~$ echo 'export "LIBGL_ALWAYS_INDIRECT=1"' >> ~/.bashrc
```

これは `~/.bashrc`（Bashの設定ファイル）に2行追加している記述です。vim 等のテキストエディタが利用できるならそれを利用して書き込んでも構いません。

「`DISPLAY=localhost:0.0`」の「`0.0`」がディスプレイIDの指定です。もし起動した VcXsrv の示すディスプレイIDが違っていたら（例：「HOSTNAME:1.0 - x clients」）、それに合わせて設定してください（例：「`DISPLAY=localhost:1.0`」）。

設定が終わったら、この設定ファイルを再読込して設定を有効化する必要があります。
Ubuntu を再起動するか、以下のコマンドを実行してください：

```bash
USERNAME@HOSTNAME:~$ source ~/.bashrc
```

# Python 3.6 のインストール(?)

Ubuntu 18.04 LTS には、標準で Python3.6.x（手元の環境では v3.6.5）がインストールされています。

```bash
USERNAME@HOSTNAME:~$ python3 -V
# => Python 3.6.5
```

Pythonのバージョンとしては3.6以上を想定していますので、これをこのまま利用します。

以下のコマンドを実行してパッケージマネージャと開発環境だけ追加でインストールします。

```bash
USERNAME@HOSTNAME:~$ sudo apt install python3-pip python3-dev
USERNAME@HOSTNAME:~$ pip3 install -U pip
```

2行目は、「`pip3`（＝Python のパッケージマネージャ）自身の最新版への更新」です。

## Python 3.6 のインストール for Ubuntu 16.04

Ubuntu 18.04 でどうしてもうまくいかなくて 16.04 で試している方、バージョン番号確認せずに「Ubuntu」を入れてしまった（結果 16.04 が入っている）方は、Python3.5.xがインストールされているので、以下の要領で Python 3.6 をインストールしてください（参考：[Installing Python 3.6.2 on WSL – smallsec](https://blog.smallsec.ca/2017/09/07/installing-python3-6-on-wsl/)、[ppa:jonathonf/python-3.6 が非公開になった - Qiita](https://qiita.com/pudding167/items/1d7226155cbfcd76bb1a) by @pudding167 ）：

```bash
USERNAME@HOSTNAME:~$ python3 -V
# => Python 3.5.x
USERNAME@HOSTNAME:~$ sudo add-apt-repository ppa:deadsnakes/ppa
USERNAME@HOSTNAME:~$ sudo apt install python3.6 python3-pip python3-dev
USERNAME@HOSTNAME:~$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1
USERNAME@HOSTNAME:~$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2
USERNAME@HOSTNAME:~$ python3 -V
# => Python 3.6.x
USERNAME@HOSTNAME:~$ pip3 install -U pip
```

最後から2つめのコマンドを打って画面に「Python 3.6.x」（最後の数字はその時インストールされた最新バージョンの番号になります）と表示されていればOK。

# OpenAI Gym のインストール

## 依存ライブラリ等のインストール

まずは OpenAI Gym を動作させるために必要なライブラリ群をインストールします。
基本的には [OpenAI Gym の README](https://github.com/openai/gym/blob/master/README.rst#installing-everything) 内の [Installing everything](https://github.com/openai/gym/blob/master/README.rst#installing-everything) に従って行く感じですが、微妙に違ってくるのでこちらで示しておきます。
以下に従ってください：

```bash
USERNAME@HOSTNAME:~$ sudo apt install -y python3-dev cmake zlib1g-dev libjpeg-dev xvfb libav-tools xorg-dev python3-gdbm python3-opengl libboost-all-dev libsdl2-dev swig ffmpeg
```

ポイントは、`python3-dev` `python3-gdbm` `python3-opengl` `ffmpeg` の4つ。
前者3つは、（Python 2.7 ではなく）Python 3.6 での動作に必要、最後の `ffmpeg` は動作結果を動画として記録する際に必要です。

## `gym` のインストール

`gym` 本体と、学習に必要な `chainerrl` をインストールします。これらは Python のパッケージとして用意されており、`pip3`（または `pip`）コマンドでインストールします。

```bash
USERNAME@HOSTNAME:~$ pip3 install --user numpy scipy chainer chainerrl
USERNAME@HOSTNAME:~$ pip3 install --user gym
USERNAME@HOSTNAME:~$ pip3 install --user "gym[atari]"
```

最後のは今回のハンズオンでは不要ですが、各種アーケードゲーム（のシミュレータ）環境が入ります。興味があったら試してみてください。

# 動作確認

ここまで来れば、OpenAI Gym の簡単なサンプルが動作するはずです。
動作確認のための簡単なスクリプトを用意してみました↓

```py:cartpole_sample.py
import gym
env = gym.make('CartPole-v0')
observation = env.reset()
for _ in range(1000):
    env.render()
    action = env.action_space.sample()
    observation, reward, done, info = env.step(action)
    if done:
        # break
        env.reset()
env.close()
```

↓実行すると、↓↓以下のようなウィンドウが表示されるはずです。

```bash
USERNAME@HOSTNAME:~$ python3 cartpole_sample.py
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30400/7b97f15c-a7a7-2b91-42b2-d24e0e6a5979.png)

倒立振子がぶるぶる震えながら、数秒でウィンドウが自動で閉じればOKです。

お疲れさまでした！

# 補足

## Windows 10 April 2018 Update の適用

この記事は、Windows 10 Pro バージョン 1803 で試行した結果を記録したものです。
「バージョン 1803」は、「[Windows 10 April 2018 Update](https://blogs.windows.com/windowsexperience/2018/04/27/make-the-most-of-your-time-with-the-new-windows-10-update/#0hf7szexkLrbdRzy.97)（[ブログ記事の日本語訳](https://blogs.windows.com/japan/2018/04/27/windows10_april_2018_update_announcing/#xRv872SZ3sSE54WW.97)）」適用後のバージョンです。
バージョン番号は、「スタートメニュー」→「設定（歯車アイコン）」→「システム（一番左上）」→「バージョン情報（左ペインの一番下）」と辿ると確認することが出来ます。

![win10v1803.png](https://qiita-image-store.s3.amazonaws.com/0/30400/9862bac6-a9c4-c5de-4fbe-e795c150f027.png)

この番号が 1803 より小さいと、この最新の「Windows 10 April 2018 Update」が適用されていない状態です（さらに 1709 より小さいと、WSL の有効化に必要な「Windows 10 Fall Creators Update」も適用されていない状態です）。

適用するには、「設定」→「更新とセキュリティ（左下）」→「Windows Update（デフォルトで開いている状態）」を選択するか、以下のサイトで「今すぐアップデート」をクリックしてください。

https://www.microsoft.com/ja-jp/software-download/windows10

更新時、何度も再起動を繰り返したり、非常に時間がかかることがあります。お休み前やお出かけ前など、時間のあるときに実施するようにしましょう。

# 参考

+ [Windows support · Issue #11 · openai/gym](https://github.com/openai/gym/issues/11#issuecomment-246585248)
+ [Windows 10でLinuxプログラムを利用可能にするWSL（Windows Subsystem for Linux）をインストールする（バージョン1803対応版）](http://www.atmarkit.co.jp/ait/articles/1608/08/news039.html)
+ [Errors in Ubuntu 18.04 on Windows 10 - Microsoft Community](https://answers.microsoft.com/en-us/windows/forum/windows_10-windows_install/errors-in-ubuntu-1804-on-windows-10/fe349f3d-3d58-4d90-9f8f-c14d7c12af8b)
+ [Installing Python 3.6.2 on WSL – smallsec](https://blog.smallsec.ca/2017/09/07/installing-python3-6-on-wsl/)
+ [WindowsのWSLにOpenAI gymとchainerrlをインストールした時のメモ](https://qiita.com/exy81/items/31bcf5c3d83c1ee8662e)