MkItYs

MkItYs > 音楽・漫画・VR・自律制御 > 

images

世界モデルの実装「Dreamer V3」を、クラウドのコンテナで動かす:Dreamer, Docker, GCP

images

世界モデルを実装する試み「Dreamer V3」を、クラウドのコンテナで動かす手順です。


images

関連


世界モデルの試みとTransformer :IRIS, Docker, GCP
クラウドのコンテナでGPUを使う:GPC, Docker, nvidia-driver, cuda-toolkit
高機能のウィンドウシステム:X Window System (XQuartz) , Docker, OpenGL, Tcl/Tk, Xvfb, x11vnc
コンテナの各種メディアを、遠隔からあつかう(音声・画像・映像):Docker, ssh, rsync, sshfs, nginx, Tk (tkinter) , OpenCV, Jupyter Notebook

検証


GPUクラウド:GCP (T4)
Xサーバ:XQuartz
機械学習フレームワークのコンテナ:tensorflow/tensorflow (Ubuntu 20.04)
インタプリタ:Python 3.10

概要


言語モデルが大規模になって、かなりヒトらしい応答をするようになってきました。[※1]

ただ次の論文によれば、規模を大きくしても乗り越えられそうにない障壁もみえてきたようです:[※2]

Sparks of Artificial General Intelligence: Early experiments with GPT-4
https://arxiv.org/abs/2303.12712

その要因はけっきょく、逐次的なトークンの予測と出力そのものにあるようですけど。[※3]

そしてこの障壁を乗り越えるには、次の「世界モデル」(ルカン)のような構造が考えられるかもしれないと、先の論文は示唆しています:[※4]

A Path Towards Autonomous Machine Intelligence
https://openreview.net/pdf?id=BZ5a1r-kVsf

※1
とくに(抽象から具体の各レベルで)文脈を強力に読むという点では、すでにヒトを超えたといってもいいかもしれません(フェルミ問題を解く、マルチモーダル性を示す、身体性や心の理論があるかような応答をする)。
※2
自身の応答を(内部的に)批判し〜修正する、発想の転換や飛躍を必要とする、といった「思考」が苦手のようですーーそもそも大量のデータを与え〜長い時間をかけて訓練しないといけないという点で、ヒトの知性とはかけ離れていますしね。
※3
この前提にあるのが意味の分布仮説(単語の意味は周辺の単語から形成される)ですが、大規模言語モデルの成功は、これを愚直に進めた結果といえるかもしれません。
※4
世界モデルは、知覚からの予測と行動による修正を、機械に組み込むものですーーこれによって、(ヒトのような)少量のリソースからの速い学習を可能にすることを目標にしていますーーなおこのような考え方をまとめて「世界モデル」という言葉を与え、(特定の狭い領域ではあるけれど)具体的な実装を示したものが次の論文です:
World Models
https://arxiv.org/abs/1803.10122

概要:Dreamer V3


この「Dreamer」は、世界モデルの考え方に沿って、強化学習を行うプロジェクトです。

もちろん汎用的なものではなく、いろいろと特化していますがーーそれでも「マインクラフト」の攻略で大きな成果を上げ、世界モデルの威力を示した功績は大きいでしょうし:[※2]

https://github.com/danijar/dreamerv3

※1
この実装は次の「PlaNet」のコードを受け継いています(作者自身も著者のひとり)ーー最近は、このモデルを現実のロボットに適用させるプロジェクトに参加したりしていますね:
https://github.com/google-research/planet
https://www.youtube.com/watch?v=xAXvfVTgqr0

設置:Dreamer V3


以下、リモートのサーバ(クラウド)上のコンテナで、「Dreamer V3」を動かす手順です:

まずリモートのサーバでプロジェクトのフォルダを作り、ソースコードを取得しておきます。また訓練時のログを格納するフォルダも作っておき、コンテナを終了させてもログが消えないようにします:[※1]

$ mkdir ${project}

$ cd ${project}
$ mkdir opt
$ mkdir vol_root_logdir # 訓練時のログを格納するフォルダ

