deep learning cluster with aws -1-

Deep Learning Cluster를 구성하기

AWS GPU는 비싸다. 평소에는 CPU로 훈련하다가, GPU 자원을 활용하고 싶을때 어떻게 하면 좋을까?  GPU 인스턴스가 올라오면 자동으로 클러스터에 포함되고, 명령을 내리면 GPU에서 훈련하고,  훈련이 끝나면 모델은 공유디스크에 저장되고, GPU를 반납한다. Predict는 싼 CPU 인스턴스에서 하고, 필요할때만 GPU인스턴스를 사용하면 비용도 절감되고, 일석 이조이다.

개요는 디스크를 nfs로 공유하고(NAS나 Storage를 쓰면 좋겠지만 돈 없음), Job을 배분해주기 위하여 RabbitMQ와 Celery를 올리고, Rest를 통해 실행 명령을 내리면 Train  Job이 기동되는 형태로 구성할 예정이다.

TensorMSA Docker에는 기본으로 위 서비스들이 설치 되어 있기 때문에 TensorMSA Docker를 활용하여 구축하도록 한다.

<구성도 추가예정>

  • 목표와 작업순서
    Aws Instance 생성 cpu2개, gpu 2개
    Master Server에서 nfs 서비스 설치 및 Slave Server Directory Mount
    Cpu 인스턴스에 docker 설치, GPU 인스턴스에 Docker + Ndivia Docker 설치
    Cluster 연결을 위한 TensorMSA Docker 설정
    Cluster Test
  • AWS Instance 생성
    cluster를 구성하기 위하여 AWS에서 Instance를 생성한다.
    m2.xlarge  2대, P2.large 2대를 생성한다. 생성방법은 인터넷에 많이 있어요.
  • Nfs 서비스 생성
    우리는 훈련을 GPU Train서버에서 하고, Predict은 CPU서버에서 해야 하기 때문에 공유디스크를 설정해야 하는데 NAS나 SAN Storage를 쓰면 좋을텐데 돈이 없으므로 nfs서비스로 연결하도록 한다.
  • nfs 서비스 설치! 간단하게 설치 된다
sudo apt-get install nfs-kernel-server
  • /hoya_src_root /hoya_model_root /hoyai_playground 3개를 공유디렉토리로 설정한다. 디렉토리를 만들고, 소유권한을 바꾼다.
sudo mkdir /var/nfs/hoya_src_root -p
sudo mkdir /var/nfs/hoya_model_root -p
sudo mkdir /var/nfs/hoya_str_root -p
sudo mkdir /var/nfs/hoyai_playground -p


sudo chown nobody:nogroup /var/nfs/hoya_src_root
sudo chown nobody:nogroup /var/nfs/hoya_model_root 
sudo chown nobody:nogroup /var/nfs/hoya_str_root
  • /etc/exports 파일에 nfs 설정을 한다. RW(읽고 쓰고), sync(다 썼을때 회신)
    아무나 접속하는것을 막기 위해서 IP를 넣어서 지정된 IP만 접속하도록 설정한다.
    aws에서는 private ip는 고정 되므로 private ip를 사용하면 된다.
    public ip는 고정이 안될뿐더러 e-ip로 고정한다 할지언정 데이터를 쓰다가 트래픽이 인터넷구간으로 나가면 aws에서 network비용을 청구하므로 조심해야 합니다.
    예전 하둡 클러스터를 잘못 설정해서 network 비용이 100만원이 나온 기억이 나네요 ㅠㅠ
vi /etc/exports


/var/nfs/hoya_src_root   xx.xx.xx.xx(rw,sync,no_subtree_check)   xx.xx.xx.xx(rw,sync,no_subtree_check)
/var/nfs/hoya_model_root  xx.xx.xx.xx(rw,sync,no_subtree_check)   xx.xx.xx.xx(rw,sync,no_subtree_check)
/var/nfs/hoya_str_root   xx.xx.xx.xx(rw,sync,no_subtree_check)   
xx.xx.xx.xx(rw,sync,no_subtree_check)

  • nfs server설정이 끝났습니다. 다음에는 nfs를 gpu인스턴스에 연결하고 nvidia-docker를 설치해서 gpu instance를 올려보도록 하겠습니다 ^^service nfs-kernel-server reloadnfs service를 Reload한다.

