도커를 이용한 딥러닝 환경 구축하기

Taek goo Kim·2020년 4월 4일
3

딥러닝 환경 구축의 어려움

개인 데스크탑에서 cuda나 cudnn 등 nvidia 가속을 이용하는 환경을 구축하는 게 간단하지는 않습니다. 저의 경우 파이선 가성화를 위해서 anaconda를 주로 사용하는데, conda 업그레이드시 함께 포함된 패키지가 업데이트되면서 호환성이 깨지는 경우가 종종 발생하였습니다.

그래서, 차라리 누군가 잘 만들어놓은 도커를 가져다가 조금만 변경해서 사용하면 좋겠다는 생각에서 저의 개인적인 경험을 바탕으로 소개하도록 하겠습니다.

Deepo 도커 소개

deepo는 딥러닝/머신러닝 개발 환경을 쉽게 구축할 수 있는 all-in-one 도커입니다.
자세한 것은 이 링크를 눌러 deepo 깃헙 페이지를 방문하면 알 수 있습니다.

deepo image

간략하게 소개해보면,

  • python 3.6.9
  • Keras 2.3.1
  • tensorflow 2.1.0
  • torch 1.5.0
  • Theano 1.0.4
  • scikit-learn 0.22.2
  • jupyter 1.0.0

등 딥러닝/머신러닝 개발에 필요한 프레임워크와 라이브러리 등을 거의다 갖추고 있습니다.

이거 하나면 왠만한 개발환경은 다 커버할것 같습니다.

Deepo 설치하기

Deepo 설치에 앞서서

아래가 대략의 설치 환경입니다.

Deepo 설치하기

Docker Hub에서 Deepo 이미지 설치하기

아래 명령어를 실행하면 최신 deepo 도커 이미지를 설치할 수 있습니다.

$ docker pull ufoym/deepo

설치가 잘 되었는지 확인해봅니다.

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
...
ufoym/deepo         all-py36-cu101      5d5a5c342dbf        2 weeks ago         13.3GB
ufoym/deepo         latest              5d5a5c342dbf        2 weeks ago         13.3GB
...

저는 2개의 별도 버전을 설치했는데, 동일한 것으로 보이네요.

이것으로 설치완료입니다. 이제부터 사용하기만 하면 됩니다. 다만, 도커에 익숙하지 않은 분들을 위해서 몇 가지 더 설명해봅니다.

Docker 실행하기

아래는 deepo 도커를 실행하고 bash로 진입하는 명령어입니다.

$ docker run -p 8888:8888 --gpus all -it -v {host-dir}:{container-dir} ufoym/deepo bash

도커 옵션 설명:

  • run: 도커 실행 명령어
  • "-p 8888:8888": 컨테이너의 8888번 포트를 호스트 OS 8888번 포트로 포워드하는 옵션입니다. 나중에 jupyter notebook이나 lab에서 사용하는 8888번 포트를 외부에서도 접속이 가능해집니다.
  • "--gpus all": 컨테이너의 gpu 사용을 가능하도록 하는 옵션입니다.
  • "-it": 인터랙티브 터미널을 사용하기 위한 옵션입니다.
  • "-v {host-dir}:{container-dir}": 호스트의 디렉토리를 컨테이너 내부에 공유하기 위한 옵션입니다.
  • "bash": 터미널에서 실행할 명령어입니다. bash 쉘을 통해 도커에 진입하게 됩니다.

Jupyter Lab 설치하기

저는 Jupyter Notebook 보다는 Jupyter Lab을 선호하는데 Deepo에는 안타깝게도 Jupyter Notebook만 설치되어 있습니다. Jupyter Lab을 설치하겠습니다. 컨테이너 내부에서 설치한다고 가정합니다.

# pip install jupyterlab

또는 컨테이너 외부에서도 설치할 수 있습니다.

# docker exec -it {container-name} pip install jupyterlab

Jupyer Lab 실행하기

컨테이너 내부에서 실행할 때는 아래와 같이 실행하면 됩니다.

# nohup jupyter lab --ip 0.0.0.0 --port 8888 --allow-root --no-browser &

포트는 아까 실행할때 지정한 8888번 포트로 띄웁니다. 그러면, 이제 호스트 OS의 8888번 포트를 열어두기만 하면 외부에서도 접근이 가능해집니다. 그리고 컨테이너 내부에서 root로 실행시키고 있기 때문에, --allow-root 옵션이 필요하고 브라우저가 없기 때문에 --no-browser 옵션도 같이 붙여 실행합니다.

Deepo에 변경사항 저장하기

필요에 따라서 Jupyter Lab 등 별도의 라이브러리나 프레임워크를 설치하는 경우에는 도커를 실행할 때마다 리셋되기 때문에 재설치의 번거로움이 있습니다. 이런 경우 변경사항을 저장해서 내가 원하는 최적의 환경을 구축할 수 있습니다.

$ docker commit {container-id} {new-image-name}

위 명령어를 실행하면 현재 실행중인 컨테이너의 상태를 저장하여 새로운 도커 이미지로 생성합니다.

$ docker commit f7e19aaeef3f deepo_jupyterlab

을 실행하고 이미지를 확인해보겠습니다.

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
deepo_jupyterlab    latest              19ea1eeb6d17        2 hours ago         13.3GB 
ufoym/deepo         all-py36-cu101      5d5a5c342dbf        2 weeks ago         13.3GB
ufoym/deepo         latest              5d5a5c342dbf        2 weeks ago         13.3GB

위와 같이 새롭게 생성한 도커 이미지를 실행하면 jupyter lab이 설치된 나만의 이미지를 실행할 수 있게 됩니다.

profile
Unknowns vastly exceeds knowns

4개의 댓글

comment-user-thumbnail
2020년 5월 9일

아니, 친숙한 얼굴이네. 좋은 글 잘 봤어. 많은 참고가 되었네. :)

1개의 답글
comment-user-thumbnail
2020년 9월 18일

오호, 반갑습니다.

답글 달기
comment-user-thumbnail
2020년 10월 12일

변경된 도커 이미지를 다시 올려서 팀이 pull하게 만들수있나요?

답글 달기