1. Ray란?
Ray를 테스트 해볼 수 있는 환경을 구성하였으니 Ray를 사용해봐야 합니다.
Ray는 아직까지 국내에서는 활성화된 라이브러리가 아니라서 자료를 찾아보기 어려운데요,
가장 공부해보기 좋은 자료는 Ray 공식 문서입니다.
docs.ray.io/en/master/ray-overview/
A Gentle Introduction to Ray — Ray v2.0.0.dev0
.rst .pdf to have style consistency -->
docs.ray.io
공식 문서에 따르면 Ray는 "분산 애플리케이션을 구축하기 위해 간단하고 범용적인 API를 제공"을 미션으로 합니다.
그리고 그 미션을 달성하기 위해 아래 3가지 목표가 있습니다.
- Providing simple primitives for building and running distributed applications.- 분산 애플리케이션을 구축하고 실행시키기 위해 간단한 primitives를 제공합니다. 여기서 primitives는 Ray를 위한 primitive type으로 이해를 했지만... 정확한 뜻을 이해하기는 어렵네요.
- Enabling end users to parallelize single machine code, with little to zero code changes.- 엔드 유저가 코드 변경이 거의 없이 일반 코드를 병렬화 가능하게 합니다.
- Including a large ecosystem of applications, libraries, and tools on top of the core Ray to enable complex applications.- 복잡한 애플리케이션 지원을 위해 대규모 에코시스템의 애플리케이션, 라이브러리, 툴을 Ray Core 위에 올릴 수 있습니다.
따라서 @ray.remote라는 데코레이터 만으로 함수나 클래스를 병렬화할 수 있고,
Tune, RLib, RaySGD, RayServe와 같은 자체 라이브러리, Scikit-learn이나 Analytics Zoo같은 에코시스템 위에 Ray를 올릴 수 있습니다.
2. Ray tasks
# Ray 라이브러리 로드
import Ray
# Ray 서비스 시작
# Single Machine 환경 : ray.init()
# Cluster 환경 : ray.init(address='auto')
# Debug 모드 : ray.init(local_mode=True)
ray.init()
# 일반 함수에 @ray.remote를 사용하는 것만으로 코드를 병렬화 가능함
@ray.remote
def f(x):
return x * x
# 함수.remote()로 tasks를 생성
# 생성한 task는 ObjectRef 형태로 반환되며, ray.get(ObjectRef)를 통해 함수가 병렬로 실행됩니다.
futures = [f.remote(i) for i in range(4)]
print(ray.get(futures)) # [0, 1, 4, 9]
# Ray Runtime 종료
ray.shutdown()
코드 해석 (넘겨도 괜찮습니다)
ray는 ray.init()이라는 명령어로 Ray Runtime을 실행합니다.
Ray Runtime은 실행 이후 백그라운드에서 Ray의 병렬화를 위한 통신, 데이터 전송, 스케쥴링을 지원합니다.
@ray.remote 데코레이터를 통해 일반 함수를 Ray tasks로 변환할 수 있습니다.
변환된 함수는 이제 일반적인 실행 방법으로는 Call 할 수 없고,
f.remote(x) 형태로 tasks를 생성(아직 실행되지 않은 상태)하고 ObjectRef 형태로 반환 받습니다.
반한된 ObjectRef를 리스트 형태로 저장한 뒤 ray.get(ObjectRefList)를 통해 함수가 자동으로 병렬로 실행되고 결과를 반환 받을 수 있습니다.
그리고 Ray Runtime을 ray.shoutdown()을 통해 종료합니다.
코드를 보면 알 수 있듯이 @ray.remote, ray.init, ray.remote, ray.get의 4가지만 이해하여도 코드를 병렬화할 수 있다는 엄청난 장점이 있습니다.
다음에는 Ray를 사용하면 얼마나 빨라지는지 테스트해보겠습니다.
'스터디 > 기타' 카테고리의 다른 글
[Linux] Udemy - Linux Command Line 부트캠프 강의 후기 (0) | 2024.04.28 |
---|---|
[Leetcode] 01. Add Two Numbers (Medium) (2) | 2022.02.19 |
[Ray] 0. GCP와 Docker를 이용한 Jupyter Notebook 환경 구성 (0) | 2021.03.07 |
[Open API] 사이퍼즈 전적 검색 사이트 만들기 #1 - 닉네임 검색 (1) | 2019.08.04 |
[프로세스 마이닝] Data Science In Action 강의 - 02 (0) | 2019.08.03 |