본문 바로가기
컴퓨터 사이언스/딥러닝

[딥러닝 뉴비의 좌충우돌 일기] 빌린 서버에서 Docker를 실행해보자!

by 제크와 죠세핀 2020. 6. 3.
반응형

< 191021 : 빌린 서버에서 docker를 이용해서 pytorch를 실행하자 > 일기를 수정하여 작성.

Docker란 무엇인가?

내가 여기서 가상환경의 중요성을 열변을 토하며 말했는데, Docker는 아나콘다보다 더 편한 시스템이라고 생각하면 된다. 좀 더 편하게 컨테이너라는 단위에서 코드를 돌려서 서로 다른 개발 환경 간의 충돌을 피하면서 동시에 여러 코드가 돌아갈 수 있도록 할 수도 있는 그런 시스템이다.

왜 Docker가 편하냐면, 아나콘다에서는 어쨋든 가상환경 하나 깔 때마다 귀찮게 내가 다 설치를 해줘야 하는데 Docker는 container image file이 있다. image file에는 어떤 패키지가 설치되어 있는지 등등이 다 기록되어 있다. 즉, image file만 가지고 있으면 언제든지 그냥 명령어 한 번으로 환경 세팅이 끝난다는 이야기다. 패키지가 꼬였을 때 지우고 다시 세팅하기가 매우 편하기 때문에 매우 좋다. 심지어, 사람들이 image file을 공유하는 사이트도 제공한다. 각각의 컨테이너는 서로 침범할 수 없도록 되어 있고 GPU만 가능하다면 동시에 여러 컨테이너를 돌려서 한번에 여러 모델을 테스트해보는 등 여러가지를 해볼 수 있다.(적어도 아나콘다는 한번 특정 환경에 진입하면 여러 환경을 동시에 못 돌리지 않나..?)

 

설치 방법 

** 설정 관련 좋은 자료 1 2 3에서 아주아주 친절하게 어떻게 설치하는 지 기록을 해두었으므로 이쪽으로 링크를 건다. 이미 친절한 글들이 있는데 굳이 내 블로그에 반복해서 글쓰는 것을 별로 선호하지 않으므로 설치 방법 자체는 구글링으로 해결하기!

 

사용 방법

- 사실 docker 설치는 서버에 원래 되어 있었다. 그러나 연구원님께서 그 전에 그냥 caffe만 로컬에 설치하고 docker에다가 cudnn image로 컨테이너 만들어서 코드를 돌려보셨던 것 같다. 일단 나는 pytorch와 tensorflow를 사용해야 해서 프로젝트에 사용할 docker container를 하나 setup하기로 했다.

 

- 사용 환경

1) 외부 컴퓨터(랩탑 혹은 다른 PC) : putty(혹은 MobaXterm), WinScp(혹은 Filezila) 설치

2) 서버 호스트 : GPU에 맞는 CUDA와 cudnn이 설치되어 있어야 하고, 운영체제 버전에 맞는 docker가 설치되어 있어야 함.(container가 host의 GPU를 사용하기 위해 추가적으로 nvidia-docker가 설치되어 있어야 함.)

 

- 도커 이미지로부터 컨테이너를 생성하고 실행

docker run –runtime=nvidia -it -p 8888:8888 -p 8097:8097 tensorflow/tensorflow:latest-gpu-py3

** 로컬에 해당 이미지가 없는 경우에는 알아서 docker-hub에서 다운받아준다.

** tensorflow/tensorflow:latest-devel-gpu는 Tensorflow를 개발자들이 수정할 수 있게 한 image이다. 그래서 여기엔 Tensorflow가 설치되어 있지 않다고 한다. 나처럼 devel gpu 깔아놓고 tensorflow import 에러난다고 찡찡거리지 말자.