Deep Learning Cluster with AWS for CPU

 

한국 지역 설정하기

sudo locale-gen ko_KR.UTF-8

tzselect

sudo apt-get install language-pack-ko

 

docker CE올리기

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo apt-key fingerprint 0EBFCD88
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 docker-ce

도커를 ubuntu계정에서 실행하게 변경(리붓해야지 반영됨)

sudo groupadd docker
sudo gpasswd -a ubuntu docker

 

우리 도커를 다운 받는다.

docker pull hoyai/hoyai_dev_docker:squashed

 

1번 서버는 nfs server를 올린다.

sudo apt-get install nfs-kernel-server

 

nfs 마운트 포인트를 만든다

sudo mkdir /var/nfs/hoya_src_root -p
sudo mkdir /var/nfs/hoya_model_root -p
sudo mkdir /var/nfs/hoya_str_root -p
sudo mkdir /var/nfs/hoyai_playground -p


sudo chown nobody:nogroup /var/nfs/hoya_src_root
sudo chown nobody:nogroup /var/nfs/hoya_model_root 
sudo chown nobody:nogroup /var/nfs/hoya_str_root

nfs conf

vi /etc/exports


/var/nfs/hoya_src_root   xx.xx.xx.xx(rw,sync,no_subtree_check)   xx.xx.xx.xx(rw,sync,no_subtree_check)
/var/nfs/hoya_model_root  xx.xx.xx.xx(rw,sync,no_subtree_check)   xx.xx.xx.xx(rw,sync,no_subtree_check)
/var/nfs/hoya_str_root   xx.xx.xx.xx(rw,sync,no_subtree_check)   xx.xx.xx.xx(rw,sync,no_subtree_check)

nfs reload 한다

service nfs-kernel-server reload

 

AWS에서 nfs용 Security group을 설정한다.

 

TCPPort (Service) Source 111 0.0.0.0/0  2049 0.0.0.0/0  32768 0.0.0.0/0  44182 0.0.0.0/0  54508 0.0.0.0/0

UDPPort (Service) Source 111 0.0.0.0/0  2049 0.0.0.0/0  32768 0.0.0.0/0  32770-32800 0.0.0.0/0

 

  • gpu에서 ap1번으로 붙는지 테스트 해봄

 

Hoya Docker cluster용(AP용) seciruty group 설정

Port (Service) Source Port (Service) Source 4369 0.0.0.0/0  25672 0.0.0.0/0  5672 0.0.0.0/0  2266 0.0.0.0/0  5432 0.0.0.0/0  8000 0.0.0.0/0  6006 0.0.0.0/0  8888 0.0.0.0/0  5901 0.0.0.0/0  5555 0.0.0.0/0

도커를 실행하면서, nfs 포인트로 올리고, 부팅시 자동으로 올라가게 하고, vnc확인하고, host도 확인하고,

도커를 재부팅시 자동으로 올라가게 설정 도커 이름은 hoyai_dev로 설정한다

docker run -itd --env="VNC_RESOLUTION=1920x1080" --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" --volume="/var/nfs/hoya_src_root:/hoya_src_root" --volume="/var/nfs/hoya_model_root:/hoya_model_root" --volume="/var/nfs/hoya_str_root:/hoya_str_root" --name hoyai_dev -p 4369:4369 -p 25672:25672 -p 5672:5672 -p 2266:2266 -p 5432:5432 -p 8000:8000 -p 6006:6006 -p 8888:8888 -p 5901:5901 -p 5555:5555 hoyai/hoyai_dev_docker:squashed

 

도커가 자동으로 올라가게 설정한다.

cd /etc/systemd/system/
 vi docker_hoyai.service
[Unit]
Description=hoyai container
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/usr/bin/docker start -a hoyai_dev
ExecStop=/usr/bin/docker stop -t 2 hoyai_dev

[Install]
WantedBy=default.target

도커 스타트업 스크립트

sudo systemctl enable docker_hoyai.service
   
   sudo systemctl start docker_hoyai.service

