[Ray RLlib로 강화학습 쉽게 사용하기] 6편: 멀티프로세싱과 분산 학습 설정하기

대규모 강화학습 실험에서는 단일 프로세스나 단일 머신에서 모든 환경과 데이터를 처리하기 어렵습니다. RLlib은 Ray의 강력한 분산 및 멀티프로세싱 기능을 바탕으로, 쉽게 Worker를 늘리고 클러스터로 확장하여 더 많은 데이터를 병렬로 수집하고 처리할 수 있습니다.

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

  1. 멀티프로세싱 지원: num_rollout_workers와 num_envs_per_worker 설정으로 병렬 환경 처리
  2. 클러스터 모드: Ray 클러스터 구성으로 다중 노드 환경에서 RLlib 실행
  3. GPU/CPU 리소스 할당: .resources()를 통해 GPU 사용, 다중 GPU 설정
  4. 대규모 실험 파이프라인: 대량의 환경, 알고리즘 조합 테스트를 위한 전략

멀티프로세싱: 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을 더욱 깊이 커스터마이징하는 방법을 다루며, 실제 프로젝트 적용 시 요구되는 기술들을 다룰 예정입니다.

반응형