레이 (분산 컴퓨팅): 두 판 사이의 차이
편집 요약 없음 |
편집 요약 없음 |
||
49번째 줄: | 49번째 줄: | ||
print(ray.get(futures)) # [0, 1, 4, 9] | print(ray.get(futures)) # [0, 1, 4, 9] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===동작 흐름===*함수 호출자는 해당 작업의 '''소유자(owner)'''가 되며, ObjectRef를 관리한다. | |||
=== 동작 흐름 === | |||
* 함수 호출자는 해당 작업의 '''소유자(owner)'''가 되며, ObjectRef를 관리한다. | |||
*작업 제출 시, owner는 인자로 전달된 모든 ObjectRef가 준비될 때까지 대기한다. | *작업 제출 시, owner는 인자로 전달된 모든 ObjectRef가 준비될 때까지 대기한다. | ||
* 준비 완료되면, 분산 스케줄러에 자원을 요청하고 작업 실행을 위한 워커 주소를 받는다. | * 준비 완료되면, 분산 스케줄러에 자원을 요청하고 작업 실행을 위한 워커 주소를 받는다. |
2025년 5월 14일 (수) 04:38 판
레이(Ray)는 머신 러닝 및 분산 애플리케이션을 위한 범용 분산 컴퓨팅 프레임워크이다.
개요
레이는 파이썬 중심의 API를 기반으로 하며, 간결한 코드로 대규모 분산 처리를 가능하게 해주는 범용 분산 실행 엔진이다. Ray는 동시성(concurrency), 병렬성(parallelism), 분산성(distribution)을 모두 지원하며, 특히 강화 학습, 하이퍼파라미터 튜닝, 대규모 데이터 처리 등의 머신 러닝 워크로드에 적합하다. 서버리스(serverless) 방식의 분산 실행 모델을 채택하여 사용자가 인프라를 직접 관리하지 않고도 작업을 분산 실행할 수 있도록 설계되었다.
주요 특징
- 파이썬 기반의 간단한 API 제공
- 함수 기반의 원격 실행(Remote Function) 및 액터(Actor) 모델 지원
- 스케일 아웃 가능한 병렬 처리 프레임워크
- 다양한 머신 러닝 툴킷과 통합(TensorFlow, PyTorch 등)
- 자동 리소스 관리 및 스케줄링 기능 포함
- 강화 학습, 서빙, 튜닝을 위한 하위 프레임워크 포함(Ray RLlib, Ray Serve, Ray Tune)
주요 구성 요소
- Ray Core: 분산 태스크 및 액터 실행을 위한 기본 모듈
- Ray Tune: 대규모 하이퍼파라미터 튜닝을 위한 라이브러리
- Ray RLlib: 강화 학습 알고리즘의 분산 학습을 위한 프레임워크
- Ray Serve: 머신 러닝 모델 서빙을 위한 확장 가능한 서버리스 솔루션
- Ray Data: 분산 데이터 로딩 및 전처리를 위한 컴포넌트
아키텍처
Ray 클러스터는 헤드 노드(head node)와 하나 이상의 워커 노드(worker node)로 구성된다.
헤드 노드
헤드 노드는 클러스터 전체를 관리하며, 워커 노드와 동일한 구성 요소에 더해 아래의 두 가지 주요 컴포넌트를 추가로 포함한다.
- Global control store (GCS): 클러스터 전역 정보를 저장하는 구성 요소로, 객체 테이블, 태스크 테이블, 함수 테이블, 이벤트 로그 등을 포함한다. 이 정보는 웹 UI, 디버깅, 프로파일링 등에 활용된다.
- Autoscaler: 워크로드에 따라 워커 노드를 자동으로 생성하거나 제거하여 자원 낭비를 줄이고 성능을 최적화한다.
헤드 노드는 기본적으로 단일 장애 지점(single point of failure)으로, 장애 발생 시 클러스터 전체가 소실되며 재생성이 필요하다. 이로 인해 기존 워커 노드는 고아 노드(orphaned node)가 되어 수동으로 제거해야 할 수 있다.[1]
워커 노드
각 워커 노드는 Raylet이라는 핵심 컴포넌트를 포함하며, 이는 다음 두 구성 요소로 구성된다.
- Object store: 분산 캐시와 유사하게 작동하며, 클러스터 내 모든 object store는 연결되어 하나의 통합 캐시를 구성한다.
- Scheduler: 각 노드는 로컬 스케줄러를 통해 작업을 수행하며, 다른 노드와 통신하여 전역 분산 스케줄러로 기능한다.
리모트 함수
Remote function은 Ray에서 분산 병렬 처리를 위해 사용하는 기본 단위로, 다음과 같은 현대 애플리케이션 요구사항을 충족한다.
- 동일한 코드를 여러 코어나 머신에서 실행 가능
- 오류 발생 시 자동 재시도 등 내결함성 제공
- 큰 파라미터도 효율적으로 처리 가능
- 프로세스 간 정보 전달이 용이함
Ray는 함수 호출을 올바른 프로세스로 자동 매핑하여 실행하며, 함수 호출 결과는 곧바로 ObjectRef 형태로 반환된다. 이 ObjectRef는 실제 결과가 저장될 미래 객체에 대한 참조이다.
실행 방식
- 사용자가 remote 함수를 호출하면, Ray는 작업을 비동기적으로 분산 실행한다.
- ObjectRef를 통해 값을 나중에 받아올 수 있으며, ray.get()을 사용하여 결과를 확인한다.
- remote 함수는 반드시 다른 머신에서 실행되는 것은 아니며, 같은 노드 내 다른 프로세스일 수도 있다.
예시 코드
import ray
ray.init()
@ray.remote
def f(x):
return x * x
futures = [f.remote(i) for i in range(4)]
print(ray.get(futures)) # [0, 1, 4, 9]
동작 흐름
- 함수 호출자는 해당 작업의 소유자(owner)가 되며, ObjectRef를 관리한다.
- 작업 제출 시, owner는 인자로 전달된 모든 ObjectRef가 준비될 때까지 대기한다.
- 준비 완료되면, 분산 스케줄러에 자원을 요청하고 작업 실행을 위한 워커 주소를 받는다.
- gRPC를 통해 워커에게 작업 명세를 전달하며, 워커는 작업을 실행 후 결과를 저장한다.
- 작은 결과는 인라인으로 전달되고, 큰 객체는 local object store에 저장된다.
오류 처리
- 응용 수준 오류: 예외가 발생하면 해당 예외 객체가 결과로 반환되며, 재시도는 이루어지지 않는다.
- 시스템 수준 오류: 예를 들어 워커 프로세스가 죽는 경우, 지정된 횟수만큼 자동 재시도된다.
- max_retries 옵션을 통해 최대 재시도 횟수를 설정할 수 있다.
예시 코드
import ray
ray.init()
@ray.remote
def f(x):
return x * x
futures = [f.remote(i) for i in range(4)]
print(ray.get(futures))
위 예시는 4개의 태스크를 병렬로 실행한 뒤 결과를 수집하는 단순한 병렬 처리 예제이다.
사용 사례
- 대규모 강화 학습 환경 구축 및 실험(RLlib)
- 수천 개의 하이퍼파라미터 조합을 통한 모델 최적화(Ray Tune)
- 실시간 모델 예측 요청 처리(Ray Serve)
- 분산 데이터 로딩 및 전처리(Ray Data)
- 일반적인 병렬 처리 및 배치 작업 수행
Ray와 다른 프레임워크 비교
- Dask와 유사한 파이썬 중심의 API를 제공하지만, Ray는 액터 모델 기반의 상태 유지 작업에 더 적합하다.
- Apache Spark보다 경량이며, 머신 러닝에 특화된 구성 요소를 포함하고 있다.
- Celery와 달리 분산 스케줄링 및 리소스 관리를 자동으로 처리한다.
같이 보기
참고 문헌
- Moritz, Philipp et al. Ray: A Distributed Framework for Emerging AI Applications. Proceedings of the 13th USENIX Symposium on Operating Systems Design and Implementation (OSDI), 2018.
- Anyscale, Inc. The Ray Documentation. https://docs.ray.io/
각주
- ↑ Ray 2.0부터는 외부 고가용성 Redis 데이터베이스와 함께 Kubernetes 위에 배포할 경우 GCS 장애 허용 기능을 지원한다.