도커 서비스 삭제 스크립트

sudo systemctl disable docker_hoyai.service
  
  sudo systemctl stop docker_hoyai.service
sudo apt-get install nfs-common

 

도커 속에서 cluster 설정하기

hoyai/settings.py에서 DB를 AP1번을 보도록 설정

git에서 settings.py 추적 안하게 변경

git update-index --assume-unchanged hoyai/settings.py

 

각서버별로 장고가 뜨는지 확인

hosts파일을 만들어서 ap1, ap2, gpu1, gpu2에 배포

ssh를 활용해서 각각 서버에 붙는지 확인한다.

 

rabitmq cluster 연결을 위한 erlang cookie 맞추기

 

master에서 cooker를 보고, slave에 복사해준다

vi /var/lib/rabbitmq/.erlang.cookie

 

slave는 끄고

service rabbitmq-server stop

erlang cookie 복사하고

다시 스타트

service rabbitmq-server start

 

 

rabbitmq cluster를 확인한다.

rabbitmqctl cluster_status

 

hoya settings.py의 celery 설정 부분을 변경한다.

host는 master의 Docker id로 변경

CELERY_BROKER_URL = 'amqp://tensormsa:tensormsa@'+host+'//'

result_backend = 'db+postgresql://xxxxxxxxxxxxx'

 

entrypoint에 hosts파일 add하는것을 추가

echo "xxx.xxx.xxx" >> /etc/hosts

 

gpu1번을 ap1에 조인

rabbitmqctl stop_app

rabbitmqctl join_cluster --ram rabbit@16224139bcee


rabbitmqctl start_app

gpt2번을 ap1에 조인

rabbitmqctl stop_app

rabbitmqctl join_cluster --ram rabbit@16224139bcee

rabbitmqctl start_app

 

클러스터에서 빠지기

rabbitmqctl reset

 

 

 

 

 

 

 

client nfs 설치한다

sudo apt-get install nfs-common

 

부팅했을때 nfs가 자동으로 붙도록 설정

hoya_src_root, hoya_model_root, hoya_str_root 3개 디렉토리 설정

sudo mkdir /hoya_src_root -p
sudo mkdir /hoya_model_root -p
sudo mkdir /hoya_str_root -p

 

vi /etc/fstab
xx.xx.xx.xx:/var/nfs/hoya_src_root /hoya_src_root nfs hard 0 0
xx.xx.xx.xx:/var/nfs/hoya_model_root /hoya_model_root nfs hard 0 0
xx.xx.xx.xx:/var/nfs/hoya_str_root /hoya_str_root nfs hard 0 0

 

reboot 해서 df -h로 nfs가 잘 붙는지 확인한다

df -h

 

gpu Tensormsa Docker를 받는다

docker pull docker pull hoyai/hoyai_gpu_dev_docker:v1.0

 

gpu docker 를 실행한다.

nvidia-docker run -itd --env="VNC_RESOLUTION=1920x1080" --volume="/hoya_src_root:/hoya_src_root" --volume="/hoya_model_root:/hoya_model_root" --volume="/hoya_str_root:/hoya_str_root" --name hoyai_dev -p 4369:4369 -p 25672:25672 -p 5672:5672 -p 2266:2266 -p 5432:5432 -p 8000:8000 -p 6006:6006 -p 8888:8888 -p 5901:5901 -p 5555:5555 hoyai/hoyai_gpu_dev_docker:v1.0

docker 서비스를 올린다.

sudo gpasswd -a ubuntu docker

 

 

cd /etc/systemd/system/
 vi docker_hoyai.service

 

[Unit]
Description=hoyai container
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/usr/bin/nvidia-docker start -a hoyai_dev
ExecStop=/usr/bin/nvidia-docker stop -t 2 hoyai_dev

[Install]
WantedBy=default.target

 

sudo systemctl enable docker_hoyai.service

sudo systemctl start docker_hoyai.service

 

sudo systemctl disable docker_hoyai.service

sudo systemctl stop docker_hoyai.service

 

AP1, GPU2, GPU2의 docker id와 IP를 찾는다.