Ray와 TensorFlow Distributed로 구성하는 분산 컴퓨팅 운영

Ray와 TensorFlow Distributed를 활용해 데이터 전처리, 분산 학습, 장애 복구와 관측 체계를 구성하는 실무 가이드

2026-08-14 · 최초 발행 2024-04-29

데이터 전처리와 모델 학습의 병목은 단일 머신에서 오래 머무르지 않는다. 대규모 데이터와 복잡한 모델을 다루려면 여러 노드와 가속기에 작업을 나누고, 그 과정에서 생기는 통신·장애·자원 배치 문제까지 운영 범위에 넣어야 한다.

Ray와 TensorFlow Distributed는 이 지점에서 역할이 다르다. Ray는 범용 분산 실행을, TensorFlow Distributed는 대규모 딥러닝 학습 전략을 맡는다. 함께 구성하면 전처리부터 학습, 튜닝, 서빙까지 이어지는 파이프라인을 만들 수 있다.

분산 워크로드를 나누는 방식

분산 컴퓨팅은 여러 노드 또는 가속기에서 작업을 병렬로 수행해 처리량과 지연을 다루는 구성이다. 데이터 병렬화, 모델 병렬화, 파이프라인 병렬화가 대표적인 전략이며, 데이터 크기와 모델 구조, 통신 비용에 따라 선택이 달라진다.

Ray는 태스크와 액터, 오브젝트 스토어, 스케줄러, 오토스케일러를 제공하는 범용 Python 분산 프레임워크다. Ray Data, Ray Train, Ray Tune, Ray Serve처럼 워크로드별 모듈도 갖추고 있다.

TensorFlow Distributed는 학습 전략 프레임워크다. MirroredStrategy, MultiWorkerMirroredStrategy, ParameterServerStrategy를 제공하며, Collective(AllReduce/NCCL), gRPC 기반 생산자-소비자 파이프라인, 체크포인트와 복구 메커니즘을 지원한다.

자원 배치와 데이터 경로를 함께 설계하기

Ray에서는 헤드 노드의 스케줄러와 오브젝트 스토어를 바탕으로 태스크와 액터가 배치된다. Placement Group을 사용하면 NUMA와 GPU 인접성을 고려해 자원을 고정 배치할 수 있다. 태스크 간 객체 전송에는 같은 노드에서 Zero-copy와 Plasma 오브젝트 스토어를 활용하며, 재시도와 장애 시맨틱도 구성 대상이다.

TensorFlow Distributed는 전략별 통신 백엔드로 NCCL, Gloo, gRPC를 선택한다. 워커·치프·PS 역할을 나누고, 동기 또는 비동기 처리의 경량화 수준을 조정한다. AllReduce는 동기 SGD에, Parameter Server는 비동기 또는 부분 동기 구성에 대응한다. 강한 일관성과 처리량 사이의 선택이 필요하다.

입력 데이터 경로도 별도로 최적화해야 한다. Ray Data는 파일셋이나 오브젝트 기반 입력을 자동 셔딩하고 map/reduce 및 shuffle을 최적화한다. TensorFlow에서는 tf.data의 prefetch, cache, 병렬 map, AutoShardPolicy로 멀티 워커 셔딩의 일관성을 유지한다.

Ray와 TensorFlow 클러스터가 만나는 지점

StorageTF_ClusterRay_ClusterClient제출태스크/액터 배치태스크/액터 배치학습 시작AllReduce/PS 통신AllReduce/PS 통신체크포인트데이터 셔딩데이터 셔딩Driver/Trainer 코드Head/SchedulerObject StoreWorker Node 1Worker Node 2ChiefWorker 1Worker 2Parameter Server 1Blob StorageShared FS

대규모 데이터는 Blob Storage 또는 Shared FS에서 들어온다. Ray 태스크와 액터가 전처리와 특성 공학을 수행하고, TensorFlow 전략이 분산 학습을 진행한다. 결과물은 모델 체크포인트, 메트릭과 로그, Ray Serve 서빙 엔드포인트 등록으로 이어진다.

장애 대응도 두 계층에서 나뉜다. Ray는 태스크 재시도(백오프)와 액터 상태 스냅샷 후 재시작을 사용한다. TensorFlow는 스텝 실패 시 최근 체크포인트에서 복구하고, 불량 배치 스킵 옵션과 학습 재개 구성을 둔다.

구축 과정에서 먼저 고정할 운영 기준

클러스터를 준비할 때는 Base CUDA/cuDNN, Python, 드라이버가 일치하는 컨테이너 이미지를 표준화한다. 최신 정보 확인이 필요하다. Ray 헤드와 워커를 부팅하고, TensorFlow 클러스터의 C/P/W/PS 역할 및 포트·방화벽을 정의한다.

