본문 바로가기
Development/for Machine Learning

딥러닝 프로젝트를 위한 클라우드 GPU 자원, Google Cloud Platform

by IMCOMKING 2019. 12. 8.

GPU Cloud 서비스

무료 GPU 서버

현재까지 알려진 가장 좋은 무료 GPU 서비스는 Google colab이 유일하다. 그러나 colab은 하루에 12시간까지밖에 GPU를 쓸 수 없는 제약이 있고, 데이터를 지속적으로 서버에 올려둘 수가 없어서 google drive에 데이터를 올리고 이를 mount해서 사용해야하는데 이게 매우 불편하다. 또한 command line interface를 제공하지 않아서, jupyter의 cell에 !을 입력해서 해야하는데, 이 또한 매우 불편하다. 그리고 jupyter notebook도 기존에 사용하던 jupyter와 단축키 및 기능이 조금씩 달라서 적응하는데 꽤 시간이 걸린다. 그럼에도 불구하고 한시간에 1000원정도 하는 T4 GPU를 무료로 쓸 수 있다는 것은 분명 엄청난 메리트이다. 그러나 보다 진지한 프로젝트를 원하다면 다음과 같은 cloud gpu server를 사용해야한다.


AWS vs Google Cloud Platform

2019.12.08 현 시점, K80을 기준으로 둘의 가격차이는 대략 2배정도 나는 것으로 보인다. 구글은 시간당 0.45달러, 아마존은 0.9달러이다. 


가격차이에 더불어서 GCP는 TPU를 사용할 수 있다는 장점과 더 다양한 종류의 GPU들이 있고, interface도 AWS에 비해 쉽고 간편한 것으로 보인다.

https://towardsdatascience.com/maximize-your-gpu-dollars-a9133f4e546a


GPU 서버를 직접 구매하면?

2019.12.08 현 시점에서 Tesla T4의 가격은 350만원정도이다. 이를 GCP에서 사용할 경우 독점 사용이 시간당 0.95달러, 선점형이 0.29달러이고, 1년 악졍이 0.6달러이다. 현재 환율이 대략 1200이니까, 350만원은 대략 2900달러이고, 이를 각 case별 시간으로 환산하면 3050시간, 10000시간, 4830시간이 된다.

1만시간이면 416일을 full로 사용해야하는 엄청난 시간이다. GPU를 full로 돌리는 일은 생각보다 많지 않기 때문에, 못해도 2~3년은 사용할 수 있는 것이고 거기에 추가적으로 CPU나 전원 등의 기타장비와 인터넷 비용, 공간비용, 유지관리 비용까지 생각하면 생각보다는 저렴한 가격으로 생각할 수 있다. 또한 클라우드 GPU의 경우 원할 경우 동시에 N대로 늘려서 사용할 수 있다는 장점 또한 있다. 즉 결론은 소규모 프로젝트나 스타트업의 경우 GPU cloud를 이용하는 것이 여러모로 직접 인프라를 구축하는 것 보다 편리할 수 있다.


GCP의 다양한 가격정책

- 선점형 가격정책은 AWS의 spot instance와 거의 동일한 개념이다. 다만 bidding이 없이 고정된 가격으로 정해져있어서 예측이 더 쉬운 장점이 있다. 언제든지 instance가 종료될 수 있으므로, 이에 대한 대비 코드가 짜여져야 한다는 요구사항만 만족하면 대충 1/3 가격에 자원을 사용할 수 있다.

https://medium.com/@jwlee98/%EC%A2%80-%EB%8D%94-%EC%A0%80%EB%A0%B4%ED%95%98%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-google-cloud-platform-gcp-456cd71379f8





GCP VM Instance만들기

# 용어 및 사전 정보

commited CPU

약정할인으로, 일정기간 예약해둔 instance로 요금 할인을 받는다.

https://cloud.google.com/compute/docs/instances/signing-up-committed-use-discounts


N1, N2 CPU

