Tensorflow-gpu 도커 이미지 빌드

아래와 같이 빌드하고 실행해봤는데, 결국 Tutorial 페이지 (https://www.tensorflow.org/install/install_linux)와 동일한 내용임. 그래도 나중에 버전이 바뀌거나 뭔가 수정할때는 저런식으로 하면 됨.

Install Docker (https://ahnbk.com/?p=87) and  install graphics driver

$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda-9-0

make Dockerfile

$ mkdir ~/tmp
$ cd ~/tmp
$ vi Dockerfile
FROM nvidia/cuda:9.0-cudnn7-devel

RUN apt-get update && apt-get install -y python-pip
RUN pip install -U tensorflow-gpu==1.5.0
RUN pip install -U jupyter

RUN mkdir -p /workspace
RUN ln -s /usr/local/cuda/targets/x86_64-linux/lib/stubs/libcuda.so /usr/lib/libcuda.so.1


CMD tensorboard --logdir=/tmp &

VOLUME ["/workspace"]
WORKDIR /workspace
CMD jupyter notebook --ip=0.0.0.0 --no-browser --allow-root


EXPOSE 6006
EXPOSE 8888

Build docker image

$ docker build --network=host -t my_tensorflow_gpu .

Check generated image

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my_tensorflow_gpu   latest              8572747862ff        39 minutes ago      4.05GB
nvidia/cuda         9.0-cudnn7-devel    b60a0d6ee5ab        2 weeks ago         2.73GB

Make directory on host to share with docker

$ mkdir ~/tensorflow_ws
$ docker run -it --runtime=nvidia -p 8888:8888 -p 6006:6006 -v /home/byeongkyu/tensorflow_ws:/workspace my_tensorflow_gpu

[I 04:30:25.958 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[I 04:30:26.134 NotebookApp] Serving notebooks from local directory: /workspace
[I 04:30:26.134 NotebookApp] 0 active kernels
[I 04:30:26.134 NotebookApp] The Jupyter Notebook is running at:
[I 04:30:26.134 NotebookApp] http://0.0.0.0:8888/?token=b00cbef878aa1094bddabda578384a77426458a752b247c3
[I 04:30:26.134 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 04:30:26.135 NotebookApp] 
    
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://0.0.0.0:8888/?token=b00cbef878aa1094bddabda578384a77426458a752b247c3

Run web browser, and connect to  http://0.0.0.0:8888/?token=b00cbef878aa1094bddabda578384a77426458a752b247c3

token id changes when docker run.

New, do your job and save

Looks good, check the logs

2018-02-15 04:45:05.631210: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2018-02-15 04:45:05.824609: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1105] Found device 0 with properties: 
name: Quadro P6000 major: 6 minor: 1 memoryClockRate(GHz): 1.645
pciBusID: 0000:03:00.0
totalMemory: 23.87GiB freeMemory: 23.14GiB
2018-02-15 04:45:05.824641: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1195] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: Quadro P6000, pci bus id: 0000:03:00.0, compute capability: 6.1)

Done.

Docker 사용 방법 정리

Docker에 대해 검색해 보면 다음과 같이 설명을 시작한다.

"가상 머신처럼 독립된 실행환경을 만들어주는 도구. 마치 운영체제에 운영체제를 설치하는 것처럼 실행 된다. 하지만 운영체제는 실제로 설치되지 않기 때문에 설치 용량이 적고 빠르다. "

https://opentutorials.org/course/128/8657

결국 사용자간 개발환경이나 실행 환경을 공유하여 사용 가능하고,  가상 머신이지만 다른 가상 머신과는 다르게 호스트의 리소스를 동일하게 거의 손실이 없이 사용이 가능하다는 장점이 있는듯 하다.

1. 설치

1.1. Installation
  Reference: https://docs.docker.com/install/linux/docker-ce/ubuntu/

$ 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 update
$ sudo install docker-ce