$ cd ${project}/opt
$ git clone --depth=1 https://github.com/danijar/dreamerv3.git

機械学習フレームワーク(tensorflow)のコンテナを取得し、起動しますーーまた適宜、コンテナに加えた差分を、プロジェクトのイメージに反映させます:

$ docker pull tensorflow/tensorflow:latest-gpu

# 起動:初回
$ docker run -it --rm \
--gpus all \
-v ${project}/opt:/opt \
-v ${project}/vol_root_logdir:/root/logdir \
--name ${container} \
tensorflow/tensorflow:latest-gpu

# 反映:差分
$ docker commit ${container} ${image}

コンテナでは、インタプリタ(python)がすこし古いのでバージョンを上げ、プロジェクト向けのインタプリタの専用環境を作ります:

$ python --version
Python 3.8.10

$ apt update
$ add-apt-repository ppa:deadsnakes/ppa
$ apt update

$ apt install python3.10
$ apt install python3.10-venv
$ update-alternatives --install /usr/bin/python python /usr/bin/python3.10 10
$ update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 10

$ python --version
Python 3.10.10
$ python3 --version
Python 3.10.10

$ cd ~/
$ python -m venv ${env_python}
$ source ~/${env_python}/bin/activate

インタプリタの専用環境で、GPUに対応した数値計算用のライブラリ(jax )を取得し、プロジェクトと関連のライブラリ群をインポートします:

$ python -m pip install --upgrade pip

$ pip install --upgrade "jax[cuda]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
$ python
> import jax
> jax.default_backend()
'gpu'
> <ctrl+d>

$ pip install dreamerv3

※1
これはコンテナを起動するユーザの権限で実行します。

実行:Dreamer V3


実行時は、ログをモニタするウェブサーバ(tensorboard)を使うので、ネットワークのポート(6006)を開けてコンテナを起動します:

$ docker run -it --rm \
--gpus all \
-p 6006:6006 \
-v ${project}/opt:/opt \
-v ${project}/vol_root_logdir:/root/logdir \
--name ${container} \
${image}

インタプリタの専用環境環境に入り:

$ source ~/${env_python}/bin/activate

ログのモニタ用サーバをバックグランドで起動したあと、サンプルの訓練スクリプトを立ち上げます:[※1]

$ tensorboard --bind_all --logdir /root/logdir &

$ cd /opt/dreamerv3
$ python example.py

# 終了:
<ctrl+c>
$ deactivate

訓練の状況は、パソコンのウェブブラウザから確認できます:

http://<remote_server>:6006/

images
images

※1
訓練をいったん終了させても、残ったログから再開するように設定されています。

概要:Crafter


サンプルの訓練スクリプトは、(この作者自身が作った)強化学習の評価用2Dゲーム「Crafter 」を対象にしています:

https://github.com/danijar/crafter
images

設置:Crafter


ゲームの世界と操作(強化学習の環境と行動にあたる)を確認したい場合、パソコン側のXサーバに画面を表示することで体験できます。[※1]

まずリモートのコンテナで、Xサーバと描画用のライブラリを設置しておきます(ゲーム自体は、先のプロジェクトの設置時にインストールされています):

$ apt install xauth

$ pip install pygame
# pip install crafter

※1
インターネット越しなので、それなりの遅延はあります。

実行:crafter


実行時は、パソコンのXサーバでXクライアントからの描画を許可したあと、Xのフォワードモードで遠隔シェルを起動し、リモートのサーバにログインします:

$ xhost +
$ ssh -X ${u}@${h}

リモートのサーバでは、Xのクライアントとして認証できるようにコンテナを起動します:

※起動
$ docker run -it --rm \
--env DISPLAY=${DISPLAY} \
--net host \
--mount type=bind,src=${HOME}/.Xauthority,dst=/root/.Xauthority \
--name ${container} \
${image}

インタプリタの専用環境環境に入り:

$ source ~/${env_python}/bin/activate

2Dゲームを起動します(パソコン側にゲームの画面が表示されます):

$ python -m crafter.run_gui

# 終了:
<ctrl+c>
$ deactivate