#概要
GameGanとはゲームの画像と操作履歴をGeneratorに学ばせて、そのゲームを再現できるというものです。
このコードを動作させる方法を説明します。
動作させる方法のメモなので、処理内容については詳しくは説明していないので、内容については論文を読むことを推奨します。
#動作環境
以下の環境で動作させましたが、設定で小さくしたモデルをギリギリ動作可能というレベルでした。
おそらく実用レベルのものを作ろうと思うと、ビデオメモリお化けやGPU界のポルシェとかが必要になるだろうなと思っています。(うまく設定すれば必要ないかもしれません。)
また、最初はWindowsで動作させようとしたのですが、pytorchのバージョン1.4.0がうまくインストールできなかったので、Ubuntuで動作させることを推奨します。
OS | Ubuntu 20.04 LTS |
---|---|
CPU | intel core i7 8700 |
GPU | GeForce RTX 2060 SUPER |
メモリ | 32GB |
#データの作成
まずは上のリポジトリをクローンし、以下のコマンドを実行する。
docker image build -t wm:1.0 -f docker/Dockerfile.wm .
docker container run -p 8888:8888 --gpus '"device=0"' --detach -it --name wm wm:1.0
docker attach wm
すると 「/home/ubuntu/WM」にいるはずなので、「cd WorldModels」で移動する。
次に以下のコードを実行することで、データの作成が開始される、結構時間がかかるので気長に待つ。
処理が終わると、「results/WorldModels/DoomTakeCover-v0/record」の下にデータが入っている。
bash launch_scripts/wm_doom.bash
コンテナをCtrl+P,Ctrl+Qで抜け、「sudo docker cp」を使って、コンテナ内のデータをホストにある「GameGAN_code/data/vizdoom」へコピーする。
#コードの修正と加筆
このままではデータを読み込めないので、「GameGAN_code/data/dataloader.py」を以下のように修正します。
これで、正常にゲームの画像と操作履歴を読み込むことができます。
#globをimportする
import glob
class vizdoom_dataset(data_utils.Dataset):
def __init__(self, opts, set_type=0, permute_color=False, datadir=''):
self.opts = opts
self.set_type = set_type
self.permute_color = permute_color
self.samples = []
#ここをコメントアウト
#list_=os.listdir(datadir + "/*.npz")
#下の1行を追加
list_ = glob.glob(datadir + "/*.npz")
num_data = len(os.listdir(datadir))
print(num_data)
if set_type == 0:
sample_list = list(range(0, int(num_data*0.9)))
else:
sample_list = list(range(int(num_data*0.9), num_data))
#ここをコメントアウト、ファイル名はシード値です
#for el in sample_list:
# self.samples.append('%s/%d.npy' % (datadir, el))
#下の2行を追加
for el in list_:
self.samples.append(el)
self.end_bias = 0
if utils.check_arg(self.opts, 'end_bias'):
self.end_bias = self.opts.end_bias
def __len__(self):
return len(self.samples)
def __getitem__(self, idx):
fn = self.samples[idx]
#下をコメントアウト、読み込むデータにitem()はありません
#data = np.load(fn, allow_pickle=True).item()
#下の1行を追加
data = np.load(fn, allow_pickle=True)
#以下コードが続く
ビデオメモリ少ないGPUを使う場合は、GameGAN_code/scripts/vizdoom_multi.shを以下のように書き換えてください。
以下の設定でGeForce RTX 2060 SUPERがギリギリ動くことを確認しました。
なにをしたのかというと、私も中途半端にしか理解していないのですが、generatorへ入力する画像の枚数を表す「num_steps」を半分に減らし、初期の予測画像を再起的に処理する枚数を設定する「warm_up」を「num_steps」に設定した数よりも少なくし、何かの窓長を設定する「config_temporal」を「num_steps」以下にしています。(実は「config_temporal」を減らすだけで動くかもしれません。)
#!/usr/bin/env bash
python main_parallel.py \
--data vizdoom:./data/vizdoom \
--log_dir ./results/ \
--num_steps 16 \
--warm_up 8 \
--warmup_decay_epoch 60 \
--bs 4 \
--num_components 2 \
--fine_mask \
--config_temporal 16 \
--do_memory \
--cycle_loss \
--alpha_loss_multiplier 0.000075 \
--softmax_kernel \
--sigmoid_maps \
--save_epoch 5 \
--rev_multiply_map \
--num_gpu 1 \
--temperature 0.1 \
--nfilterG 16 \
--spade_index 2 \
--seed 1 \
--img_size 64 \
--end_bias 0.5 \
--simple_blocks
#実行
「GameGAN_code/scripts/vizdoom_multi.sh」を実行すれば大体、1日くらいすれば、ちゃんとした画像が作成されるようになります。
結果はtensorboardで確認できます。
「tensorboard --port=PORT --logdir=./results」
#参考文献
Learning to Simulate Dynamic Environments with GameGAN
https://github.com/nv-tlabs/GameGAN_code
https://github.com/zacwellmer/WorldModels