1.2 Post-installation – Manage Docker as a non-root user

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

  Log out and log back

1.3 Test

$ docker run hello-world

2. 개념정리

이미지:
– 배포용으로 프로그램, 소스코드, 실행파일 등이 묶여서 있는 형태
– 주로 DockerHub (https://hub.docker.com)를 통해 배포됨

컨테이너
– 이미지를 통해 실행된 상태
– 동일 이미지로 여러개의 컨테이너 생성 가능
– 컨테이너가 삭제되면 컨테이너 내에서 작업한 것들은 사라짐

Dockerfile
– 도커 이미지 생성을 위한 설정 파일
– 주로 Base 이미지에 추가 작업을 통해 만들어짐
– 일반 사용자들이 개발환경 등을 공유할 경우 Dockerfile만 배포해도 가능 (빌드는 각자의 환경에서 알아서 하는걸로)

3. 간단 사용

3.1 이미지 가져오기

$ docker pull <image>

3.2 실행 (컨테이너 생성)

$ docker run <option> <image> 
  -it : Interactive-Pseudo-tty, 쉘을 통한 입출력 가능 
  --name : 컨테이너 이름 (입력하지 않으면 docker가 임의로 생성) 
  --net : 네트워크 연결 (기본은 none, host, bridge 선택 가능, bridge는 호스트의 네트워크와 동일하게 연결 
  --runtime : 실행 환경(?), 일단은 무시 
  -p : 포트 맵핑 (ex: 80:80 - 호스트의 80번 포트를 컨테이너의 80번 포트와 연결) 
  -v : 작업공간 연결 (ex: /root/data:/data - 호스트의 /root/data를 컨테이너의 /data와 연결) 
  -d : 컨테이너를 백그라운드에서 실행

3.3 각종 명령들

$ docker images : 현재 시스템이 존재하는 이미지 리스트 출력
$ docker run : 실행
$ docker ps : 컨테이너 리스트 출력 (실행중인것만)
$ docker ps -a : 모든 컨테이너 리스트 출력 (실행, 종료된 것 포함)
$ docker start <컨테이너이름 or 컨테이너아이디> : 종료되었던 컨테이너 시작
$ docker restart <컨테이너이름 or 컨테이너아이디> : 컨테이너 재시작
$ docker stop <컨테이너이름 or 컨테이너아이디> : 컨테이너 정지
$ docker rm <컨테이너이름 or 컨테이너아이디> : 컨테이너 삭제
$ docker rmi <이미지이름> : 도커 이미지 삭제
$ docker attach <컨테이너이름 or 컨테이너아이디> : 실행중인 컨테이너에 접속
  bash쉘이 실행 중이면 입력창이 보이고, 다른 실행파일이 실행중이면 출력 결과만 보임
  Ctrl+C로 종료하면 컨테이너도 종료, Ctrl+P, Ctrl+Q로 detach 가능
$ docker exec <컨테이너이름 or 컨테이너아이디> : 컨테이너 내에서 실행파일 실행

4. Dockerfile

도커 이미지 생성하기 위한 파일
상세 내용 참고: https://docs.docker.com/engine/reference/builder/#dockerfile-examples

4.1 예제

ubuntu 이미지에 vnc, xvfb, firefox를 설치하고, 이미지를 실행하면 x11vnc 서버를 실행한다.

Dockerfile

FROM ubuntu 
# Install vnc, xvfb in order to create a 'fake' display and firefox
RUN apt-get update && apt-get install -y x11vnc xvfb firefox
RUN mkdir ~/.vnc Setup a password
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -c 'echo "firefox" >> /.bashrc'

EXPOSE 5900
CMD ["x11vnc", "-forever", "-usepw", "-create"]

4.2 빌드

Dockerfile이 위치한 곳에서

$ docker build --tag <생성할이미지이름>:<태그> .

이미지가 생성되면, 도커 이미지 저장소에 이미지 생성, 생성확인은

$ docker images

끝.