- N1: 1세대인 N1 머신 유형. 이 머신 유형은 최대 96개의 vCPU와 vCPU당 6.5GB의 메모리를 제공하며 Intel Sandy Bridge, Ivy Bridge, Haswell, Broadwell, Skylake CPU 플랫폼에서 사용할 수 있습니다.

- N2: 최신 세대인 N2 머신 유형. 이 머신 유형은 최대 80개의 vCPU와 vCPU당 8GB의 메모리를 제공하며 Intel Cascade Lake CPU 플랫폼에서 사용할 수 있습니다.


요금제

- All Upfront(모두 선불): 3년 또는 1년 RI의 기간 이용 금액을 모두 일괄로 사전에 지불합니다. 가장 저렴합니다.

- Partial Upfront(일부 선불): 이용액의 일부를 사전에 지불하고 3년 또는 1년 RI의 기간 동안 매월 지불하는 옵션입니다. All Upfront와 No Upfront의 중간 할인율입니다.

- No Upfront(선불 없음): 사전 요금은 없습니다. 다만, RI의 기간 동안 지불 계약을 하며 할인율은 온 디멘드에 비해 30%가량 싸집니다. 이 옵션의 기간은 1년간 뿐입니다.


# GCP region 고르기

Instance를 만들기 전에 어떤 region이 나에게 가장 적합할지 골라야한다. 먼저 물리적인 거리가 가까울 수록 latency가 낮기 때문에 좋고, 내가 원하는 GPU가 있는지 따져봐야한다.
https://cloud.google.com/compute/docs/regions-zones/


만약 V100을 사용하고 싶으면, 아래의 링크에서 사용 가능한 구체적인 region과 zone을 알아내야한다. 현재는 asia-east1-c에서 GPU Memory 16gb짜리 V100을 제공하고 있다.

https://cloud.google.com/compute/docs/gpus


단, GPU를 포함한 VM instance를 만들기 위해서는 CPU를 N1 타입으로 골라야만 한다.



# GCP Quotas설정하기
IAM - Quotas - Metric - GPUs(all regions) - 10개로 설정.

그런데 바로 request가 승인되지 않고, 2일이 걸린다는 답장이 이메일로 왔다.
https://stackoverflow.com/questions/53415180/gcp-error-quota-gpus-all-regions-exceeded-limit-0-0-globally



# 요금 상세 내역 확인하기

Billing - Transactions에 들어가면 상세한 요금 내역을 볼 수 있다.



# Network 등급 설정

프리미엄과 스탠다드 둘 중에서 고를 수 있다. 비용적인 측면에서 보면 스탠다드를 선택하는 것이 좋으나, 실제 딥러닝 프로젝트에서 network의 사용량이 크지 않기 때문에, 사용량에 비례하여 요금이 청구되는 특성상, 전체 비용에서 차지하는 비중이 크다지 크지 않다. 따라서 그냥 기본 옵션인 프리미엄으로 해도 무방하다.


# Storage 타입 별 요금비교

SSD와 Standard HDD를 비교해보면, 대략 SSD가 4배정도 더 비싸고, Balanced의 경우 그 중간 정도의 가격임을 알 수 있다.

게다가 Storage의 경우 instance를 stop인 상태로 두어도 사용한 공간에 비례하여 계속해서 요금이 지불되기 때문에 GPU사용량이 적은 경우, 생각보다 Storage의 요금 비중이 클 수 있다.

따라서 특별히 SSD를 써야하는 경우가 아니라면, 그냥 HDD(Standard)를 선택하도록 하자.


# 시작 Docker Image 설정

아래와 같이 공개된 docker hub이미지 중에서 원하는 것을 고를 수 있다.

pytorch/pytorch:1.5.1-cuda10.1-cudnn7-devel


또는 구글에서 직접 제공하는 이미지도 이곳에서 확인하여 선택할 수 있다.


