Edited at

無料でMinecraftを始める【OpenAI】【MARLO 2018】

ゲーム機はLinuxマシンっていうのがおすすめです。

一家に一台はだいたいあると思います。

あまり聞かないかもしれませんが、3DSにもPSvitaにも劣らない最高のゲーム機です。

https://www.ubuntu.com/

と適当な茶番は置いといて、AIの研究用にMicrosoft×OpenAIでMinecraftのpythonモジュール(?)を提供してるっぽいのでやってみました。

(万が一ですが、この↑の意味がわからないという人は、タダでマイクラをしようなんて考えは捨てておとなしくソフトを買いましょう)


MARLO 2018

すこし逸れますが、(深層強化学習系を想定した)AIのMinecraftを使ったコンペがあって、一位の賞金は100万円とかだそうです。

https://www.crowdai.org/challenges/marlo-2018

https://github.com/crowdAI/marLo

これに挑戦するだけ挑戦してみようかと思ってやってみました。

ざっくりですが、依存関係が

gym(OpenAI) <- malmo <- marlo(←これがしたい!)

となっていて、リポジトリはそれぞれ

https://github.com/openai/gym

https://github.com/Microsoft/malmo

https://github.com/crowdAI/marLo

でしゅ。

(これを理解せずmalmoをインスコしようとしていてドブってました)


環境構築

とどのつまり https://github.com/crowdAI/marLo だけに従えばよかったです。

anacondaがrecommendedらしいのでpyenv×anacondaでやりました。

すごく簡単でした&マイクラで普通に遊ぶこともできてびっくり。


開発環境


  • ubuntu18.04

  • GeForce GTX 1060

  • cuda9.0

  • cudnn7

    (下手にdockerとか使う方法を採用するとgpu周りとゲーム画面の描画周りが面倒なのでそこらへんには注意しました)

  • pyenv環境構築済み


Installation

https://marlo.readthedocs.io/en/latest/installation.html

GUIのanaconda(?)ではなくpyenvでanacondaを使うので少しだけ変えています。

$ pyenv install anaconda3-5.2.0 # 最新版のanaconda3

$ pyenv local anaconda3-5.2.0
$ echo ". /home/nama/.pyenv/versions/anaconda3-5.2.0/etc/profile.d/conda.sh" >> ~/.zshrc # あるいは ~/.bashrc等
$ source ~/.zshrc
$ conda create python=3.6 --name marlo
$ conda config --add channels conda-forge
$ conda activate marlo
$ conda install -c crowdai malmo
$ pip install -U marlo
$ python -c "import marlo" # エラーが出ないか確認。
$ python -c "from marlo import MalmoPython" # エラーが出ないか確認。

以上


Single Agent Example

https://marlo.readthedocs.io/en/latest/usage/singleagent_example.html

まずマイクラを起動して、pythonからそれを操作する。


マイクラの起動

$MALMO_MINECRAFT_ROOT/launchClient.sh -port 10000

anaconda側で勝手に環境変数"MALMO_MINECRAFT_ROOT"を設定してくれているみたい。

なんか起動までに数十秒かかるのとjavaなんとかで警告が出るものの動いたので良し。

ちなみに、

普通にゲーム画面をマウスで操作すれば、普通にマイクラができました(合法無料マイクラktkr

利用規約は守りましょう。

最初、視界の操作方法がよくわかんなかったですが、ゲームウィンドウをクリックして選択してEnterキーを推すと、マウスポインターで視界を操作できるようになります。再びEnterキーでマウスの操作を戻せます。


エージェントの操作

#!/usr/bin/env python

# $MALMO_MINECRAFT_ROOT/launchClient.sh -port 10000

import marlo
client_pool = [('127.0.0.1', 10000)]
join_tokens = marlo.make('MarLo-MazeRunner-v0',
params={
"client_pool": client_pool
})
# As this is a single agent scenario,
# there will just be a single token
assert len(join_tokens) == 1
join_token = join_tokens[0]

env = marlo.init(join_token)

observation = env.reset()

done = False
while not done:
_action = env.action_space.sample()
obs, reward, done, info = env.step(_action)
print("reward:", reward)
print("done:", done)
print("info", info)
env.close()

実行すると、

2

{}
reward: 0
done: False
info {'has_mission_begun': True, 'is_mission_running': True, 'number_of_video_frames_since_last_state': 3, 'number_of_rewards_since_last_state': 0, 'number_of_observations_since_last_state': 1, 'mission_control_messages': ['<?xml version="1.0" encoding="UTF-8"?><ping/>'], 'observation': {'yawDelta': -0.5, 'nextSubgoal': {'XPos': 43.5, 'YPos': 227.0, 'ZPos': 1.5, 'description': 'MazeSubpoint_2'}}}
reward: 0
done: False
info {'has_mission_begun': True, 'is_mission_running': True, 'number_of_video_frames_since_last_state': 3, 'number_of_rewards_since_last_state': 0, 'number_of_observations_since_last_state': 1, 'mission_control_messages': [], 'observation': {'yawDelta': -0.5, 'nextSubgoal': {'XPos': 43.5, 'YPos': 227.0, 'ZPos': 1.5, 'description': 'MazeSubpoint_2'}}}
reward: 0
done: False
info {'has_mission_begun': True, 'is_mission_running': True, 'number_of_video_frames_since_last_state': 3, 'number_of_rewards_since_last_state': 0, 'number_of_observations_since_last_state': 1, 'mission_control_messages': [], 'observation': {'yawDelta': -0.5, 'nextSubgoal': {'XPos': 43.5, 'YPos': 227.0, 'ZPos': 1.5, 'description': 'MazeSubpoint_2'}}}
reward: 0


まあ自分はjupyter派なので

pip install jupyter

jupyter notebook

でこんな感じ

(エージェントの行動が情緒不安定すぎるw)

でした。

以上っ!


注意点


  • デフォルトではconda activate marloをしたディレクトリでしかminecraftを起動できなさそう

  • jupyterを使うときは、conda activate marloをしたディレクトリで。


最後に

動かない、ここ違うだろ等々あったらコメントください

\def\textlarge#1{%

{\rm\Large #1}
}
\def\textsmall#1{%
{\rm\scriptsize #1}
}

(あと精一杯小声で)

  $\textsmall{い い ね ほ ち い}$