2018-12-24: Shared on Tensorflow KR facebook group. 텐ㅡ하!

2019-07-30: Updated 2019-09-09: Updated, alias 내용 추가

더이상 유용하지 않은 글 (참고용)

** 본 포스트를 통해 Docker로 TensorFlow를 설치하기 원한다면, #2-1, #2-2를 건너뜁니다.**

제가 처음 우분투를 설치했을때, Anaconda를 이용해서 TensorFlow를 설치했습니다. 하지만, 실험 중 사고(?)로 우분투 OS가 손상되었고, 실험컴퓨터 전체를 포맷하는 아픔을 겪었습니다. 우분투 부팅디스크 만들고, OS 다시깔고, nvidia 드라이버설치, CUDA, CuDNN, anaconda 설치, openCV 설치… 재앙이 따로없었습니다.

그래서 이번엔, Docker를 사용해 환경을 구성해보았습니다.

1. 왜 Docker를 사용해야 할까?

“여러분이 열심히 구축한 컴퓨터 환경은 결국 한번쯤 포맷하게 됩니다.”

컴퓨터로 딥러닝을 돌리다보면 자칫 메모리가 넘치기 일쑤고, 우분투를 자유자제로 다루지 못한다면 삽질을 피할 수 없습니다. 전자공학과 눈물

하지만 도커를 사용하면 정말 간단하게 환경을 구축할 수 있는 것은 물론 다음과 같은 장점이 있습니다.

Docker에 대해 낯설다면, 아래 문서를 참고하시는 것을 추천드립니다.

그럼, 본격적으로 시작해보겠습니다.

via GIPHY ~~이만큼 쉽습니다~~

2. 설치 준비하기

3. Docker 설치

설치는 정말 간단합니다.
그냥 아래 명령어를 터미널에서 복붙만 잘해주세요.
잘 따라하시면 됩니다.

#Update the apt package index:
sudo apt-get update

#Install packages to allow apt to use a repository over HTTPS:
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

#Add Docker’s official GPG key:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

#Verify that you now have the key with the fingerprint:
#9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
sudo apt-key fingerprint 0EBFCD88

#set up the stable repository
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

#Update the apt package index:
sudo apt-get update

#Install the latest version of Docker CE
sudo apt-get install docker-ce

#Verify that Docker CE is installed correctly by running the hello-world image.
sudo docker run hello-world
sudo usermod -aG docker $USER # 현재 접속중인 사용자에게 권한주기
sudo usermod -aG docker your-user # your-user 사용자에게 권한주기

nvidia-docker

4. Nvidia-docker 설치

Nvidia-Docker는 GPU를 사용하여 연산을 할 수 있는 Ubuntu Docker입니다.

# If you have nvidia-docker 1.0 installed: we need to remove it and all existing GPU containers
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f

sudo apt-get purge -y nvidia-docker

# Add the package repositories
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
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

# Install nvidia-docker2 and reload the Docker daemon configuration
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd

# Test nvidia-smi with the latest official CUDA image
sudo docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi

5. ufoym/deepo 이미지 당겨오기

Tensorflow에서 공식적으로 제공하는 이미지가 있지만, 저는 딥러닝 연구자들을 위해 구성된 ufoym/deepo 이미지를 설치하는 것을 강력추천드립니다. 이 이미지는 아래와 같은 장점이 있습니다.

deepo-features

# 이미지 당겨오기
docker pull ufoym/deepo

# 설치 확인하기
nvidia-docker run --rm ufoym/deepo nvidia-smi

output 181113-docker-install-test

위와 같이 nvidia-smi 화면이 뜨면 성공입니다. 잘 작동하나요?

도커는 컨테이너가 독립적으로 구동되어, 컨테이너를 종료하게 되면 모든 저장내용이 사라집니다. 따라서 컴퓨터와 컨테이너간의 폴더를 지정하여 연결시켜주어야 합니다.

