2017년 5월 24일 수요일

Docker 기반 우분투, 텐서플로우, PyTorch 설치 및 관련 명령 정리

노트북에서 윈도우와 우분투 듀얼 부팅을 사용하다 보면, 오피스 작업하다가 재부팅해야 하는 등 불편할 때가 많다. 이럴 경우, 윈도우에서 도커를 설치하고, 그 위에 우분투 이미지를 설치해 사용하는 방법이 좋은 대안이 될 수 있다.

이 글은 도커에 대해 간략히 살펴보고, 도커 컨테이너에 우분투, 텐서플로우, PyTorch(파이 토치)를 설치해 본다.

이 내용은 다음 링크를 참고하였다.
1. 개념
도커는 2013년 3월 Pycon 컨퍼런스(산타클라라)에서 dotCloud 창업자인 Solomon Hykes가 리눅스 컨테이너의 미래라는 세션을 발표하면서 처음 알려졌다. 이후 도커는 급성장해 2015년 4월 1,100억원 투자유치를 받았으며, 마이크로소프트가 2016년 6월 4 billion dollar에 도커를 인수하려 했다.
Solomon Hykes

도커는 컨테이너 기반 오픈소스 가상화 플랫폼이다. 실행 중인 컨테이너에 접속해 명령을 실행하고, apt-get 으로 패키지를 설치할 수 있다. 여러 프로세스를 백그라운드로 실행할 수 있다.

이미지는 컨테이너 실행에 필요한 파일과 설정값을 포함하고 있다. 컨테이너는 이미지를 실행한 상태이다. 예를 들어, 우분투 이미지는 우분투 실행을 위한 모든 파일을 가지고 있다.

도커 이미지는 Docker hub에 등록되거나 Docker Registry 저장소를 만들어 관리할 수 있다. 현재 공개된 도커 이미지는 50만개 이상이며, 도커 기반 오픈소스 프로젝트는 10만개가 넘는다.


이미지는 url 방식으로 관리하고, 태그를 붙일 수 있다. 도커는 이미지를 만들기 위해 Dockerfile 이란 DSL(domain specific language)를 이용해 이미지 생성과정을 기술한다.

도커 명령어는 직관적이며, http기반의 REST API도 지원해 확장성이 좋다.



2. 도커 설치
도커를 설치하는 방법은 간단하다. 아래 링크를 클릭해 적당한 버전을 설치하면 된다. 맥, 윈도우, 리눅스 버전 등이 제공된다. 
만약, 윈도우 10 버전에서 하이퍼-V(Hyper-V) 가상머신을 사용해 도커를 실행하려면, 윈도우 10 프로페셔널 이상 운영체제가 설치되어야 함에 주의한다. 하위 버전에서는 오라클 VirtualBox가 설치된다(성능이 하이퍼-V보다 낮다고 알려져 있다). 
설치 후에 Docker Quickstart Terminal, Kitematic, Oracle VM VirtualBox(혹은 Hyper-V)가 설치된 것을 확인할 수 있다.

3. 실행
도커 버전을 확인하기 위해, Docker Quickstart Terminal을 실행해 다음과 같은 명령을 내려 본다. 
$ docker version
도커는 서버와 클라이언트로 분리되어 있고, 명령을 입력하면, 클라이언트가 서버로 명령을 전송하고 결과를 받아 터미널에 출력해 준다. 
도커 클라이언트 서버 구조
Kitematic 를 실행해 보면, 도커 가상머신에서 올릴 수 있는 수많은 이미지를 검색할 수 있다. 검색한 이미지는 도커 위에서 생성해 사용할 수 있다.

4. 우분투 이미지 생성 및 실행하기 
우분투 이미지를 올려보자. 터미널을 실행하고, 아래 명령을 실행해 본다. 
$ docker run ubuntu:16.04

만약, 이미지가 로컬에 없다면, 다운로드(pull 명령) 후 컨테이너를 생성(create 명령)하고, 시작(start)한다. 우분투 이미지에 명령은 전달하지 않았기 때문에 이미지는 시작하자 마자 종료된다. 

