What's Ray Core?
What's Ray Core?
Ray Core는 분산 애플리케이션을 만들고 확장하기 위한 필수 프리미티브(태스크, 액터, 객체)를 제공하는 강력한 분산 컴퓨팅 프레임워크예요. 이 페이지에서는 파이썬 함수·클래스를 분산 Ray 태스크·액터로 바꾸는 방법과 Ray 객체 활용법을 간단한 예시로 살펴볼게요.
출처: What's Ray Core?
시작하기
Ray 설치는 pip install -U ray로 해요. 추가 설치 옵션은 Installing Ray 문서를 참고해요.
먼저 Ray를 import 하고 초기화해요.
import ray
ray.init()
:::note
명시적으로 ray.init()을 호출하지 않아도, Ray 원격 API를 처음 호출할 때 인자 없이 ray.init()이 암시적으로 호출돼요.
:::
태스크 실행하기
태스크는 파이썬 함수를 Ray 클러스터에서 병렬화하는 가장 간단한 방법이에요. 태스크를 만들려면:
- 함수를
@ray.remote로 장식해 원격 실행되도록 표시 - 일반 함수 호출 대신
.remote()로 호출 ray.get()으로 반환된 future(Ray 객체 참조)의 결과를 검색
간단한 예시예요:
# Define the square task.
@ray.remote
def square(x):
return x * x
# Launch four parallel square tasks.
futures = [square.remote(i) for i in range(4)]
# Retrieve results.
print(ray.get(futures))
# -> [0, 1, 4, 9]
액터 호출하기
태스크는 무상태(stateless)인 반면, Ray 액터는 메서드 호출 사이에 내부 상태를 유지하는 상태를 가진 워커를 만들 수 있게 해 줘요. Ray 액터를 인스턴스화하면:
- Ray가 클러스터 어딘가에 전용 워커 프로세스를 시작
- 액터의 메서드가 그 특정 워커에서 실행되어 그 상태에 접근·수정
- 액터가 받은 순서대로 메서드 호출을 직렬 실행해 일관성 유지
간단한 Counter 예시예요:
# Define the Counter actor.
@ray.remote
class Counter:
def __init__(self):
self.i = 0
def get(self):
return self.i
def incr(self, value):
self.i += value
# Create a Counter actor.
c = Counter.remote()
# Submit calls to the actor. These calls run asynchronously but in
# submission order on the remote actor process.
for _ in range(10):
c.incr.remote(1)
# Retrieve final actor state.
print(ray.get(c.get.remote()))
# -> 10
이 예시는 기본 액터 사용법을 보여줘요. 태스크와 액터를 함께 쓰는 더 포괄적인 예시는 Monte Carlo Pi 추정 예시를 참고해요.
객체 전달하기
Ray의 분산 객체 스토어는 클러스터 전반의 데이터를 효율적으로 관리해요. 객체를 다루는 세 가지 주요 방법이 있는데, 태스크·액터의 입력과 출력이 전부 Ray 객체(원격 객체)로 표현돼요. 객체는 클러스터의 어느 노드에든 저장될 수 있고, 이를 참조하는 데 **객체 참조(object ref)**를 사용해요.
정리
Ray Core는 태스크·액터·객체 세 가지 핵심 프리미티브를 제공해요.
- 태스크:
@ray.remote로 장식해.remote()로 호출하면 병렬 실행돼요. - 액터: 상태를 가진 워커로, 같은 액터의 메서드 호출은 직렬 실행되고 상태를 공유해요.
- 객체: 분산 객체 스토어에 저장되어 참조로 전달돼요.
이 세 프리미티브를 조합하면 단일 파이썬 노트북부터 대규모 클러스터까지 유연하게 확장할 수 있어요.
더 알아보기
- Tasks — 원격 함수 상세
- Actors — 액터 상세
- Objects — 객체 스토어 상세
- Ray Overview — Ray 전체 구조