본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] Ray Data를 이용한 GPU 트레이닝 병목 해결 방법과 3가지 성능 차이 분석

by Papa Martino V 2026. 4. 23.
728x90

Data Loading Bottleneck
Data Loading Bottleneck

 

딥러닝 모델의 규모가 거대해짐에 따라 연산 자체의 속도보다 데이터를 GPU로 전달하는 과정에서 발생하는 데이터 로딩 병목(Data Loading Bottleneck) 현상이 심각한 문제로 대두되고 있습니다. 고성능 GPU인 H100이나 A100을 사용하더라도 CPU 기반의 전처리 과정이 느리면 GPU는 데이터를 기다리며 노는 'Starvation' 상태에 빠지게 됩니다. 본 가이드에서는 Python의 분산 컴퓨팅 프레임워크인 Ray Data를 활용하여 이러한 병목을 근본적으로 해결하는 방법과 실무 실무 해결책 7가지를 제시합니다.


1. 기존 DataLoader와 Ray Data의 기술적 차이 및 병목 해결 원리

일반적인 PyTorch의 DataLoader는 단일 머신의 멀티 프로세싱에 의존하지만, 대규모 데이터셋에서는 메모리 부족이나 전처리 속도 저하 문제가 발생합니다. Ray Data는 스트리밍 방식의 분산 실행 엔진을 통해 이 문제를 해결합니다.

데이터 로딩 방식별 성능 및 기능 비교

비교 항목 Standard PyTorch DataLoader Ray Data (Streaming)
처리 아키텍처 단일 노드 멀티 프로세싱 분산 노드 스트리밍 실행
메모리 관리 전체 데이터셋 로드 시 OOM 위험 Zero-copy 객체 저장소 활용
전처리 가속 CPU 워커 수에 제한됨 Heterogeneous 리소스(CPU+GPU) 병렬화
데이터 셔플링 로컬 셔플링 위주 전역(Global) 분산 셔플링 지원
GPU 가동률(Utilization) 전처리 병목 시 낮음 Prefetching 최적화로 95% 이상 유지

2. Ray Data 기반 GPU 트레이닝 병목 해결을 위한 실무 예제 (7가지)

개발자가 현업 MLOps 파이프라인에 즉시 통합할 수 있도록 구성된 Python 기반의 전문 예제 코드입니다.

Example 1: Ray Data를 이용한 대규모 Parquet 데이터 분산 로딩

수 테라바이트급의 분산 저장된 파일을 스트리밍 방식으로 빠르게 읽어오는 기초 해결 방법입니다.


import ray

# Ray 클러스터 초기화
ray.init(ignore_reinit_error=True)

# S3나 로컬 저장소의 분산 Parquet 파일 로드 (Lazy Loading)
ds = ray.data.read_parquet("s3://bucket/massive_dataset/")

# 간단한 데이터 확인 (데이터 전체를 메모리에 올리지 않음)
print(ds.schema())
print(ds.take(1))
    

Example 2: 다중 단계(Multi-stage) 병렬 전처리 파이프라인 구축

이미지 리사이징, 정규화 등 CPU 집약적 작업을 병렬 처리 노드로 분산하여 해결하는 예시입니다.


def preprocess_image(batch):
    # 이미지 디코딩 및 전처리 로직
    batch["image"] = [img / 255.0 for img in batch["image"]]
    return batch

# CPU 코어를 활용한 병렬 맵 함수 적용
# concurrency 설정을 통해 동시 실행 워커 수 조절 가능
processed_ds = ds.map_batches(
    preprocess_image, 
    batch_size=128, 
    concurrency=16
)
    

Example 3: GPU 가동률 극대화를 위한 Prefetching 설정

GPU가 연산을 수행하는 동안 다음 데이터를 미리 준비하여 대기 시간을 0으로 만드는 해결 방법입니다.