먼저 컨테이너와 데이터를 공유할 폴더를 만들어줍니다.

mkdir /docker/data

이 곳에 작업할 데이터(dataset, source codes)들2 넣어주세요 이제 이 폴더에 파일을 넣으면 docker 컨테이너에서 접근할 수 있습니다.
-v 옵션을 이용해 폴더를 지정해줍니다.

nvidia-docker run -it \
-p 6006:6006 \
-p 2222:2222 \
-h tf2 \
--name tf2 \
-v ~/docker:/data \
ufoym/deepo bash

이렇게 실행시킬 경우,
host의 ~/docker 폴더는 컨테이너의 /data에 보입니다.

#jupyer가 지원되는 이미지 불러오기
docker pull ufoym/deepo:all-py36-jupyter

#폴더만들기
mkdir /docker/data

#이미지 실행하기
nvidia-docker run -it \
-p 8888:8888 \
-p 6006:6006 \
-h tf2j \
--name tf2j \
-v ~/docker:/data \
--ipc=host ufoym/deepo:all-py36-jupyter \
jupyter notebook --no-browser \
--ip=0.0.0.0 \
--allow-root \
--NotebookApp.token= --notebook-dir='/data'

아래 기능들이 필요면 argument를 추가해서 함께 실행해줍니다.

# 일회용 : containter를 종료하면 container 삭제하기
--rm \

# Webcam 사용하기
--device=/dev/video0 \

6. Docker의 쉘에 쉽게 접속하자! alias 설정하기

만약 위 설명을 따라서 ‘ufoym/deepo’의 jupyter version을 설치했다면 쉘 명령어를 쓰기가 난감합니다. 가끔 쉘에 접속할 필요가 있을 때가 있는데, 이를 위해서는 다음 명령어를 실행시켜야 합니다.

#tf2j 컨테이너 쉘에 접속하기
docker exec -it tf2j /bin/bash/

하지만 매번 이렇게 쓰는건 정말 번거롭습니다.
그래서 단축키 (alias)를 설정해주겠습니다.

여러분이 zsh를 쓰는 힙스터일테니 zsh기준으로 설명하겠습니다.

#.zshrc 설정파일 편집하기
vi ~/.zshrc

가장 아래에 내용을 추가합니다.

alias tf2j = "docker exec -it tf2j /bin/bash/"

새로고침을 잊지 마세요.

source ~/.zshrc

이제 터미널에서 tf2j를 입력하면 해당 컨테이너의 쉘로 접속합니다! 정말 편리하죠.