데이터 파이프라인은 Ray Data의 청크 분할·셔플·캐싱과 tf.data의 병렬 map, prefetch, AutoShardPolicy를 조합해 구성한다. GPU 다중 노드 학습에는 동기 방식인 MultiWorkerMirroredStrategy를, 대규모 비균질 클러스터에는 ParameterServerStrategy를 선택할 수 있다. Ray 쪽에서는 Placement Group으로 GPU·CPU·메모리를 예약하고 NUMA와 PCIe 토폴로지를 고려한다.

통신과 배치도 측정 대상이다. NCCL 토폴로지에서 NVLink와 PCIe를 점검하고 batch size 증가와 gradient accumulation을 조합한다. Ray 오브젝트 스토어는 object_store_memory와 spill-to-disk 설정을 조정한다.

장시간 작업은 주기적 체크포인트와 원자적 저장(임시→커밋)을 전제로 한다. 재시작 정책으로 backoff와 max_retries를 구성하고, 데이터 재시도에서는 작업 idempotency를 확보한다. Ray Dashboard, Prometheus, TF Profiler로 스루풋(샘플/s), 스텝 지연, GPU Utilization, Input Pipeline Stall 비율을 모니터링한다.

분산 실행과 분산 학습의 역할 차이

항목 Ray TensorFlow Distributed
성능 범용 태스크/액터 기반, I/O·ETL·하이퍼파라미터 탐색에 높은 처리량 딥러닝 학습에 최적화, NCCL AllReduce 기반 고효율 SGD
확장성 멀티 클라우드/온프레미스 오토스케일, 이질적 자원 혼합 용이 멀티 노드·멀티 GPU 선형 확장, 네이티브 Keras/TF 데이터 경로
일관성 태스크 기반 at-least-once 재시도 시멘틱, 사용자 멱등성 설계 필요 동기/비동기 전략 선택으로 수렴·일관성 제어
안정성 태스크/액터 재시작, 오브젝트 스토어 스필링으로 장시간 워크로드 견조성 체크포인트 중심의 내고장성, 워커 프리엠션 허용 구성
운영 편의 단일 API로 데이터·학습·튜닝·서빙 통합, Dashboard 제공 TF 코드 최소 변경으로 분산화, 전략 스위치 용이

Ray로 전처리와 맵리듀스 실행하기

환경에는 Python 3.10+와 CUDA/NVIDIA 드라이버 호환 버전이 필요하며, 최신 정보 확인이 필요하다. Ray >= 2.6, TensorFlow >= 2.12를 권장한다. 패키지는 pip install "ray[default]" ray[data] ray[train] ray[tune] tensorflow로 설치한다.

# 실행: 단일 노드(테스트) 또는 ray.init(address="auto")로 클러스터 접속
import ray
ray.init()  # 또는 ray.init(address="auto")

@ray.remote(retries=3, max_retries=3)
def parse_and_feat(line: str) -> dict:
    # 멱등성 보장 전처리 설계 권장
    cols = line.strip().split(",")
    x = float(cols[0]); y = float(cols[1])
    return {"x": x, "y": y, "xy": x * y}

# 데이터 분산 처리
lines = ["1.0,2.0", "3.0,4.5", "5.0,6.0"]
results = ray.get([parse_and_feat.remote(l) for l in lines])

# Reduce 단계
def agg(acc, row):
    acc["sum_xy"] += row["xy"]; acc["n"] += 1; return acc

acc = {"sum_xy": 0.0, "n": 0}
for r in results:
    acc = agg(acc, r)

print("mean_xy =", acc["sum_xy"] / acc["n"])

Ray Data를 쓰면 데이터셋 단위의 변환과 재분할을 구성할 수 있다.

import ray, ray.data as rd
ray.init()

ds = rd.from_items([{"x": i, "y": i * 0.1} for i in range(1000)])
ds = ds.map(lambda r: {**r, "xy": r["x"] * r["y"]}).repartition(8)
print(ds.sum("xy"))

TensorFlow 전략으로 학습 워커를 확장하기

단일 노드에서 여러 GPU를 사용하는 MirroredStrategy 구성은 다음과 같다.

# 단일 노드 멀티 GPU: MirroredStrategy 예시
import tensorflow as tf
print("GPUs:", tf.config.list_physical_devices('GPU'))

strategy = tf.distribute.MirroredStrategy()