# iter_torch_batches를 사용하여 GPU 트레이닝 루프와 연결
# prefetch_batches를 통해 큐에 미리 데이터를 쌓아둠
it = processed_ds.iter_torch_batches(
    batch_size=64,
    prefetch_batches=10 # 10개의 배치를 미리 전처리하여 준비
)

for batch in it:
    # train_step(batch) 수행
    pass
    

Example 4: 대규모 분산 전역 셔플링(Global Shuffling) 구현

메모리 제한 없이 클러스터 전체 노드 간 데이터를 섞어 모델의 편향을 방지하는 방법입니다.


# 수십억 개의 레코드를 메모리 부족 없이 분산 셔플
shuffled_ds = ds.random_shuffle()

# 셔플링 시 사용할 메모리 버퍼 및 자원 최적화
shuffled_ds = ds.random_shuffle(
    seed=42,
    num_blocks=100 # 블록 단위 분할 처리를 통한 안정성 확보
)
    

Example 5: Ray Train과 통합된 분산 GPU 트레이닝 코드

여러 대의 GPU 서버에서 Ray Data를 입력 파이프라인으로 직접 사용하는 실무 구조입니다.


from ray.train.torch import TorchTrainer
from ray.train import ScalingConfig

def train_loop_per_worker():
    # 각 워커에 할당된 샤드(Shard) 데이터 가져오기
    dataset_shard = ray.train.get_dataset_shard("train")
    
    for batch in dataset_shard.iter_torch_batches(batch_size=32):
        # 분산 학습 로직 실행
        pass

trainer = TorchTrainer(
    train_loop_per_worker,
    datasets={"train": processed_ds},
    scaling_config=ScalingConfig(num_workers=4, use_gpu=True)
)
trainer.fit()
    

Example 6: 비정형 데이터(텍스트/오디오) 처리를 위한 동적 배치 최적화

길이가 다른 텍스트 데이터를 효율적으로 패딩하고 배치화하여 처리하는 해결 방법입니다.


import numpy as np

def tokenize_batch(batch):
    # 토크나이징 및 가변 길이 처리
    tokens = [len(t.split()) for t in batch["text"]]
    batch["input_ids"] = tokens
    return batch

# 가변 배치를 지원하는 스트리밍 로더
text_it = ds.map_batches(tokenize_batch).iter_batches(batch_size=None) 
    

Example 7: Zero-Copy 객체 저장소 공유를 통한 오버헤드 제거

Ray의 Plasma Store를 활용하여 전처리된 데이터를 직렬화 오버헤드 없이 GPU 워커에 전달하는 최적화 기법입니다.


# 데이터를 Ray의 공유 객체 저장소에 핀(Pin) 고정
# 여러 학습 반복(Epoch) 동안 전처리 재계산 방지
cached_ds = processed_ds.fully_executed()

# 이후 에폭에서는 메모리 내의 객체 저장소에서 즉시 읽기 수행
for epoch in range(10):
    for batch in cached_ds.iter_torch_batches(batch_size=64):
        pass
    

3. 결론: GPU 가동률 저하를 방지하기 위한 아키텍처적 해결책

GPU 트레이닝의 병목 현상은 대부분 데이터 공급 속도가 연산 속도를 따라가지 못할 때 발생합니다. Ray Data는 기존의 동기식 데이터 로딩 방식에서 탈피하여, 비동기 스트리밍 및 분산 전처리 아키텍처를 제공함으로써 이 문제를 근본적으로 해결합니다. 특히 테라바이트급 데이터셋을 다루는 환경에서 Ray Data의 Zero-copy 저장소와 Prefetching 기술은 학습 시간을 최대 50% 이상 단축시킬 수 있는 강력한 무기입니다.


4. 출처 및 기술 참조

  • Ray Official Documentation: "Ray Data: Distributed Training Data Pipelines" (2025-2026)
  • UC Berkeley RISELab: "Streaming Distributed Datasets for Machine Learning"
  • Anyscale Engineering Blog: "Optimizing GPU Utilization with Ray Data"
  • Journal of Parallel and Distributed Computing: "Architectural Bottlenecks in Deep Learning Training"
728x90