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/ 참고!
'Language & OS > python' 카테고리의 다른 글
[error] RuntimeError: CUDA error: no kernel image is available ~ (0) | 2022.05.20 |
---|---|
[python] 캐시데이터 일괄 삭제하기 (0) | 2022.02.09 |
[python] print와 pprint의 차이 (0) | 2022.01.06 |