with strategy.scope():
    model = tf.keras.Sequential([
        tf.keras.layers.Dense(256, activation="relu", input_shape=(32,)),
        tf.keras.layers.Dense(10, activation="softmax"),
    ])
    model.compile(optimizer="adam",
                  loss="sparse_categorical_crossentropy",
                  metrics=["accuracy"])

def make_ds(n=10000, batch=256):
    x = tf.random.normal([n, 32])
    y = tf.random.uniform([n], maxval=10, dtype=tf.int32)
    ds = tf.data.Dataset.from_tensor_slices((x, y))
    ds = ds.shuffle(10000).batch(batch).prefetch(tf.data.AUTOTUNE)
    return ds

train_ds = make_ds()
val_ds = make_ds(2000)

model.fit(train_ds, validation_data=val_ds, epochs=3)

MultiWorkerMirroredStrategy로 확장할 때는 각 워커 프로세스에 TF_CONFIG 환경변수를 설정한다.

  • cluster: { "worker": ["host1:12345", "host2:12345"] }, task: { "type": "worker", "index": 0 }
  • strategy = tf.distribute.MultiWorkerMirroredStrategy()로 전략을 교체한다.
  • options = tf.data.Options(); options.experimental_distribute.auto_shard_policy = tf.data.experimental.AutoShardPolicy.DATAtf.data 셔딩 정책을 설정한다.

ParameterServerStrategy에서는 chief/worker/ps 역할을 분리하고, 변수 배치를 변수 서버로 옮겨 핫스팟을 방지한다. 대규모 모델과 비균질 클러스터에서 처리량을 높일 수 있지만, 수렴 속도와 일관성의 트레이드오프가 있다.

연결하기 좋은 워크로드

Ray Data는 JSON과 Parquet 대량 처리, 결측·스케일링·조인 파이프라인에 사용할 수 있다. 결과셋은 TFRecord 또는 Parquet로 저장해 TensorFlow 학습 파이프라인에 연결한다.

하이퍼파라미터 탐색에서는 Ray Tune의 ASHA/PBT를 사용해 TF/Keras 모델을 분산 탐색할 수 있다. 조기중단과 자원의 탄력적 할당으로 탐색 효율을 높인다.

학습은 TensorFlow Distributed로 수행하고, 체크포인트는 Ray Serve로 서빙 배포하는 구성이 가능하다. Canary/AB 테스트와 롤백 전략도 자동화 대상에 포함된다.

성능과 비용에 반영되는 변화

전처리·ETL은 노드 N개 기준 0.70.9×N 배 스루풋을 기대할 수 있으며, 네트워크와 I/O에 의존한다. 학습은 GPU M개 기준 0.80.95×M 배 스케일링 효율을 기대하고, NCCL 최적화 시 상위 구간에 근접한다.

파이프라인 병렬화는 학습 준비 시간을 5080% 단축할 수 있다. 스팟 또는 프리엠티브 인스턴스를 활용하면 인프라 비용을 2040% 절감할 수 있다.

장애 자동 복구와 재시도 정책은 장시간 잡의 성공률 개선에 기여한다. 모니터링과 프로파일링 체계는 병목 제거와 수렴 안정성 향상에 활용된다.

보호·일관성·활용률 사이의 선택

노드 간 통신에는 TLS를 적용하고, 인증 토큰과 서비스 계정을 분리하며 KMS/Secret Manager로 시크릿을 관리한다. 스토리지 접근은 최소 권한 원칙으로 제한하고 체크포인트 무결성을 검증한다. 암호화 오버헤드와 규제 준수·데이터 보호 사이에는 트레이드오프가 있다.

컨테이너 기반 불변 인프라와 이미지 서명·스캔 파이프라인을 적용하고, 고성능 로컬 SSD와 오브젝트 스토리지를 계층화할 수 있다. 로컬 캐시 성능과 데이터 일관성도 함께 판단해야 한다.

Placement Group 기반 자원 예약, GPU Affinity, CPU Pinning을 적용하고 큐 길이·백프레셔 기반 자동 스케일 정책을 구성한다. 프로파일링 결과로 배치 크기를 조정한다. 높은 자원 고정은 클러스터 활용률과 맞바꿔야 할 수 있다.

Ray가 전처리·튜닝·서빙을 통합하고 TensorFlow Distributed가 고성능 학습을 담당하는 구조는 데이터 파이프라인 전반을 연결하는 데 적합하다. 통신 백엔드, 셔딩 정책, 체크포인트 전략을 표준화하고 관측 체계를 갖춘 뒤 단계적으로 확장해야 한다. 오류 처리는 멱등성을 중심으로 설계한다.

분산 컴퓨팅RayTensorFlow DistributedMLOps분산 학습