Python Ray

Tae Hyun Kim·2022년 2월 17일
0

Ray

Ray 란?

Ray provides a simple, universal API for building distributed applications.
Ray는 병령 및 분산 어플리케이션 제작을 위한 universal API임

Ray 특징

  • 사용성: 기존 코드에서 약간의 수정만으로 병렬 처리 가능 (쉽고 범용성 높음)
    • 병렬처리 고려하지 않은 함수에 decorator로 마지막에 구현 가능
      @ray.remote
    • def, class 모두 가능
  • Cluster 환경에서 구축 가능
    • AWS, GCP, Azure, Kubernetes 등의 설정 제공
  • Dashboard 존재
  • python 내장 multiprocessing 보다 빠른 성능
  • 생태계
    • 강화학습을 위한 RLLib
    • 하이퍼파라미터 튜닝을 위한 Ray Tune
    • 분산 학습을 위한 Ray SGD
    • Serving을 위한 Ray Serve
    • 그 외에 Dask, Horovod, Hugging Face, Modin, PyCaret, Scikit Learn, Spacy,
      XGBoost, Seldon Alibi 등 다른 라이브러리와 활발하게 성장 중
  • Nested 실행 가능
    * Ray Task의 호출 결과로 여러 Task가 생성될 수 있음

Ray 구성 요소

  1. Task, Actor, Object, Driver, Job
  2. Node, Worker, Scheduler, Global, Control Store (To-do, 추후 업로드 예정)
  • Task: Remote Function
    • @ray.remote로 Function을 감쌌을 때 Task
    • 호출하는 곳과 다른 프로세스에서 실행되는 함수 / 호출자와 asynchronously 실행
    • .remote() 를 통해 Task 실행 \rightarrow ObjectRef 반환
    • ray.get(ObjectRef)을 통해 값 반환
      @ray.remote
      def example():
      """ example function """
      ...
      return result
      # example.remote()
      ray.get(example.remote())
  • Actor
    • @ray.remote로 감싼 클래스 인스턴스
  • Object
    • 어플리케이션의 value
    • Task를 통해 반환 혹은 ray.put()을 통해 생성
      • ray.put()는 큰 배열을 공유 메모리에 저장, 복사본을 만들지 않고 모든 작업자에 프로세스에 액세,
      • 복사본을 만들지 않으므로 메모리 아낄 수 있음
    • immutable하며 생성되면 수정되지 않음
  • Driver
    • 프로그램의 메인 루트
    • ray.init()을 호출하여 실행
  • Job
    • 동일한 Driver에서 발생한 Task, Actor, Object의 컬렉션

Ray 사용법

TASK 생성 / 실행 / 반환

  1. ray import 및 실행
import ray
ray.init()
  1. Task/Remoted Function 생성
 import numpy as np
 
 @ray.remote
 def create_matrix(size):
   return np.random.normal(size=size)
 
 @ray.remote
 def multiply_matrices(x, y):
   return np.dot(x, y)
  1. .remote() 메서드를 통한 Task 실행 asyncronization
x_id = create_matrix.remote([1000, 1000])
y_id = create_matrix.remote([1000, 1000])
z_id = multiply_matrices.remote(x_id, y_id)
  1. .get()을 통한 값 반환 syncronization
z = ray.get(z_id)

프로세스 종료

ray.shutdown()

ray.put()

데이터를 공유 메모리에 저장하여 복사본을 만들지 않고 모든 프로세스에서 접근, ray.put() 을 사용해 메모리 사용을 줄일 수 있음

 import numpy as np
 import ray
 
 ray.init(num_cpus=16)
 
 arr = np.random.random(1000000)
 
 @ray.remote
 def mul(x):
   return x * 10
 
 arr = ray.put(arr)
 result = ray.get(mul.remote(arr))

References

  1. https://zzsza.github.io/mlops/2021/01/03/python-ray/
  2. https://velog.io/@otzslayer/Ray를-이용해-Python-병렬-처리-쉽게-하기
profile
I'm a M.S candidate in department of Biomedical Systems Informatics, Yonsei University College of Medicine.

0개의 댓글