Docker image를 선택하면, 무조건 OS가 chromium 기반의 optimized-container OS만 선택이 된다. 그리고 머신 실행시 해당 도커 이미지를 사용한 컨테이너를 자동으로 생성해준다.

근데 이게 생각보다 불편하다. 그리고 docker image를 입력해줘도 실행 스크립트의 문제인지 무한히 restarting 상태만 반복되고 제대로 실행이 안된다. 


따라서 Docker image를 고르지 않고, Ubuntu OS로 VM Instance를 만들고, Docker image는 따로 다운받는게 나아보인다.


# Instance Templates

자주 사용하는 VM의 스펙을 미리 정의해둘 수 있다. 아래는 내가 정의한 v100을 사용하는 instance이다. 가격은 preemtibility을 켰을 때 시간당 0.8달러 정도이고, 그렇지 않을 때 1.88달러이다.



# Instance 생성 시 에러 해결

instance failed to start due to preemtion.

Preemptible instances are available from a finite amount of Compute Engine resources, and might not always be available.

즉 현재 자원이 부족해서 preemtible instance를 만들 수 없다는 것이다.

https://stackoverflow.com/questions/31343498/how-do-i-automatically-restart-a-gce-preemptible-instance





GCP 사용하기

# 고정 IP 할당하기

Instance를 만든다음, 우측 숨김 메뉴에서 View network details를 클릭하고, VPC network 창이 뜨면 여기서 왼쪽 메뉴의 External IP Address를 클릭한다. 그 다음 Type을 ephemeral에서 static으로 변경해주고 이름을 지어준다.




고정 IP할당시 요금은 좀 특이한데, 고정 IP를 할당만해두고 사용하지 않은 경우 시간당 0.01 달러인 반면, Preemtible instance에 할당한 경우 0.002 달러로 하루에 55원, 한달에 1600원 정도한다.


Jupyter 접속을 위한 방화벽 설정

Name: <Enter a firewall name>
Targets: All instances in the network
Source IP ranges: 0.0.0.0/0
Protocols and ports: Select “Specified protocols and ports” option.
tcp: 8888 <You can change any other port number>
Keep other configuration as default.
Click on the Create button.



# 자동 접속: gcloud 이용하기

이 방법은 매우 편리하다. gcloud만 설치하면 특별히 어려운 설정을 하지 않아도 바로 ssh접속이 된다.

gcloud 설치하기

# Add the Cloud SDK distribution URI as a package source

echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list


# Import the Google Cloud public key

curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -


# Update the package list and install the Cloud SDK

sudo apt-get update && sudo apt-get install google-cloud-sdk




최초 접속

gcloud init

그러면 구글 계정 인증을 위한 url이 출력되고, 이를 웹브라우져에 넣어서 구글 계정으로 로그인하여 인증한다. 

SSH 접속하기

또는 gcloud console에서 instance 우측에 화살표를 눌러서 적절한 gcloud command line을 확인할 수 있다.


sudo gcloud compute ssh "instance_name"



gcloud 명령어

VM Instance 시작하기

gcloud compute instances start "instance_name"

VM Instance 중단하기

gcloud compute instances stop "instance_name"

VM Instance SSH접속하기

gcloud compute ssh "instance_name"

기본 프로젝트 설정

sudo gcloud config set project project_id



# 수동 접속: SSH key로 접속하기

미리 gcloud를 이용해서 한 번이라도 접속한 경우, 자동 생성된 key가 저장되어있다.

공개 키: $HOME/.ssh/google_compute_engine.pub
비공개 키: $HOME/.ssh/google_compute_engine

Connect with private SSH key

ssh-keygen -t rsa -C "my@mail.com" 

https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys#createsshkeys

https://stackoverflow.com/questions/27535945/how-to-get-the-ssh-keys-for-a-new-google-compute-engine-instance


SSH with private key

ssh -i path-to-private-key username@external-ip



Ubuntu 18.04 VM Instance 초기 설정

