世界モデルの試みにトランスフォーマ(Transformer )を取り入れた実装、IRISを試します。
関連
- ◯
- 世界モデルの実装「Dreamer V3」を、クラウドのコンテナで動かす:Dreamer, 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
概要
世界モデルの試みは回帰型ニューラルネット(RNN )を使う実装が知られていますが、IRISは、そこにトランスフォーマ(Transformer )を採用したものです。
このような試みはいくつかありますが、たぶん現時点で(2023.04 )、もっとも評価の高いものです:
- ・
- https://openreview.net/forum?id=vhFu1Acb0xb
- ・
- https://github.com/eloialonso/iris
ここではこれを、クラウドのGPUで動かしてみます。[※1]
- ※1
- とはいえ、Transformer による実装はGPUふくめリソースを大量に必要とするので、最後まで試すことはしません……
設置
リモートのサーバ(クラウド)上で、コンテナとソースコードのためのフォルダを作り、コードを取得します:
$ mkdir ${dir_docker} $ mkdir ${dir_project} $ cd ${dir_docker} $ vi Dockerfile $ cd ${dir_project} $ git clone --depth=1 https://github.com/eloialonso/iris.git
Dockerfileは、次を使っています:
FROM ubuntu:22.04 RUN apt-get -y update RUN apt-get -y upgrade RUN apt-get -y install python3 RUN apt-get -y install pip RUN ln -s /usr/bin/python3.10 /usr/bin/python
コンテナを作成〜起動します:
# 作成 $ docker build --no-cache -t ${container_image} ${dir_docker} # 反映 $ docker commit ${container} ${container_image} # 起動 $ docker run -it --rm --gpus all -v ${dir_project}:${dir_project} --name ${container} ${container_image}
コンテナ上で、必要なライブラリ群を設置します(適宜、コンテナのイメージに反映させます):
$ apt install libgl1-mesa-dev $ apt install libglib2.0-0 $ pip install torch==1.11.0 $ pip install torchvision==0.12.0 $ cd ${dir_project}/iris $ pip install -r requirements.txt # VNCで描画する場合 $ apt install xvfb $ apt install x11vnc Geographic area: 6 Time zone: 79
学習
トレーニングの過程は(既定の設定では)WandBに転送されるので、必要ならアカウントを作っておきます:
- ・
- https://wandb.ai/
WandBにログインしたあと、ハイパーパラメータを調整し、訓練を始めます(ここではブロック崩しを試しています):[※1]
○実行 $ wandb login $ cat /root/.netrc $ cd ${dir_project}/iris/config $ vi trainer.yaml # ハイパーパラメータの調整 $ cd ${dir_project}/iris $ python3 src/main.py env.train.id=BreakoutNoFrameskip-v4 common.device=cuda:0 wandb.mode=online ... <ctrl+c>
- ※1
- 自分のクラウドの環境では、GPUのメモリが足りなかったので(15GB)、バッチサイズを減らしました:
tokenizer: batch_num_samples: 128
トレーニング過程のデータやパラメータが更新されたモデルは、日時で区分けされたフォルダに置かれます:
$ cd ${dir_project}/iris/outputs/2023-03-31/13-26-50 $ ls -l drwxr-xr-x 3 root root 4096 Mar 31 13:27 checkpoints drwxr-xr-x 2 root root 4096 Mar 31 13:26 config -rw-r--r-- 1 root root 0 Mar 31 13:26 main.log drwxr-xr-x 4 root root 4096 Mar 31 13:26 media drwxr-xr-x 2 root root 4096 Mar 31 10:36 scripts drwxr-xr-x 6 root root 4096 Mar 31 10:41 src drwxr-xr-x 3 root root 4096 Mar 31 13:26 wandb $ cd ${dir_project}/iris/outputs/2023-03-31/13-26-50/checkpoints $ ls -l drwxr-xr-x 2 root root 4096 Mar 31 13:53 dataset -rw-r--r-- 1 root root 431 Mar 31 13:53 epoch.pt -rw-r--r-- 1 root root 126502241 Mar 31 13:53 last.pt -rw-r--r-- 1 root root 431 Mar 31 13:53 num_seen_episodes_test_dataset.pt -rw-r--r-- 1 root root 32444925 Mar 31 13:53 optimizer.pt$
再生:X Window
訓練済みのモデルの挙動は、次の手順で確かめることができますーーコンテナは、Xのポートフォワードを受け入れるようにして起動し:[※1]
$ docker run -it --rm \ --gpus all \ -v ${dir_project}:${dir_project} \ --env DISPLAY=${DISPLAY} \ --net host \ -v ${HOME}/.Xauthority:/root/.Xauthority \ --name ${container} \ ${container_image}
コンテナ上で、モデルを稼働させます:
$ export LIBGL_ALWAYS_INDIRECT=1 $ cd ${dir_project}/iris/outputs/2023-03-31/13-26-50 $ ${dir_project}/iris/scripts/play.sh ... <ctrl+c>
- ※1
- 手元のパソコンでは、Xサーバの起動〜クライアントの受け入れ、Xのポートフォワードによるログイン(ssh -X)が必要になります。
再生:VNC
なおXウィンドウは描画が重いので、ブロック崩しのような挙動の大きなゲームは、VNCを使う方がスムーズに再生されますーーコンテナは、VNCのためのポートを開けて起動し:
$ docker run -it --rm \ -p 5900:5900 \ --gpus all \ -v ${dir_project}:${dir_project} \ --name ${container} \ ${container_image}
コンテナ上でXサーバに描画させた内容を、VNCサーバに送るようにし、モデルを稼働させます:[※1]
$ export n=1 $ export DISPLAY=:${n} $ Xvfb :${n} -screen 1 400x525x24 & $ x11vnc -display :${n} -forever -passwd ******** & $ cd ${dir_project}/iris/outputs/2023-03-31/13-26-50 $ ${dir_project}/iris/scripts/play.sh
- ※1
- 手元のパソコンでは、開けたポートに対してVNCクライアントで接続します(vnc://<remote_server>:5900/, ...)。