7. docker 기본 명령어 모음

  1. 컨테이너 빠져나가기: $ exit
  2. 컨테이너 다시 실행시키기: $ docker attach ${container ID}
  3. 컨테이너 목록 확인하기: $ docker ps -a
  4. 컨테이너 중지하기: $ docker stop ${container ID}
  5. 컨테이너 제거하기: $ docker rm ${container ID#1} ${container ID#2}
  6. 이미지 목록 확인하기: $ docker images
  7. 이미지 다운로드 하기: $ docker pull
  8. 이미지 삭제하기: $ docker rmi ${image ID}
  9. 컨테이너 로그 보기: $ docker logs --tail 10 ${container ID}
  10. 실시간 컨테이너 로그 보기: $ docker logs -f ${container ID}
  11. 실행중인 컨테이너에 명령 실행하기: $ docker exec [option] container command [arg ..]
    run은 새로 컨테이너를 만들어 실행하고, exec는 실행 중인 컨테이너에 명령을 실행하는 것이 차이점입니다. 다음은 MySQL 컨테이너의 /bin/bash 쉘을 실행하는 예입니다.
    $ docker exec -it mysql /bin/bash
    
  12. 도커 컨테이너 업데이트
    도커에서 컨테이너를 업데이트할 때 컨테이너에 생성된 파일은 모두 삭제될 수 있습니다.
    그러므로, 유지해야 할 데이터가 있는 경우, 컨테이너 내부가 아닌 외부 스토리지에 저장해야 합니다.

8. 도커 허브 이용하기

Docker를 이용해 작업을 하다보면, 이미지에 없는 라이브러리등을 설치해서 사용할 때가 있습니다.
이럴 경우 git처럼 commit 후 push를 해서 업데이트 할 수 있습니다.

#이미지 태깅
docker tag {저장할이미지이름:태그} {아이디/이미지이름:태그}

#푸시
docker push {아이디/이미지이름:태그}

9. (선택) 도커 컴포즈

도커 컴포즈 툴을 이용해, 다수의 도커 컨테이 명령을 하나의 설정으로 간편하게 처리할 수 있습니다.

#설치하기: 이곳에서 가이드를 보고 설치합니다.
# https://docs.docker.com/compose/install/
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

#테스트하기
docker-compose version

여기까지 하셨으면 이제 딥러닝 환경구축이 끝났습니다. 이제, 다음 포스트에서는 사용하던 컨테이너 환경을 백업 (commit)하고 다시 설치 (pull)하는 과정을 알아보겠습니다.

그리고 구축한 컨테이너로 외부에서 접속하는 방법도 알아보겠습니다.

그럼, 좋은 연구 하세요!

오늘도 클리어!

via GIPHY


덧붙이며.

Docker의 이미지는 종류가 정말 많이 있습니다.
이 글에서는 ufoym/deepo 이미지를 기준으로 쓰여졌습니다.
위 이미지는 다양한 라이브러리가 지원되기때문에 정말 유용하지만, 용량이 크다는 단점이 있습니다.
가벼운 베이스 프레임워크만 필요하신 분들을 위해 Tensorflow Docker 설치방법도 함께 기술합니다.
위에서 설치를 완료하신 분들은 읽지 않으셔도 무방합니다.

1. Tensorflow Docker 설치

docker-tags

위 태그중 자신에게 알맞는 것을 기억합니다.
저의 경우, latest-devel-gpu-py3를 사용합니다.

#docker pull
#sudo docker pull tensorflow/tensorflow[:tag] [command]
sudo docker pull tensorflow/tensorflow:latest-devel-gpu-py3

#설치 확인
docker run --runtime=nvidia -it --rm tensorflow/tensorflow:latest-devel-gpu-py3 \
   python -c "import tensorflow as tf; tf.enable_eager_execution(); print(tf.reduce_sum(tf.random_normal([1000, 1000])))"

##docker 실행
#docker run [-it] [--rm] [-p hostPort:containerPort] tensorflow/tensorflow[:tag] [command]
sudo nvidia-docker run -it -p 8888:8888 -p 6006:6006 -h tensorflow --name tensorflow tensorflow/tensorflow:latest-devel-gpu-py3
##[-it]: interactive와 pseudo-tty로 bash shell을 사용하는 옵션
##[--p]: <local port>:<container>의 포트를 연결시켜주는 옵션
##[--h]: host 이름
##[--name]: container 이름
##[--v]: container의 local저장소를 연결해주는 옵션. -v <local volume>:<container volume>

이제 터미널이 다음과 같이 바뀝니다.
(만약, devel이 아닌 stable 버전을 설치하면 바로 jupyter notebook이 뜹니다.)

root@tf2:~#

2. jupyer notebook 실행하기

../run_jupyter.sh --notebook-dir=../home/ --allow-root

jupyer notebook에 관한 내용이 뜹니다.

...
to login with a token:
    http://(tf2 or 127.0.0.1):8888/?token=62dc....
...

http://127.0.0.1:8888/?token=62dc....로 접속하면 브라우저에 Jupyter Notebook이 뜹니다.

References

Comments

Eungbean Lee's Picture

About Eungbean Lee

Lee is a Student, Programmer, Engineer, Designer and a DJ

Seoul, South Korea https://eungbean.github.io