Docker 설치하기

Official Script 이용해서 설치하기

curl https://get.docker.com | sh
sudo systemctl start docker && sudo systemctl enable docker

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker


docker run hello-world

수동으로 설치하기

sudo apt-get update

sudo apt-get install \

    apt-transport-https \

    ca-certificates \

    curl \

    gnupg-agent \

    software-properties-common


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 \

   $(lsb_release -cs) \

   stable"


sudo apt-get update

sudo apt-get install -y docker-ce docker-ce-cli containerd.io


sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

docker run hello-world

https://docs.docker.com/engine/install/ubuntu/




NVIDIA Driver 설치하기

Nvidia-docker를 설치하기 전에 반드시 NVIDIA Driver를 설치해야한다.(CUDA Toolkit까지 설치할 필요는 없다.)

Pre-installation

lspci | grep -i nvidia
uname -m && cat /etc/*release
gcc --version
sudo apt install gcc
uname -r
sudo apt-get install linux-headers-$(uname -r)

최신버전의 CUDA Installation

distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g')
wget https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/cuda-$distribution.pin
sudo mv cuda-$distribution.pin /etc/apt/preferences.d/cuda-repository-pin-600

sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/7fa2af80.pub
echo "deb http://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64 /" | sudo tee /etc/apt/sources.list.d/cuda.list
sudo apt-get update
sudo apt-get -y install cuda-drivers

Post-installation

echo "export PATH=/usr/local/cuda-11.1/bin\${PATH:+:\${PATH}}" >> ~/.bashrc
echo "export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64\ \${LD_LIBRARY_PATH:+:\${LD_LIBRARY_PATH}}" >> ~/.bashrc

sudo systemctl enable nvidia-persistenced
systemctl status nvidia-persistenced

cat /lib/udev/rules.d/40-vm-hotadd.rules
sudo cp /lib/udev/rules.d/40-vm-hotadd.rules /etc/udev/rules.d
sudo sed -i '/SUBSYSTEM=="memory", ACTION=="add"/d' /etc/udev/rules.d/40-vm-hotadd.rules


sudo /usr/bin/nvidia-persistenced --verbose
sudo nvidia-smi -pm 1

cat /proc/driver/nvidia/version

에러 해결: nvidia-persistenced failed to initialize. Check syslog for more details.

즉 위 메시지는 이미 persistence daemon이 실행중일 때 발생한다고 함.

sudo cat /var/log/syslog | grep -i nvidia
ps aux | grep persistenced



Nvidia-docker 설치하기

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker

sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi


문제해결: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]. 

sudo apt-get install -y docker nvidia-container-toolkit
sudo systemctl restart dockerd
또는
sudo systemctl restart docker

Pytorch Docker Container 만들기

원하는 pytorch 버전을 아래 링크에서 고른다.


nvidia에서 만든 pytorch docker image 고르기

docker pull nvcr.io/nvidia/pytorch:20.07-py3

Nvidia docker Container 만들기

docker run --gpus all -it -d --net=host -e HOME=$HOME -e USER=$USER -v $HOME:$HOME --name pytorch160 nvcr.io/nvidia/pytorch:20.07-py3

Container 접속하기

docker exec -it pytorch160 bash



그 이외에 여러가지

echo "alias sudop='sudo env PATH=\$PATH'" >> ~/.bashrc

miniconda설치

wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ./miniconda.sh
sudo /bin/bash ./miniconda.sh -b -p /opt/conda
export PATH=$PATH:/opt/conda/bin
echo "export PATH=\$PATH:/opt/conda/bin" >> ~/.bashrc



Jupyter 설치

sudo conda install jupyter

container상에서 jupyter 실행하기

docker exec -it pytorch160 jupyter notebook


bashrc에 container 자동 시작/접속 스크립트 넣기

echo "docker start pytorch160" >> ~/.bashrc
echo "docker attach pytorch160" >> ~/.bashrc




댓글