훈스비
개발잡부
훈스비
전체 방문자
오늘
어제
  • 분류 전체보기 (35)
    • 스터디 (29)
      • 데이터 분석 (4)
      • SQL (4)
      • Python (1)
      • JavaScript (1)
      • Spark (1)
      • DevOps (7)
      • 기타 (8)
      • 검색 엔진 (3)
    • 나의 이야기 (4)
      • 회사 생활 (3)
    • 사이드 프로젝트 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Docker
  • elasticsearch
  • flask
  • GCP
  • github copilot
  • helm
  • java
  • jupyterhub
  • k8s
  • Kubernetes
  • leetcode
  • linux
  • ncp
  • Ray
  • ReplicaSet
  • spark
  • spring
  • sql
  • udemy
  • Virtualization
  • vm
  • vsCode
  • vue
  • 개발원칙
  • 검색엔진
  • 데이터 분석
  • 랭킹
  • 백엔드
  • 사이드프로젝트
  • 유사도 정규화

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
훈스비

개발잡부

[Ray] 0. GCP와 Docker를 이용한 Jupyter Notebook 환경 구성
스터디/기타

[Ray] 0. GCP와 Docker를 이용한 Jupyter Notebook 환경 구성

2021. 3. 7. 17:55

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 인스턴스 생성

 

무료 크레딧으로 VM Instance를 만들어보자.

 

인스턴스는 아래 스펙으로 생성하였습니다.

 

가입 시에 받는 무료 크레딧으로 생성하였으며, 아래 스펙처럼 설정하면 과금이 발생합니다.

만약 GCP 계정을 유료 계정으로 업그레이드 하였다면 꼭 과금에 주의하세요!

 

과금에 주의해야 하는 스펙

 

완료된 인스턴스에 저는 putty를 이용하여 SSH 접속하였습니다.

puttygen으로 public/private key fair를 생성하였고, GCP의 Compute Engine > 메타데이터 > SSH 키에 공개키를 넣어 SSH 접속 환경을 구성하였습니다.

 

putty로 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 주소로 주피터 노트북 환경에 접속이 가능하게 됩니다.

 

VM 인스턴스의 주피터 노트북 환경에 접속

 

마지막으로 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가 접속 가능하도록 설정해주어야 합니다.

구성한 Jupyter Notebook 환경에서 Ray 테스트. ray.init(dashboard_host='0.0.0.0')으로 반드시 실행시켜야 함

 

구성한 VM 인스턴스가 32GB 메모리 환경이어서인지, shm_size=4G로 설정하였음에도 더 설정하라는 경고 메시지가 발생합니다. 변경하려면 docker 컨테이너를 삭제하고 docker run을 shm_size만 변경하여 다시 실행시키면 됩니다.

그리고 실행한 Ray가 어떻게 병렬로 처리하고 있는지를 확인하기 위한 Ray Dashboard는 VM의 외부IP:8265로 접속하시면 확인 가능합니다.

Ray Dashboard - 8개의 워커가 IDLE 상태로 대기 중임

 

이제 험난했던 환경 설정은 드디어 끝났습니다.

다음에는 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
    '스터디/기타' 카테고리의 다른 글
    • [Leetcode] 01. Add Two Numbers (Medium)
    • [Ray] 1. Python - Ray의 기본 개념과 Tasks
    • [Open API] 사이퍼즈 전적 검색 사이트 만들기 #1 - 닉네임 검색
    • [프로세스 마이닝] Data Science In Action 강의 - 02

    티스토리툴바