MkItYs

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

images

世界モデルの試みとTransformer :IRIS, Docker, GCP

images

世界モデルの試みにトランスフォーマ(Transformer )を取り入れた実装、IRISを試します。


images

関連


世界モデルの実装「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$ 
images

再生: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>
images

※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/, ...)。