GameGan-codeが動いたので、動かし方のメモ


#概要

https://github.com/nv-tlabs/GameGAN_code

　GameGanとはゲームの画像と操作履歴をGeneratorに学ばせて、そのゲームを再現できるというものです。
　このコードを動作させる方法を説明します。
　動作させる方法のメモなので、処理内容については詳しくは説明していないので、内容については[論文](https://arxiv.org/abs/2005.12126)を読むことを推奨します。

#動作環境
　以下の環境で動作させましたが、設定で小さくしたモデルをギリギリ動作可能というレベルでした。
　おそらく実用レベルのものを作ろうと思うと、[ビデオメモリお化け](https://www.nvidia.com/en-us/design-visualization/rtx-a6000/)や[GPU界のポルシェ](https://www.nvidia.com/ja-jp/data-center/a100/)とかが必要になるだろうなと思っています。（うまく設定すれば必要ないかもしれません。）
　また、最初はWindowsで動作させようとしたのですが、pytorchのバージョン1.4.0がうまくインストールできなかったので、Ubuntuで動作させることを推奨します。

| OS | Ubuntu 20.04 LTS |
|:--|:--|
| CPU | intel core i7 8700 |
| GPU | GeForce RTX 2060 SUPER |
| メモリ | 32GB |

#データの作成

https://github.com/zacwellmer/WorldModels

　まずは上のリポジトリをクローンし、以下のコマンドを実行する。


```
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
```

　コンテナを<b>Ctrl+P,Ctrl+Q</b>で抜け、「sudo docker cp」を使って、コンテナ内のデータをホストにある「GameGAN_code/data/vizdoom」へコピーする。


#コードの修正と加筆
　このままではデータを読み込めないので、「GameGAN_code/data/dataloader.py」を以下のように修正します。
　これで、正常にゲームの画像と操作履歴を読み込むことができます。

```python: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://arxiv.org/abs/2005.12126)
[https://github.com/nv-tlabs/GameGAN_code](https://github.com/nv-tlabs/GameGAN_code)
[https://github.com/zacwellmer/WorldModels](https://github.com/zacwellmer/WorldModels)