Ray효과적이고 단순하게 분산/병렬 컴퓨팅을 수행할 수 있도록 만든 매우 강력한 프레임워크이다.

 

Ray란

주로 병렬처리를 할 때 multiprocessing으로 웬만한 것은 쉽게 실행이 가능하지만, 아래와 같은 단점이 있다.

  • multiprocessing 라이브러리를 사용하기 위해 기존에 작성한 코드를 수정해야 함(Pool 생성해서 넘기기 등)
  • multiprocessing은 여러 클러스터에서 분산처리하기엔 초심자 입장에서 어려움

이를 대체할 수 있는 것이 바로 Ray이다! 그렇다면 Ray의 장점과 특징은?

  • 1) Apache Arrow를 활용하여 데이터를 효율적으로 처리하고 분산 컴퓨팅을 위한 task를 제공
  • 2) 기존 코드에서 약간의 수정만으로 병렬 처리 가능 : 쉽고 범용적인 사용성
  • 3) 멀티프로세싱보다 빠른 성능
  • 4) Dashboard가 존재해서 성능, 로그 등을 확인 가능
  • 5) 머신러닝/딥러닝에서도 활용하기 Good
  • 6) 로컬 환경, 클라우드의 쿠버네티스, 온프레미스 쿠버네티스 등 다양한 환경에서 사용 가능 (자세한 사항은 Windows Support 참고)

 

한 회사에서 성능과 속도를 실험했을때, Ray가 기본 serial python 보다 10-30배 빠르고, multiprocessing 보다 5-25배 정도 빠르다고 한다. 그리고 serial, multiprocessing을 좋은 머신에서 돌린 것보다 5-15배 빠르다고 한다.

Ray를 코드에 적용하는 방법

1.  설치하기

$ pip3 install ray

2. 적용하기

 1. 라이브러리 추가 (import ray)
     
 2. main 함수에서, ray.init() 추가 (Ray 초기화)
     
 3. 병렬처리 하고자 하는 함수 (또는 클래스) 정의 바로 앞에, @ray.remote 데코레이터 추가

 4. 해당 함수를 호출하려면, obj_id = 함수명.remote() (괄호 안에 인자값 넣을 수 있음)
 * obj_id(=object ID, =future, =최종 출력에 대한 참조 값)를 넣는 이유는, 비동기 처리를 위해서.
     
 5. 해당 함수의 리턴값을 받으려면, ray.get(obj_id)
 * 여러 함수들을 실행시켜 놓고, 먼저 끝난 함수부터 우선 처리하려면 ray.wait(obj_id_list) 활용

 

ray API 설명

  • ray.init()
    • ray를 초기화하고 병렬처리할 프로세스를 할당하고 context를 초기화, dashboard를 띄운다.
  • @ray.remote
    • 파이썬 함수를 Ray Task로 만들어주는 데코레이터
  • ray.remote()
    • remote 함수 호출시 사용하는 접미사로 기존 함수의 인자를 받을 수 있다.
    • 리턴 값은 ObjectRef인데, ray.get(ObjectRef) 하여 task를 실행하고 남은 값을 반환할 수 있다.
    • remote() 작업은 비동기적으로 실행된다.
  • ray.wait()
    • remote()로 지정된 object들 중 준비가 된 object id를 반환하며 task가 완료될 때까지 기다리는 역할을 함.
  • ray.get()
    • ObjectRef(object id)를 인자로 받아 object value를 반환
    • ray.get()은 동기적으로 실행
  • ray.shutdown()
    • ray.init()으로 할당된 프로세스를 종료하고 워커와의 연결을 끊는다.
    • Ray를 사용한 파이썬 프로세스가 종료되면 자동으로 이 코드가 실행됨 (jupyter에서는 직접 호출해야함)

자세한 예시는 https://zzsza.github.io/mlops/2021/01/03/python-ray/ 참고!

+ Recent posts