[Ray RLlib로 강화학습 쉽게 사용하기] 5편: 로그 관리, 시각화, 체크포인트 활용하기

강화학습 실험은 수십, 수백 회의 iteration을 거치며 성능이 개선되는 과정을 지켜보는 일이 많습니다. 이 때 중간 결과를 기록하고, 성능 지표를 시각화하며, 특정 시점의 모델 상태를 체크포인트로 저장하는 과정은 필수적입니다. RLlib은 기본적으로 이러한 기능들을 지원하고 있어, 별도 구현 없이도 손쉽게 실험 관리가 가능합니다.

이번 글에서는 다음 내용을 다룹니다.

  1. RLlib의 기본 로그 디렉토리 구조
  2. TensorBoard를 통한 학습 곡선 시각화
  3. 체크포인트(Checkpoint) 저장 및 복원(Restore) 방법
  4. trainer.get_policy()나 trainer.workers.foreach_policy() 등으로 모델 파라미터 추출, 추가적인 분석 방법 소개

로그 디렉토리와 Ray Results

RLlib을 실행하면 기본적으로 ~/ray_results 디렉토리에 실험 결과(로그, 체크포인트, Config 파일 등)가 저장됩니다. 이 디렉토리는 다음과 같은 형식을 가질 수 있습니다.

~/ray_results/
    ├─ DQN_CartPole_.../
    │    ├─ params.json       # 실행 당시 Config, 파라미터
    │    ├─ progress.csv      # iteration별 통계 (평균 리워드, 스텝 수 등)
    │    ├─ result.json       # iteration별 결과 JSON
    │    ├─ checkpoints/      # 체크포인트 파일들
    │    └─ events.out.tfevents...  # TensorBoard용 이벤트 파일
    └─ PPO_CartPole_.../
         ...

params.json나 progress.csv를 통해 실험 후 어느 파라미터로 학습했는지, 성능이 어떻게 변했는지 분석할 수 있습니다. progress.csv는 Pandas, Excel 등으로 읽어 그래프를 직접 그릴 수도 있습니다.

TensorBoard 시각화

TensorBoard는 딥러닝에서 널리 쓰이는 로그 시각화 도구이며, RL에서도 학습 과정을 한눈에 볼 수 있게 해줍니다.

  1. 터미널에서 TensorBoard 실행:
  2. tensorboard --logdir=~/ray_results
  3. 브라우저에서 http://localhost:6006 접속
    • "Scalars" 탭에서 episode_reward_mean 그래프를 볼 수 있습니다.
    • 시간 경과에 따른 평균 리워드 상승 추세, 탐색률 변동, 학습 속도 등도 확인 가능.

TensorBoard를 통해 다양한 알고리즘 성능을 비교하거나, 파라미터 조정 전후 변화를 시각적으로 확인하면 실험 효율이 크게 올라갑니다.

예제 코드 주석

우리가 이전에 사용한 예제들(DQN, PPO 등) 모두 학습이 진행되면 자동으로 ~/ray_results에 로그와 TensorBoard 이벤트 파일을 남깁니다. 별도 설정이 없어도 RLlib이 기본 기록을 수행하므로, TensorBoard만 실행하면 실시간 관찰이 가능합니다.

체크포인트 관리: Save와 Restore

장시간 학습이 필요한 RL 실험에서 체크포인트는 매우 중요합니다. RLlib Trainer는 trainer.save()로 체크포인트를 저장하고, trainer.restore(checkpoint_path)로 해당 시점으로 복원할 수 있습니다.

# 학습 도중 체크포인트 저장
ckpt_path = trainer.save()
print("Checkpoint saved at:", ckpt_path)

# 중단 후 다른 스크립트에서 복원
trainer.restore(ckpt_path)
# restore 후 trainer.train()을 다시 호출하면 그 시점부터 이어서 학습 가능

예: CartPole에서 PPO로 학습하다가 100 iteration 후 체크포인트 저장, 이후 다시 실행 시 복원 후 학습 연장. 이렇게 하면 갑작스러운 중단에도 손쉽게 이어서 학습할 수 있습니다.

모델 파라미터 추출과 Policy 접근

때로는 학습 도중 정책 파라미터를 얻거나, 별도의 추론을 위해 모델 가중치를 로딩하는 경우도 있습니다. RLlib Trainer는 trainer.get_policy()로 현재 정책 객체에 접근할 수 있습니다.

policy = trainer.get_policy()
# Policy에서 모델 가중치 추출 (PyTorch)
weights = policy.get_weights()

# 필요하다면 PyTorch state_dict 변환
# 또한 policy.model (모델 인스턴스)에 접근 가능

여기서 얻은 가중치를 직접 torch로 로딩하거나, 별도의 추론 스크립트에서 사용 가능합니다. 예를 들어 RLlib이 학습한 정책을 가져와 파이썬 기본 인터페이스로 환경을 돌리며 데모를 보여줄 수 있습니다.

추가 로그와 Callback

RLlib은 callbacks 인자를 통해 특정 이벤트(rollout 시작, iteration 완료, 에피소드 종료 등) 시 커스텀 로직을 실행하는 것을 지원합니다. 이를 통해 다음과 같은 일을 할 수 있습니다.

  • 특정 에피소드 마다 별도 로그 기록
  • 성능 임계값 달성 시 알림 또는 파라미터 변경
  • 추가 지표 계산 후 result에 포함

예를 들어:

def my_callbacks(params):
    def on_episode_end(info):
        episode = info["episode"]
        # 에피소드 리워드 로그 추가
        print(f"Episode ended with reward {episode.total_reward}")
    return {"on_episode_end": on_episode_end}

config = PPOConfig().environment(env="CartPole-v1").callbacks(my_callbacks)

이렇게 하면 각 에피소드가 끝날 때마다 리워드를 콘솔에 찍을 수 있습니다. 더 복잡한 로직(추가 파일에 로그 기록, 외부 DB 전송 등)도 구현 가능합니다.

정리

  • RLlib은 기본적으로 ~/ray_results에 로그(실험 파라미터, 결과, TensorBoard 이벤트)와 체크포인트를 저장하므로 실험 관리가 용이합니다.
  • TensorBoard를 통해 학습 곡선, 평균 리워드, 탐색률 변동 등을 직관적으로 파악할 수 있습니다.
  • trainer.save()/trainer.restore()로 체크포인트 관리, 장기 학습이나 중단 후 재개에 유리.
  • trainer.get_policy()로 현재 정책 파라미터나 모델 접근, 커스텀 추론이나 추가 분석 가능.
  • callbacks로 커스텀 로직 삽입, 추가 지표 로깅, 조건부 동작 구현 가능.

이러한 기능을 활용하면 RL 실험을 더 체계적으로 수행하고, 결과를 손쉽게 분석하며, 다양한 실험 시나리오(중단 후 재개, 파라미터 스윕, 성능 모니터링)에 유연하게 대처할 수 있습니다.

다음 글에서는 멀티프로세싱/분산 학습 설정, 대규모 실험 파이프라인 구축 등 RLlib의 확장된 기능을 다루며, 더 복잡한 프로젝트에 RLlib을 적용하는 전략을 소개하겠습니다.

반응형