世界モデルを実装する試み「Dreamer V3」を、クラウドのコンテナで動かす手順です。
関連
- ◯
- 世界モデルの試みと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/
- ※1
- 訓練をいったん終了させても、残ったログから再開するように設定されています。
概要:Crafter
サンプルの訓練スクリプトは、(この作者自身が作った)強化学習の評価用2Dゲーム「Crafter 」を対象にしています:
- ・
- https://github.com/danijar/crafter
設置: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