이전 글에서 우리는 RLlib을 이용해 단 몇 줄의 코드로 DQN을 CartPole 환경에서 돌려보았습니다. 그러나 실제로 다양한 환경, 알고리즘, 파라미터 조합을 시도하려면 RLlib이 어떻게 설정을 관리하고, 어떤 구조로 동작하는지 이해하는 것이 중요합니다. 이번 글에서는 RLlib의 핵심 개념인 Config, Trainer, Policy, Rollout Worker 등에 대해 자세히 살펴보고, Config 설정과 Trainer 활용법에 대해 좀 더 다양한 예제를 다루겠습니다.
RLlib 핵심 개념 자세히 알아보기
RLlib은 크게 다음과 같은 구성요소로 이뤄져 있습니다.
- Trainer:
- 알고리즘 실행의 중심 클래스입니다. 예를 들어, DQNTrainer, PPOTrainer, SACTrainer 등 알고리즘별 Trainer가 있습니다.
- Trainer는 환경과 상호작용하는 Worker(작업자)들을 관리하고, 수집된 데이터를 바탕으로 정책(Policy) 업데이트를 수행합니다.
- trainer.train() 메서드를 호출하면 한 번의 학습 Iteration(여러 에피소드 또는 일정 스텝 수집 후 업데이트)을 수행하고, 결과로 평균 리워드, 처리 스텝 수, 학습 시간 등 유용한 통계를 돌려줍니다.
- trainer.save(), trainer.restore() 메서드로 체크포인트 관리가 가능하며, trainer.get_policy()를 통해 현재 정책 파라미터나 모델 구조에 접근할 수도 있습니다.
- Policy:
- 에이전트가 어떤 행동을 취할지 결정하는 함수입니다.
- RLlib에서 Policy는 신경망 모델, 탐색 전략, 행동 확률 계산 등을 포함하는 개념이며, Trainer는 하나 이상의 Policy를 관리합니다.
- 예: DQN에서는 상태→Q값 벡터를 출력하는 정책을, PPO에서는 상태→행동 확률분포를 출력하는 정책을 가질 수 있습니다.
- Rollout Worker:
- 환경(Environment)을 실제로 실행하며, Policy로부터 행동을 받아 상태전이(s→a→r→s')를 수집하는 작업자 프로세스/스레드입니다.
- num_rollout_workers 설정으로 병렬 데이터 수집이 가능해집니다. 워커 수를 늘리면 더 빠른 데이터 수집이 가능하지만, CPU/메모리 리소스가 더 많이 필요합니다.
- Worker는 Trainer의 지시에 따라 Policy 파라미터를 주기적으로 업데이트 받고, 수집한 경험을 Trainer에게 전달합니다.
- Config (구성 설정):
- RLlib에서 모든 설정(알고리즘 파라미터, 환경 이름, 프레임워크 선택, 탐색전략, 분산 설정 등)을 하나의 Config 객체 또는 딕셔너리로 관리합니다.
- 알고리즘마다 전용 Config 클래스(DQNConfig, PPOConfig 등)가 있으며, 이를 체이닝 메서드를 통해 직관적으로 설정할 수 있습니다.
- Config를 통해 파라미터를 변경하면, 직접 알고리즘 코드를 수정하지 않고도 다양한 실험을 쉽게 할 수 있습니다.
이러한 요소들이 유기적으로 연결되어 RLlib의 탄탄한 구조를 형성합니다. 이제 Config와 Trainer를 어떻게 활용할 수 있는지 자세히 살펴봅시다.
Config 객체 다루기: 체이닝 메서드와 딕셔너리 접근
아래는 Config를 다루는 대표적인 방식입니다.
from ray.rllib.algorithms.dqn import DQNConfig
config = (
DQNConfig()
.environment(env="CartPole-v1")
.framework("torch") # PyTorch 사용
.rollouts(num_rollout_workers=1) # 워커 1개
.training(horizon=500) # 에피소드 당 최대 스텝 수
)
- .environment(env="..."): 사용할 환경 이름 지정
- .framework("torch"): 파이토치 또는 텐서플로우 선택 가능 ("tf" 또는 "tf2"도 가능)
- .rollouts(num_rollout_workers=N): 병렬 환경 워커 수 지정
- .training(...): 학습 관련 파라미터(e.g. batch size, lr, dueling, double_q 등)
이렇게 만들어진 Config를 trainer = config.build()로 Trainer를 생성합니다.
추가 예: 파라미터 세부 조정
config = (
DQNConfig()
.environment(env="CartPole-v1")
.framework("torch")
.rollouts(num_rollout_workers=2, rollout_fragment_length=200)
# rollout_fragment_length: 한번에 수집할 스텝 수 (데이터 수집 방식 제어)
.training(
train_batch_size=2000,
lr=1e-4,
dueling=True, # Dueling DQN
double_q=True, # Double DQN
exploration_config={
"type": "EpsilonGreedy",
"initial_epsilon":1.0,
"final_epsilon":0.01,
"epsilon_timesteps":50000
}
)
)
이렇게 Config를 통해 DQN을 Double+Dueling로 업그레이드하고, exploration 전략이나 batch size를 유연하게 조정할 수 있습니다. Config 객체를 출력해보면(예: print(config.to_dict())) 내부 딕셔너리 구조를 확인할 수 있고, 필요하다면 딕셔너리로 직접 수정하거나 추가 파라미터를 주입할 수도 있습니다.
Trainer: 학습 루프 제어와 메소드 활용
Trainer를 생성한 후 다음과 같은 메서드를 사용할 수 있습니다.
- trainer.train(): 한 번의 Iteration 학습 수행. 내부적으로 rollout 실행 → 경험 수집 → 알고리즘 업데이트 → 통계 반환.
- trainer.save(): 현재 모델 파라미터, 설정 등을 체크포인트 폴더에 저장.
- trainer.restore(checkpoint_path): 이전에 저장한 체크포인트에서 상태 복원.
- trainer.get_policy(): 현재 Policy 객체 반환. 이를 통해 모델 파라미터를 PyTorch로 직접 다루거나, 추가 분석 가능.
예제 코드 (trainer_advanced_example.py)
import ray
from ray.rllib.algorithms.dqn import DQNConfig
if __name__ == "__main__":
ray.init(ignore_reinit_error=True)
# CartPole 환경에서 Double+Dueling DQN 실행, 병렬 rollout, custom exploration
config = (
DQNConfig()
.environment(env="CartPole-v1")
.framework("torch")
.rollouts(num_rollout_workers=2, rollout_fragment_length=200)
.training(
train_batch_size=2000,
lr=1e-4,
dueling=True,
double_q=True,
exploration_config={
"type": "EpsilonGreedy",
"initial_epsilon":1.0,
"final_epsilon":0.01,
"epsilon_timesteps":50000
}
)
)
trainer = config.build()
# 몇 번의 iteration 실행
for i in range(20):
result = trainer.train()
mean_reward = result["episode_reward_mean"]
eps_value = result["info"]["exploration"]["epsilon"]
print(f"Iter {i+1}: mean_reward={mean_reward:.2f}, epsilon={eps_value:.2f}")
# 체크포인트 저장
ckpt_path = trainer.save()
print("Checkpoint saved at:", ckpt_path)
# 정책 접근: Policy 얻기
policy = trainer.get_policy()
# policy.get_weights()로 모델 파라미터 접근 가능 (PyTorch 모델 state_dict 형태)
weights = policy.get_weights()
print("Policy weights keys:", weights.keys())
# 세션 종료
ray.shutdown()
코드 설명
- trainer.train() 결과의 result 딕셔너리에는 episode_reward_mean, timesteps_total, info 등 다양한 정보가 들어 있습니다. 이를 통해 학습 진행 상황을 모니터링할 수 있습니다.
- info["exploration"]["epsilon"]와 같이 exploration 상태를 실시간으로 확인 가능.
- trainer.get_policy()로 정책에 접근하면, policy.get_weights() 등을 통해 모델 파라미터를 PyTorch로 로딩해 추가적인 분석이나 커스텀 추론에도 활용할 수 있습니다.
문서 및 옵션 검색 방법
RLlib에서는 다양한 알고리즘별로 Config 옵션이 있으며, 이를 모두 기억하기는 어렵습니다. 다음과 같은 방법으로 필요한 정보를 얻을 수 있습니다.
- RLlib 공식 문서: https://docs.ray.io/en/latest/rllib/index.html
알고리즘별 설정, 파라미터 설명, 예제 코드 제공. - Trainer 기본 Config 조회:
print(trainer.get_default_config())를 통해 기본 설정을 확인하거나, 알고리즘 소스 코드에서 default_config 딕셔너리 참고. - Ray GitHub 이슈/디스커션: 커뮤니티에서 자주 묻는 파라미터나 문제 해결 방법 참고.
마무리
핵심 포인트 정리:
- RLlib의 Trainer: 알고리즘 훈련의 핵심 객체. trainer.train() 호출로 한 iteration 학습 수행.
- Config 객체: 알고리즘, 환경, 파라미터를 쉽게 조합. 체이닝 메서드로 직관적 설정 가능.
- Policy, Worker: 내부 동작 요소. Policy는 행동 선택 로직, Worker는 환경실행-데이터수집 담당.
- Config를 통한 다양한 파라미터 튜닝: DQN에서 Double/Dueling 활성화, exploration 전략 변경, rollout 세부 설정 등.
- trainer.get_policy()나 trainer.save(), trainer.restore() 활용으로 정책 분석 및 체크포인트 관리 가능.
이러한 이해를 바탕으로, 다음 글에서는 실제로 다른 알고리즘(PPO 등)을 적용하거나 다양한 환경에서 RLlib을 활용하는 예제를 확대하고, 로그 및 성능 모니터링 방법도 살펴볼 수 있다.
이번 글에서는 RLlib의 기본 구조(Trainer, Policy, Worker)와 Config 설정 방법을 자세히 살펴봤습니다. Config 기반 접근 덕분에 RL 연구나 실험 시 알고리즘 코드 변경 없이도 다양한 파라미터를 실험할 수 있어 프로토타이핑이 훨씬 수월해집니다.
다음 글에서는 이산 행동 알고리즘(DQN 변형)을 더 다양한 환경에 적용하거나, 다른 알고리즘(PPO 등)에 Config를 통해 쉽게 전환하는 예제를 다루며, 로그 관리나 시각화 방법까지 살펴볼 예정입니다.
'개발 이야기 > PyTorch (파이토치)' 카테고리의 다른 글
[Ray RLlib로 강화학습 쉽게 사용하기] 4편: 정책기반 알고리즘 (A2C, PPO) 손쉽게 사용하기 (0) | 2024.12.22 |
---|---|
[Ray RLlib로 강화학습 쉽게 사용하기] 3편: 이산 행동 알고리즘(DQN 변형) 쉽게 돌려보기 (1) | 2024.12.21 |
[Ray RLlib로 강화학습 쉽게 사용하기] 1편: Ray와 RLlib 소개 및 환경 설정 (2) | 2024.12.19 |
[PyTorch로 시작하는 강화학습 입문] 11편: 마무리 및 다음 단계 제안 (1) | 2024.12.18 |
[PyTorch로 시작하는 강화학습 입문] 10편: 연속 행동 공간에 도전 – Soft Actor-Critic(SAC) 소개 및 기초 구현 (0) | 2024.12.17 |