강화학습(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) 등의 개념을 통해 다양한 설정과 알고리즘을 다루는 방법을 배워보겠습니다.