[Ray RLlib로 강화학습 쉽게 사용하기] 1편: Ray와 RLlib 소개 및 환경 설정

강화학습(RL)을 다루다 보면, 다양한 알고리즘(DQN, PPO, SAC 등)을 일일이 직접 구현하고, 하이퍼파라미터를 조정하며, 환경을 실행하는 과정이 만만치 않다는 걸 실감하게 됩니다. 이전 시리즈에서는 PyTorch로 직접 RL 알고리즘을 구현해봤지만, 실제 실험 단계에선 이런 구현 부담을 덜어주는 라이브러리가 큰 도움이 됩니다.

Ray RLlib는 그런 니즈에 부합하는 강력한 분산 강화학습 프레임워크입니다. RLlib은 다음과 같은 장점을 갖습니다.

  • 다양한 알고리즘 내장: DQN, PPO, SAC, A3C/A2C, IMPALA 등 대표적인 알고리즘을 기본 지원
  • 간단한 Config 기반 설정: 하이퍼파라미터, 환경 설정, 알고리즘 변형을 Config 딕셔너리로 쉽게 제어
  • 분산/병렬 학습 지원: Ray의 멀티프로세싱/클러스터 능력을 활용해 대규모 실험 가능
  • 친화적 API: Trainer 객체 하나로 학습(train), 평가, 체크포인트 관리 등 수행

이번 시리즈에서는 RLlib을 활용해, 앞서 PyTorch로 구현했던 알고리즘들을 구현 부담 없이 바로 돌려보는 예제를 다룰 예정입니다. 첫 글에서는 RLlib 환경 설정과 기본적인 DQN 예제 실행법을 소개합니다.

Ray와 RLlib란 무엇인가?

  • Ray: 파이썬 기반의 분산 컴퓨팅 프레임워크로, 간단한 코드 변경만으로 멀티프로세싱, 클러스터 환경에서 작업을 쉽게 실행 가능
  • RLlib: Ray 위에 구축된 강화학습 라이브러리로, 강화학습 알고리즘을 모듈화하고, 다양한 환경에서 손쉽게 훈련할 수 있도록 도와줍니다.

RLlib을 사용하면:

  • 복잡한 PyTorch/TensorFlow 기반 RL 알고리즘 직접 구현 필요 ↓
  • Config 변경으로 알고리즘, 파라미터, 분산 설정 가능
  • 로그, 체크포인트 관리, 결과 시각화 등 지원

개발환경 준비

Python 3.x 설치:
Python 3.7 이상 권장. Python 공식 홈페이지 참고.

가상환경(venv, conda) 사용 권장:

conda create -n rllib_env python=3.9
conda activate rllib_env

또는 python -m venv rllib_env 후 source rllib_env/bin/activate

Ray, RLlib 설치:

pip install "ray[rllib]" gym

이렇게 하면 Ray, RLlib, gym 등 기본 의존성 설치.
(Atari 환경 등 추가 필요 시 pip install gym[atari] 등)

 

설치 완료 후 간단히 버전 체크:

python -c "import ray; print(ray.__version__)"
python -c "import ray.rllib; print('RLlib installed')"

간단한 DQN 예제 실행하기

RLlib의 가장 큰 장점은 알고리즘을 직접 구현하지 않고도 바로 실행할 수 있다는 것입니다. 예를 들어, CartPole 환경에서 DQN을 훈련하려면 다음과 같은 코드로 충분합니다.

예제 코드 (dqn_cartpole.py)

import ray
from ray.rllib.algorithms.dqn import DQNConfig

if __name__ == "__main__":
    # Ray 초기화
    ray.init(ignore_reinit_error=True)
    
    # DQN 알고리즘 설정
    config = (
        DQNConfig()
        .environment(env="CartPole-v1")
        .framework("torch")  # PyTorch 백엔드
        .rollouts(num_rollout_workers=1)  # 워커 수 (1이면 단일 프로세스)
        .training(horizon=500)
    )

    # Trainer 생성
    trainer = config.build()

    # 몇 에피소드 정도 학습
    for i in range(10):
        result = trainer.train()
        print(f"Iteration {i+1}: episode_reward_mean={result['episode_reward_mean']}")
    
    # 체크포인트 저장
    checkpoint_path = trainer.save()
    print("Checkpoint saved at", checkpoint_path)
    
    ray.shutdown()

코드 설명

  • DQNConfig(): DQN 알고리즘 설정 객체 생성
  • .environment("CartPole-v1"): 환경 지정
  • .framework("torch"): PyTorch 기반 실행
  • .rollouts(num_rollout_workers=1): 워커 수 설정(분산도 가능)
  • .training(...): 추가 학습 파라미터 설정 가능

config.build()를 통해 Trainer 생성 후 trainer.train()으로 한 번의 학습 iteration 수행. episode_reward_mean으로 평균 리워드 확인 가능.

실행 후 결과를 보면 몇 iteration만 거쳐도 episode_reward_mean이 증가하는 양상을 볼 수 있습니다. 체크포인트를 저장해 두었다가 나중에 재로딩도 가능합니다.

결과 확인과 시각화

RLlib은 기본적으로 ~/ray_results 디렉토리에 로그 및 체크포인트를 저장합니다. TensorBoard를 활용해 로그를 시각화할 수도 있습니다.

tensorboard --logdir=~/ray_results

브라우저에서 localhost:6006 접속하면 학습 곡선 확인 가능.

마무리

이렇게 간단히 RLlib을 활용해 강화학습 알고리즘(DQN)을 실행해봤습니다. 이전 시리즈에서 구현에 많은 공을 들였던 알고리즘을 이제 단 몇 줄의 코드와 Config 설정만으로 돌려볼 수 있다는 점이 RLlib의 큰 장점입니다.

다음 글에서는 RLlib의 구성 원리를 좀 더 자세히 알아보고, Trainer, 정책(Policy), 환경(Environment) 등의 개념을 통해 다양한 설정과 알고리즘을 다루는 방법을 배워보겠습니다.

반응형