Ray란 아주 단순한 데코레이터만 사용하는 것으로 병렬 처리를 구현해주는 기능입니다.
# https://docs.ray.io/en/latest/#
# Ray 공식 문서에 있는 Getting Started with Ray Code
import ray
ray.init()
@ray.remote
def f(x):
return x * x
futures = [f.remote(i) for i in range(4)]
print(ray.get(futures)) # [0, 1, 4, 9]
@ray.remote라는 단순한 데코레이터로 함수 또는 클래스를 감싸는 것만으로 코드를 병렬 처리할 수 있습니다.
일반적인 파이썬 코드뿐 아니라 ML, Crawling 등에서 Ray를 활용하여 병렬 처리를 적용할 수 있고,
코어가 많을수록 그 속도는 일반 코드 뿐 아니라, 멀티프로세싱을 적용한 코드보다도 더 빠르다고 합니다.
이번에 크롤링을 할 때 Ray를 사용해본 경험을 하나씩 공유하고자 합니다.
Ray를 제대로 활용하기 위해서는 코어가 많은 환경이 필요하기에
GCP(Google Cloud Platform)와 Docker를 활용하여 Ray를 사용할 수 있는 노트북(Jupyter Notebook) 환경을 쉽게 구성하였습니다.
1. GCP 인스턴스 생성
인스턴스는 아래 스펙으로 생성하였습니다.
가입 시에 받는 무료 크레딧으로 생성하였으며, 아래 스펙처럼 설정하면 과금이 발생합니다.
만약 GCP 계정을 유료 계정으로 업그레이드 하였다면 꼭 과금에 주의하세요!
완료된 인스턴스에 저는 putty를 이용하여 SSH 접속하였습니다.
puttygen으로 public/private key fair를 생성하였고, GCP의 Compute Engine > 메타데이터 > SSH 키에 공개키를 넣어 SSH 접속 환경을 구성하였습니다.
2. Docker 설치 및 컨테이너 생성
이제 생성한 인스턴스에 접속을 완료하였으니 도커를 설치하고 주피터 노트북 컨테이너를 올려야 합니다.
Docker 설치 과정
# Root 패스워드 설정
sudo passwd
# apt 업데이트
sudo apt update
# 필수 패키지 설치
sudo apt install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
# 도커의 공식 GPG Key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 도커 설치 레포지토리 추가
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
# 도커 설치
sudo apt update
sudo apt install docker-ce docker-ce-cli
# sudo 명령 없이 docker 사용을 위해 현재 접속 중인 사용자에게 도커 권한 설정
sudo usermod -aG docker $USER
# 변경된 권한 사용을 위해 커널 재시작
reboot
# 도커 상태 확인
# 권한이 제대로 부여됐다면 정상적으로 출력이 되어야 함
docker info
Docker 설치는 완료했으니 jupyter/datascience-notebook 이미지를 다운 받고 컨테이너 생성합니다.
# 도커의 파일 시스템에 마운트할 공간 생성
mkdir jupyter
# docker run -it < 도커 컨테이너 생성&실행 (bash shell)
# -p 8265:8265 < ray dashboard 포트 연결
# -p 8000:8000 < jupyter notebook 포트 연결
# -e GRANT_SUDO=yes < sudo 허용
# -e TZ=Asia/Seoul < 타임존이 어긋나는 문제 해결을 위해 타임존을 Asia/Seoul로 설정
# --user root < 기본적으로 루트 사용자 (위험할 수 있음)
# --name jupyter-notebook < 컨테이너 이름 설정
# --shm-size=4G < Ray는 공유 메모리를 통해 서로 통신하기 때문에 공유 메모리 크기 설정
# - -v ~/jupyter:/home/jovyan/work < Ubuntu의 폴더와 컨테이너의 폴더를 마운트
# jupyter/datascience-notebook < 컨테이너 생성할 이미지 이름
docker run -it -p 8265:8265 -p 8000:8000 -e GRANT_SUDO=yes -e TZ=Asia/Seoul --user root --name jupyter-notebook --shm-size=4G -v ~/jupyter:/home/jovyan/work jupyter/datascience-notebook jupyter notebook --no-browser --allow-root --port 8000 --ip=0.0.0.0 --NotebookApp.token='' --NotebookApp.password=''
아, 참고로 GCP 콘솔에서 VPC 네트워크 > 방화벽에서 새로 8000, 8265 tcp를 열어주는 규칙을 만들고, VM 인스턴스 네트워크 태그에 추가해주어야 접속이 가능합니다.
이렇게까지 구성해였을 경우, VM 인스턴스의 외부IP:8000 주소로 주피터 노트북 환경에 접속이 가능하게 됩니다.
마지막으로 Ray 사용에 필요한 라이브러리만 설치하면 됩니다.
주피터 노트북 환경의 New > Terminal를 실행시켜서 아래 명령어를 쳐주시면 됩니다.
pip install ray
이제 VM 인스턴스의 jupyer 폴더와 마운트 시켜놓은 work 폴더 안에서 Python3 코드를 새로 만들어서 Ray 테스트를 해보면 됩니다.
여기서 주의하실 점은 도커 컨테이너는 VM 인스턴스의 외부 IP와 다른 별개의 가상 IP가 할당됩니다.
그렇기 때문에 ray.init()을 그냥 사용하게 되면 dashboard_host='127.0.0.1'로 기본값이 설정되고, 127.0.0.1은 컨테이너 본인의 IP주소에서만 접속 가능한 환경이기 때문에 외부 환경인 VM인스턴스 IP를 이용해 Ray Dashboard에 접속하려면 dashboard_host='0.0.0.0'을 설정하여 모든 host가 접속 가능하도록 설정해주어야 합니다.
구성한 VM 인스턴스가 32GB 메모리 환경이어서인지, shm_size=4G로 설정하였음에도 더 설정하라는 경고 메시지가 발생합니다. 변경하려면 docker 컨테이너를 삭제하고 docker run을 shm_size만 변경하여 다시 실행시키면 됩니다.
그리고 실행한 Ray가 어떻게 병렬로 처리하고 있는지를 확인하기 위한 Ray Dashboard는 VM의 외부IP:8265로 접속하시면 확인 가능합니다.
이제 험난했던 환경 설정은 드디어 끝났습니다.
다음에는 Ray를 이용하여 파이썬 코드가 얼마나 빨라지는지 테스트해보겠습니다.
'스터디 > 기타' 카테고리의 다른 글
[Leetcode] 01. Add Two Numbers (Medium) (2) | 2022.02.19 |
---|---|
[Ray] 1. Python - Ray의 기본 개념과 Tasks (2) | 2021.03.12 |
[Open API] 사이퍼즈 전적 검색 사이트 만들기 #1 - 닉네임 검색 (1) | 2019.08.04 |
[프로세스 마이닝] Data Science In Action 강의 - 02 (0) | 2019.08.03 |
[프로세스 마이닝] Data Science In Action 강의 - 01 (0) | 2019.08.03 |