이제, /bin/bash 명령어를 이용해, 컨테이너를 실행한다.
$ docker run --rm -it ubuntu:16.04 /bin/bash


도커의 각 명령은 docker 명령해 뒤에 아래 명령을 추가하면 실행된다. 각 명령의 의미는 다음과 같다. 
옵션설명
-ddetached mode 흔히 말하는 백그라운드 모드
-p호스트와 컨테이너의 포트를 연결 (포워딩)
-v호스트와 컨테이너의 디렉토리를 연결 (마운트)
-e컨테이너 내에서 사용할 환경변수 설정
–name컨테이너 이름 설정
–rm프로세스 종료시 컨테이너 자동 제거
-it-i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
–link컨테이너 연결 [컨테이너명:별칭]
exit 를 실행해 bash 쉘을 종료하면, 우분투 이미지 컨테이너도 자동 종료된다. 

5. 텐서플로우 이미지 실행
이제 구글의 머신러닝 플랫폼인 텐서플로우 이미지를 실행해 보자. 다음 명령어를 도커 입력하면, 이미지를 다운로드 받은 후 실행된다. 
$ docker run -d -p 8888:8888 -p 6006:6006 teamlab/pydata-tensorflow:0.1


이미지가 실행된 후, 웹브라우저에서 jupyter를 접속해, 파이썬 코드를 입력해 본다. 제대로 실행되면, 성공한 것이다.

6. PyTorch 이미지 실행
PyTorch는 텐서플로우와 비슷한 머신러닝 플랫폼이다.
다음 명령을 입력해, PyTorch 이미지를 컨테이너에서 실행해 본다. 참고로 이미지는 DockerHub의 StepanKuzmin의 pytorch-notebook을 사용한다.
$ docker run -it --rm -p 8888:8888 stepankuzmin/pytorch-notebook


7. 도커 명령어
이 장에서는 도커 명령을 간단히 요약해 본다.

1. 컨테이너 목록 확인하기
$ docker ps -a

2. 컨테이너 중지하기
$ docker stop ${container ID}

3. 컨테이너 제거하기
$ docker rm ${container ID#1} ${container ID#2}

4. 이미지 목록 확인하기
$ docker images

5. 이미지 다운로드 하기
$ docker pull

6. 이미지 삭제하기
$ docker rmi ${image ID}

7. 컨테이너 로그 보기
$ docker logs --tail 10 ${container ID}

8. 실시간 컨테이너 로그 보기
$ docker logs -f ${container ID}

9. 실행중인 컨테이너에 명령 실행하기
$ docker exec [option] container command [arg ...]
run은 새로 컨테이너를 만들어 실행하고, exec는 실행 중인 컨테이너에 명령을 실행하는 차이이다.
다음은 MySQL 컨테이너의 /bin/bash 쉘을 실행하는 예이다.
$ docker exec -it mysql /bin/bash

10. 도커 컨테이너 업데이트
도커에서 컨테이너를 업데이트할 때 컨테이너에 생성된 파일은 모두 삭제될 수 있다. 그러므로, 유지해야 할 데이터가 있는 경우, 컨테이너 내부가 아닌 외부 스토리지에 저장해야 한다.

11. 도커 컴포즈
도커 컴포즈 툴을 이용해, 도커 명령을 하나의 설정으로 간편하게 처리할 수 있다. 자세한 내용은 다음 링크를 참고한다.

8. 마무리
간단히 도커를 이용해, 우분투와 텐서플로우드를 설치해 보고, 실행해 보았다. 도커는 매우 가벼운 가상머신 컨테이너를 제공하고, 다양한 이미지들을 제공해 사용이 쉽다.


레퍼런스


댓글 2개:

  1. 이렇게 텐서플로우를 사용할 경우엔 cudnn 이 설치 되지 않기 때문에 tensorflow-gpu 는 활용할 수 없지 않은가요?

    답글삭제
    답글
    1. 아래 링크 보시면 동일한 내용으로 질문 및 답변 내용이 있습니다. 글에 conda 기반 설치가 솔류션으로 나와 있으니 참고하시길 바랍니다.

      https://github.com/deepchem/deepchem/issues/605

      삭제