대규모 강화학습 실험에서는 단일 프로세스나 단일 머신에서 모든 환경과 데이터를 처리하기 어렵습니다. RLlib은 Ray의 강력한 분산 및 멀티프로세싱 기능을 바탕으로, 쉽게 Worker를 늘리고 클러스터로 확장하여 더 많은 데이터를 병렬로 수집하고 처리할 수 있습니다.
이번 글에서는 다음 내용을 다룹니다.
- 멀티프로세싱 지원: num_rollout_workers와 num_envs_per_worker 설정으로 병렬 환경 처리
- 클러스터 모드: Ray 클러스터 구성으로 다중 노드 환경에서 RLlib 실행
- GPU/CPU 리소스 할당: .resources()를 통해 GPU 사용, 다중 GPU 설정
- 대규모 실험 파이프라인: 대량의 환경, 알고리즘 조합 테스트를 위한 전략
멀티프로세싱: Worker 수와 Env per Worker 조정
이전 글들에서 rollouts(num_rollout_workers=N) 설정을 통해 병렬로 환경을 실행하는 방법을 언급했습니다. 워커 수를 늘리면 각 워커가 독립적으로 환경을 진행하며 데이터를 수집하기 때문에, rollout 스텝을 더 빠르게 쌓을 수 있습니다.
from ray.rllib.algorithms.ppo import PPOConfig
config = (
PPOConfig()
.environment(env="CartPole-v1")
.framework("torch")
.rollouts(num_rollout_workers=4, num_envs_per_worker=2)
.training(train_batch_size=4000)
)
trainer = config.build()
핵심 포인트:
- num_rollout_workers=4: 4개 프로세스(또는 스레드)가 환경을 병렬로 실행
- num_envs_per_worker=2: 각 워커 프로세스가 2개의 환경 인스턴스를 동시에 돌려 더 많은 경험을 병렬 수집 (VectorEnv 형태)
- 이렇게 하면 한 iteration 당 더 많은 데이터를 더 빨리 수집해 학습 속도를 높일 수 있습니다.
단, 워커 수, 환경 수를 늘릴수록 CPU/메모리 자원 소모가 커집니다. 적절한 균형을 찾아야 합니다.
클러스터 모드: 다중 노드 환경에서의 학습
Ray는 단일 머신뿐 아니라 다중 머신(노드)로 이루어진 클러스터로 확장할 수 있습니다. RLlib은 Ray 클러스터 위에서 구동되며, 롤아웃 워커들을 여러 노드에 걸쳐 배치할 수 있습니다.
간단한 예:
# Head node에서 Ray 클러스터 시작
ray start --head
# 다른 노드에서 head의 주소로 join
ray start --address 'ray://<head_node_ip>:10001'
# 파이썬 스크립트에서 ray.init(address='ray://head_node_ip:10001')로 클러스터 연결
이렇게 클러스터에 연결한 뒤 동일한 RLlib 코드를 실행하면, 워커들이 클러스터 내 노드들에 분산 배치되어 더 큰 규모의 실험을 처리할 수 있습니다.
GPU/CPU 리소스 할당
config.resources(num_gpus=1)로 GPU 사용을 지정할 수 있습니다. GPU가 여러 개라면 num_gpus=2 또는 policy별 GPU 할당 등도 가능하며, num_gpus_per_worker 설정을 통해 워커별로 GPU 분배도 가능합니다.
예를 들어:
config = (
PPOConfig()
.environment(env="MountainCarContinuous-v0")
.rollouts(num_rollout_workers=4)
.resources(num_gpus=1) # 메인 프로세스에서 GPU 1개 할당
# num_gpus_per_worker=0.25 등으로 워커에도 GPU할당 가능 (큰 모델/환경에 유용)
)
GPU 사용 시 딥러닝 연산(CNN, RNN, 대형 모델)에 가속 효과를 볼 수 있습니다.
대규모 실험 파이프라인 구축
RL 연구에서는 수많은 알고리즘, 파라미터 조합, 환경들을 동시에 실험해보고, 어떤 조합이 가장 성능이 좋은지 확인하는 경우가 많습니다. RLlib을 Ray Tune과 결합하면 하이퍼파라미터 튜닝 및 대규모 실험 오케스트레이션이 가능합니다.
- Ray Tune: 하이퍼파라미터 검색, 자동 최적화 도구. RLlib Trainer를 쉽게 Tune와 연계 가능.
- 예를 들어, lr, train_batch_size, num_sgd_iter 등을 Grid search나 Bayesian Optimization으로 검색해볼 수 있습니다.
예제: Ray Tune를 활용한 하이퍼파라미터 스위프
import ray
from ray import tune
from ray.rllib.algorithms.ppo import PPOConfig
ray.init(ignore_reinit_error=True)
def train_func(config):
algo_config = (
PPOConfig()
.environment(env="CartPole-v1")
.framework("torch")
.rollouts(num_rollout_workers=2)
.training(
lr=config["lr"],
train_batch_size=config["train_batch_size"]
)
)
trainer = algo_config.build()
for i in range(10):
result = trainer.train()
tune.report(mean_reward=result["episode_reward_mean"])
search_space = {
"lr": tune.grid_search([1e-3, 3e-4, 1e-4]),
"train_batch_size": tune.grid_search([2000, 4000])
}
tune.run(train_func, config=search_space)
이렇게 하면 lr과 batch size 조합에 대해 자동으로 실험을 돌리고, 각 실험 결과를 수집해 어떤 조합이 성능이 좋은지 빠르게 확인할 수 있습니다.
마무리
핵심 포인트 정리:
- 멀티프로세싱: num_rollout_workers, num_envs_per_worker로 병렬 데이터 수집 가속
- 클러스터 모드: Ray 클러스터 통해 여러 노드에 워커 배치, 대규모 실험 가능
- GPU/CPU 리소스 할당: .resources()로 GPU 사용, 워커별 리소스 배분 가능
- Ray Tune 연계: 하이퍼파라미터 스위프, 대규모 실험 자동화, 최적의 파라미터 탐색
이 글에서는 RLlib을 멀티프로세싱과 분산 환경에서 동작시키는 방법, GPU 활용, 그리고 Ray Tune와의 연계를 통한 대규모 하이퍼파라미터 검색 방법을 소개했습니다. 이런 기능들은 실제 연구나 산업 현장에서 대규모 RL 실험을 수행할 때 매우 유용합니다.
다음 글에서는 사용자 정의 환경 연동, 관측/행동 전처리, callbacks를 통한 커스텀 로직 삽입 등, RLlib을 더욱 깊이 커스터마이징하는 방법을 다루며, 실제 프로젝트 적용 시 요구되는 기술들을 다룰 예정입니다.
'개발 이야기 > PyTorch (파이토치)' 카테고리의 다른 글
[Ray RLlib로 강화학습 쉽게 사용하기] 7편: 사용자 정의 환경, 관측/행동 전처리, 콜백 활용하기 (0) | 2024.12.25 |
---|---|
[Ray RLlib로 강화학습 쉽게 사용하기] 5편: 로그 관리, 시각화, 체크포인트 활용하기 (0) | 2024.12.23 |
[Ray RLlib로 강화학습 쉽게 사용하기] 4편: 정책기반 알고리즘 (A2C, PPO) 손쉽게 사용하기 (0) | 2024.12.22 |
[Ray RLlib로 강화학습 쉽게 사용하기] 3편: 이산 행동 알고리즘(DQN 변형) 쉽게 돌려보기 (1) | 2024.12.21 |
[Ray RLlib로 강화학습 쉽게 사용하기] 2편: RLlib 구성 이해하기 – Config, Trainer, 그리고 기본 구조 (0) | 2024.12.20 |