ロゴ ロゴ

強化学習ソニック(下準備編)

タイトルの通りSonic The Hedge Hogを強化学習するための下準備です.

環境

Windows10: バージョン21H1(OSビルド 19043. 1052)
Python 3.8 (anaconda環境)
Pytorch 1.8.1
numpy 1.19.4
gym-retro 0.8.0
gym 0.17.3

準備

gym-retroをインストールします.以下コマンドでインストール

pip install gym-retro

Romがあれば実行環境をチェックします.

import retro
retro.data.list_games()
'''
1942-Nes['1Player.Level1']
1943-Nes['Level1']
3NinjasKickBack-Genesis['1Player.Colt.Level1']
8Eyes-Nes['1Player.Arabia.Level1']
~省略~
SonicAndKnuckles-Genesis['Level1']
SonicAndKnuckles3-Genesis['AngelIslandZone.Act1', 'AngelIslandZone.Act2', 
'CarnivalNightZone.Act1', 'CarnivalNightZone.Act2', 'DeathEggZone.Act1', 
'DeathEggZone.Act2', 'FlyingBatteryZone.Act1', 'FlyingBatteryZone.Act2', 
'HiddenPalaceZone', 'HydrocityZone.Act1', 'HydrocityZone.Act2',
'IcecapZone.Act1', 'IcecapZone.Act2','LaunchBaseZone.Act1',
'LaunchBaseZone.Act2', 'LavaReefZone.Act1', 
'LavaReefZone.Act2', 'MarbleGardenZone.Act1', 
'MarbleGardenZone.Act2', 'MushroomHillZone.Act1', 
'MushroomHillZone.Act2', 'SandopolisZone.Act1', 'SandopolisZone.Act2']
SonicBlast-Sms['Level1']
SonicBlastMan-Snes['Level1']
SonicBlastManII-Snes['1Player.SonicBlastMan.Level1']
SonicTheHedgehog-Genesis['GreenHillZone.Act1',
'GreenHillZone.Act2', 'GreenHillZone.Act3',
'LabyrinthZone.Act1', 'LabyrinthZone.Act2',
'LabyrinthZone.Act3', 'MarbleZone.Act1', 
'MarbleZone.Act2', 'MarbleZone.Act3',
'ScrapBrainZone.Act1', 'ScrapBrainZone.Act2', 'SpringYardZone.Act1',
'SpringYardZone.Act2', 'SpringYardZone.Act3', 
'StarLightZone.Act1', 'StarLightZone.Act2', 'StarLightZone.Act3']
SonicTheHedgehog-Sms['Level1']
SonicTheHedgehog2-Genesis['AquaticRuinZone.Act1', 
'AquaticRuinZone.Act2', 'CasinoNightZone.Act1', 
'CasinoNightZone.Act2', 'ChemicalPlantZone.Act1',
'ChemicalPlantZone.Act2', 'EmeraldHillZone.Act1', 'EmeraldHillZone.Act2',
'HillTopZone.Act1', 'HillTopZone.Act2', 
'MetropolisZone.Act1', 'MetropolisZone.Act2', 'MetropolisZone.Act3', 
'MysticCaveZone.Act1', 'MysticCaveZone.Act2', 'OilOceanZone.Act1', 
'OilOceanZone.Act2', 'WingFortressZone']
SonicTheHedgehog2-Sms['Level1']
SonicTheHedgehog3-Genesis['Level1']
SonicTheHedgehogRandomLevels-Genesis['Start']
SonicWings-Snes['1Player.America.Keaton']
'''

見た感じ989個のゲームがRomさえあれば,メモリの解析などをせずとも実行可能な状況にあるみたいです.ここにないゲームでも,ゲームボーイ系統のゲームなども実行できるみたい.(要メモリ解析)
今回はSonic The Hedge Hog Genesisを使用します.その後,Steamでゲームを購入.
ターミナルで以下のコマンドを実行してゲームをインポートしておきます.

python -m retro.import.sega_classics
Steam Username: 各自のsteamアカウントのユーザネーム
Steam Password (leave blank if cached):
Steam Guard code: steamガードを使用している人のみ
Downloading games...
Installing games...
Importing SonicTheHedgehog-Genesis
Imported 1 games

これでインポートすることが出来ました.
今回はA2Cの勉強を目的としているため複数環境を作成できるようにします.
これをするには,Wrapperが必要になります.ラップしないで複数作成しようとすると以下のようにエラーがでます.

import gym
import retro

ENV = "SonicTheHedgehog-Genesis"
MAP = "GreenHillZone.Act1"

env1 =retro.make(ENV,MAP)
env2 = retro.make(ENV,MAP)
env3 = retro.make(ENV,MAP)
env4 = retro.make(ENV,MAP)
'''
RuntimeError: Cannot create multiple emulator instances per
process, make sure to call env.close() on each 
environment before creating a new one
'''

そこでbaselinesを使用します.ここにかいてあるようにpipを使用してインストールするか,gitのcloneを使用して直接使用します.今回はpytorchでスクラッチ開発するためcloneをして使用します.その後以下のように実行環境のテストをしました

#%%
import retro
import numpy as np
import torch
from baselines.common.vec_env.subproc_vec_env import SubprocVecEnv
#%%
if __name__ == "__main__":
    ENV = "SonicTheHedgehog-Genesis"
    MAP = "GreenHillZone.Act1"
    def make_env(env_id,rank,seed=0):
        def _thunk():
            env = retro.make(ENV,MAP)
            env.seed(seed + rank)
            return env
        return _thunk
    seed_num = torch.set_num_threads(4)
    envs = [make_env(seed_num,i) for i in range(4)]
    envs = SubprocVecEnv(envs)
    envs.reset()
    while(1):
        envs.render()
        action = np.random.randint(0,envs.action_space.n-1,size=(4,1))
        envs.step(action)

実行結果

おわり
これretroでインポートしたあとにsteamでゲーム返品したらどうなるんだろう…

参考

つくりながら学ぶ! 深層強化学習 PyTorchによる実践プログラミング 小川/雄太郎

コメント入力

関連サイト