에이전트 기록하기¶
훈련 중이나 에이전트를 평가할 때, 에피소드 동안의 에이전트 행동을 기록하고 누적 총 보상을 로깅하는 것이 흥미로울 수 있습니다. 이는 두 가지 래퍼를 통해 달성할 수 있습니다: :class:`RecordEpisodeStatistics`와 :class:`RecordVideo`입니다. 첫 번째는 총 보상, 에피소드 길이, 소요 시간과 같은 에피소드 데이터를 추적하고, 두 번째는 환경 렌더링을 사용하여 에이전트의 mp4 비디오를 생성합니다.
우리는 두 가지 유형의 문제에 대해 이러한 래퍼를 적용하는 방법을 보여줍니다. 첫 번째는 모든 에피소드에 대한 데이터를 기록하는 것(일반적으로 평가)이고, 두 번째는 주기적으로 데이터를 기록하는 것(정상적인 훈련)입니다.
모든 에피소드 기록하기¶
훈련된 에이전트가 있다면, 에이전트가 어떻게 행동하는지 보기 위해 평가 중에 여러 에피소드를 기록하고 싶을 수 있습니다. 아래에서 :class:`RecordEpisodeStatistics`와 :class:`RecordVideo`를 사용하여 이를 수행하는 예제 스크립트를 제공합니다.
import gymnasium as gym
from gymnasium.wrappers import RecordEpisodeStatistics, RecordVideo
num_eval_episodes = 4
env = gym.make("CartPole-v1", render_mode="rgb_array") # replace with your environment
env = RecordVideo(env, video_folder="cartpole-agent", name_prefix="eval",
episode_trigger=lambda x: True)
env = RecordEpisodeStatistics(env, buffer_length=num_eval_episodes)
for episode_num in range(num_eval_episodes):
obs, info = env.reset()
episode_over = False
while not episode_over:
action = env.action_space.sample() # replace with actual agent
obs, reward, terminated, truncated, info = env.step(action)
episode_over = terminated or truncated
env.close()
print(f'Episode time taken: {env.time_queue}')
print(f'Episode total rewards: {env.return_queue}')
print(f'Episode lengths: {env.length_queue}')
위 스크립트에서 RecordVideo
래퍼에 대해 세 가지 다른 변수를 지정했습니다: 비디오가 저장될 폴더를 지정하는 video_folder
(문제에 맞게 변경하세요), 비디오 자체의 접두사를 위한 name_prefix
, 그리고 마지막으로 모든 에피소드가 기록되도록 하는 ``episode_trigger``입니다. 이는 환경의 모든 에피소드에 대해 비디오가 기록되어 “cartpole-agent/eval-episode-x.mp4” 형식으로 저장됨을 의미합니다.
RecordEpisodeStatistics`의 경우, 버퍼 길이만 지정하면 됩니다. 이는 내부 ``time_queue`
, return_queue
및 ``length_queue``의 최대 길이입니다. 각 에피소드에 대해 개별적으로 데이터를 수집하는 대신, 데이터 큐를 사용하여 평가 마지막에 정보를 출력할 수 있습니다.
환경 평가 속도를 높이기 위해, 직렬이 아닌 병렬로 동시에 ``N``개의 에피소드를 평가하기 위해 벡터 환경과 함께 이를 구현하는 것이 가능합니다.
훈련 중 에이전트 기록하기¶
훈련 중에 에이전트는 수백 또는 수천 개의 에피소드에서 행동할 것이므로 모든 에피소드에 대한 비디오를 기록할 수는 없습니다. 하지만 개발자는 여전히 훈련의 다른 시점에서 에이전트가 어떻게 행동하는지 알고 싶어할 수 있으며, 훈련 중에 에피소드를 주기적으로 기록할 수 있습니다. 에피소드 통계의 경우, 이 데이터를 모든 에피소드에 대해 아는 것이 더 유용합니다. 다음 스크립트는 모든 에피소드의 통계를 기록하면서 에이전트의 에피소드를 주기적으로 기록하는 방법의 예시를 제공합니다 (파이썬 로거를 사용하지만, tensorboard, wandb 및 기타 모듈도 사용 가능합니다).
import logging
import gymnasium as gym
from gymnasium.wrappers import RecordEpisodeStatistics, RecordVideo
training_period = 250 # record the agent's episode every 250
num_training_episodes = 10_000 # total number of training episodes
env = gym.make("CartPole-v1", render_mode="rgb_array") # replace with your environment
env = RecordVideo(env, video_folder="cartpole-agent", name_prefix="training",
episode_trigger=lambda x: x % training_period == 0)
env = RecordEpisodeStatistics(env)
for episode_num in range(num_training_episodes):
obs, info = env.reset()
episode_over = False
while not episode_over:
action = env.action_space.sample() # replace with actual agent
obs, reward, terminated, truncated, info = env.step(action)
episode_over = terminated or truncated
logging.info(f"episode-{episode_num}", info["episode"])
env.close()