AI | ML/Reinforcement Learning

[ML-Agent] Unity 게임을 gym.Env 환경으로 변경

깜태 2021. 9. 3. 15:28
728x90

유니티로 만든 게임을 파이썬으로 직접 강화학습을 돌려보고 싶어 이것저것 알아보다 못찾아서 직접 코드를 짜야하나 고민하던 중, 다행히도 ML-Agent에서 gym.Env 환경으로 변형해줄 수 있는 내용을 발견하였다.

 

사용법은 생각보다 간단하다.

gym_unity 설치

pip install gym_unity

 

gym_unity로 유니티 게임을 gym.Env 환경으로 감싸기

from mlagents_envs.environment import UnityEnvironment
from gym_unity.envs import UnityToGymWrapper
unity_env = UnityEnvironment("path")
env = UnityToGymWrapper(unity_env)

 

이후에는 개인적으로 stable-baselines3 라이브러리를 잘 사용하고 있어서 이 부분으로 학습했다.
stable-baselines3에 대한 학습 방법은 이전 글에 적어놓았다.

학습 코드

from mlagents_envs.environment import UnityEnvironment as UE
from gym_unity.envs import UnityToGymWrapper
from stable_baselines3.ppo import PPO
from stable_baselines3.common.callbacks import EvalCallback

unity_env = UE(file_name="UnityEnvironment", seed=1, side_channels=[])
env = UnityToGymWrapper(unity_env, uint8_visual=False)
log_dir = 'unity_log/'
eval_callback = EvalCallback(env, best_model_save_path=log_dir,
                                 log_path=log_dir, eval_freq=10000,
                                 deterministic=False, render=True)

ppo = PPO('MlpPolicy', env=env, verbose=1)
ppo.learn(1e+6, callback=eval_callback)

 

단점으로는 한 게임 내에서 agent가 여러개인 경우는 에러로 넘어가서, 1 게임에 1 에이전트로 학습하였다.

학습 중 예시

에러코드 예시

gym_unity.envs.UnityGymException: There can only be one Agent in the environment but 12 were detected.

 

출처 : https://github.com/Unity-Technologies/ml-agents/tree/main/gym-unity

728x90