** py3를 맨 뒤에 안붙여주면 python 2.7이 default로 깔려진 이미지를 얻고 3이 붙으면 3.6이 설치된다. 2.7이 깔려있는 곳에 추가로 3.x 까는 것보단 3.6이 깔려있는 이미지를 처음부터 사용하는 게 정신건강에 이로우므로 다시 깔아보자.

** 나는 PyTorch를 주로 쓰는데 왜 텐서플로우 이미지를 쓰냐고 하면 아직 도커 사용이 익숙하지 않아서 튜토리얼대로 따라하려고 했기 때문이다. PyTorch는 official docker image에 Jupyter가 설치되어 있지 않으므로 TF 컨테이너 위에 pip으로 PyTorch를 설치하고 나서 이미지에 변경사항을 커밋시키면 gpu도 잘 작동한다고 한다. 근데 official docker image에 jupyter 설치 안되어 있던데..?

 

** 이미지에 변경사항을 커밋시킨다는 게 무슨 말인가?

컨테이너는 휘발성이라 실행되고 나서 자신의 할 일을 끝내면 다시 내려가고 따로 설정해주지 않으면 기본적으로 자신의 자취를 host OS에 남기지 않는다. 그냥 하나의 프로세스처럼 작동한다는 의미인 것 같다. 그래서 컨테이너 안에서 새롭게 패키지를 깔고 해도 컨테이너가 종료되고 나면 변경사항 없이 설치 전 이미지로 다시 컨테이너가 실행되므로, 이미지에 변경사항을 커밋시켜줘야 그 다음 번에 실행해도 설치한 패키지대로 실행이 가능하다.

 

- Commit 방법 :

실행 중인 container 밖으로 나와서(ctrl+p, ctrl+q)

host에서 docker commit [container_name] [image_name] 이렇게 해주면 된다.

내가 실행중인 container의 name 혹은 container의 id를 입력하고, image_name에는 내가 만들 image의 이름을 임의로 지정해서 넣어주면 된다.

 

- 호스트와 도커 컨테이너의 파일 시스템 연결

그리고 이런 휘발성 때문에 Container 안에서 jupyter notebook을 사용했다면 컨테이너 안에서 작업하고 저장한 파일들을 호스트에서 직접 접근할 수 없고 컨테이너가 내려간 상태에서 삭제되면 같이 삭제된다. 그래서 컨테이너를 run할 때 호스트 OS의 특정 디렉토리를 마운트해줘야 한다. 이때 쓰는 명령어가 -v인데 volume은 호스트의 파일시스템과 격리된 도커 컨테이너의 파일 시스템을 이어주는 역할을 한다.

설정하는 방법은 docker run하는 옵션에 아래와 같은 식으로 원하는 연결할 디렉토리를 명시해주면 된다.

-v ${HOME}/code:\notebooks

: 앞에 있는 것이 host 내에서 연결할 디렉토리의 주소, : 뒤에 있는 것이 container에서의 디렉토리 주소이다.

즉, host의 ${HOME}/code 폴더가 container의 /notebooks 폴더에 연결된다는 의미

** jupyter 쓰려면 포트를 열어야 하는 거 같은데 학교 컴퓨터라 겁나서(...) 나는 그냥 git repository 만든 뒤 push pull하면서 서버에다가 올렸다.

 

-  그 외 기본적인 도커 명령어

docker ps : 실행중인 container 확인, id, name 등 확인 가능

docker stop {container_id} : 특정 container를 중지시키기

docker remove {container_id} : 특정 container를 제거하기(종료된 컨테이너를 제거하는 것)

docker attach {container_id or container_name} : 특정 container에 접속

container 안에서

1) container를 종료하면서 빠져나오는 법 : exit 입력 or ctrl + d

2) container는 가동되도록 두고 빠져나오는 법 : ctrl + p 와 ctrl + q 입력

 

어쩌면 다른 사람과 같이 서버를 써야하는 대부분의 상황에서 필수적이라고 할 수 있는 도커. 너무 어렵지 않으니 차근차근 써보자.

반응형

댓글