PyTorch/Tensorflow를 위한 Docker 시작하기

2019. 4. 22. 16:20Tips/Programmings

Intro

ML/DL을 위해 PyTorch/Tensorflow를 사용할 경우, Docker를 반드시 사용할 필요는 없습니다.

실제로 저도 여태까지는 Docker 없이 모든 작업을 잘 해왔고, 크게 불편한 점은 없었습니다. 하지만, 최근 모두를 위한 딥러닝 시즌2(https://www.edwith.org/boostcourse-dl-pytorch)를 봐야할 일이 생겼는데, 시작이 Docker를 설치하는 과정이었습니다.

 

불과 1~2년전 까지만 해도 Docker에서 GPU가 구동되도록 하는 과정이 매우 번거로웠고, 때문에 환경설정부터 애로사항이 많았습니다. 하지만 최근의 Docker는 매우 사용이 간편했고, 환경을 설정하는 방법이 매우 간결했기 때문에 Docker를 소개하고자 이 글을 작성하게 되었습니다.

 

이 글은 PyTorch/Tensorflow환경을 구성할 때 Docker를 사용하고자 하는 분들을 대상으로 작성되었기 때문에 Docker를 이용한 여러 가지 테크닉보다는 GPU를 구동할 수 있는 Docker의 환경 설정을 주목적으로 합니다.

 

What's good?

ML/DL을 입문하거나 주요 업무로 사용할시 Docker를 사용하면서 생기는 이점은 몇 가지가 있습니다.

 

1. PyTorch/Tensorflow를 설치하기 위해 필요한 여러 사전 작업들을 간편하게 해결할 수 있다.

우선 이 부분에 대해 설명하기 위해 Docker의 구조를 설명해야 합니다. Docker는 가상화 시스템의 하나로써, 정확하게는 Linux 컨테이너 시스템입니다.

 

윈도우에서 사용할 수 있는 가상화 시스템

윈도우에서 가장 흔하게 접할 수 있는 가상화 시스템이라고 하면 VMWare나 Oracle의 VirtualBox, 혹은 (오랫동안 컴퓨터를 접해보신 분들이라면) Daemon툴즈 같은 것들이 있습니다.

 

MacOS계열에서 접할 수 있는 가상화 시스템

맥을 오랫동안 써오셨던 분이라면 패러럴즈가 가장 흔하게 접할 수 있는 가상화 시스템일 것입니다. 흔히 Windows를 맥에서 사용할 용도로 사용하시는 분들이 많습니다.

 

이러한 가상화 시스템은 기존 시스템과는 격리된 환경에 구성한다는 점이 특징입니다. 즉, 기존 사용하던 시스템에서의 환경과 가상화 시스템 내에서 구성하는 환경은 다른 환경이라고 할 수 있습니다.

 

각기 다른 리눅스 위에 구성하는 App들

앞서 Docker는 Linux 컨테이너 시스템이라고 설명했습니다. 이는 다른 OS위에서는 Linux 환경을 위한 별도의 설정이 필요하다는 뜻입니다. 이 때문에 Windows나 Mac에서의 Docker는 새로운 Hypervisor위에 Docker를 실행해야 하고, 이러한 이유로 Linux가 아닌 환경에서의 Docker는 약간의 성능 차이가 있을 수 있습니다.

 

2. 동일한 환경 구성

1번에서 언급했듯이 Docker는 리눅스 컨테이너를 사용한 환경 구성입니다. Docker 사용 시에는 Hypervisor위에 자신이 원하는 환경을 기존 시스템에서의 환경과 별도로 자유롭게 설치하게 됩니다. 이렇게 구성한 개발환경은 다른 사용자가 사용하기 위해 이미 설정한 경우가 대부분이며, 이러한 구성을 Docker Hub(https://hub.docker.com/)에서 찾아서 다운로드할 수 있습니다.

 

이렇게 환경을 구성할 경우, 동일한 이미지를 사용한다면 다른 사용자와 완전히 동일한 개발환경을 구성할 수 있다는 장점을 가집니다. ('내 컴퓨터에서는 왜 안돼?'와 같은 상황이 일어나지 않는다는 것이죠!) 만약 이미지에서 오류를 해결하려고 하거나 작동하지 않는 경우가 생긴다면 동일한 개발환경을 가진 다른 유저와 논의해 볼 수 있을 것입니다.

 

How to use?

Docker사용법 자체는 매우 간단합니다. 다만 Docker에 쉽게 익숙해지기 힘든 이유는, 대부분 CLI를 이용한 Docker사용에 대해 설명하기 때문에 사용에 어려움을 느끼기 때문인 경우가 많습니다. (즉, 명령어가 헷갈리기 때문이지요!) 때문에 이번 포스트에서는 최소한의 사용법을 익히는 방향으로 진행할까 합니다.

 

Windows

윈도우의 경우 두 가지로 나뉩니다.

 

하나는 Windows 10 Pro이상 또는 Education버전 64비트에서 사용할 수 있는 'Docker for Windows'입니다. 이 경우는 Docker홈페이지에서 받아서 설치하시면 간편하게 사용할 수 있습니다.

 

다른 하나는 Windows 7, 8, 10의 Home버전 64비트에서 사용하는 Docker Toolbox를 이용한 사용법입니다. 이 경우는 Docker설치가 조금 더 까다롭기 때문에 이쪽을 기준으로 설명을 진행하도록 하겠습니다.

 

Docker 홈페이지

우선 Docker 홈페이지(https://www.docker.com/)에 가셔서 오른쪽 위에 보이는 'Get Started'버튼을 클릭합니다.

 

그리고 중간쯤으로 내리시게 되면 다음과 같은 화면이 보이실 텐데요, 여기서 Download for Windows를 클릭합시다.

 

클릭하면 위와 같은 페이지가 나오실 텐데요, 다운로드를 위해서는 회원가입이 필요합니다. 그러므로 오른쪽 위에 보이는 'Sign Up'버튼을 눌러 회원가입을 진행하신 후에, 로그인을 한 후 다운로드를 하고 설치를 진행하시면 됩니다. (Next만 누르시면 되니 큰 어려움은 없을 것입니다.)

 

설치하고 나면 'Docker Quickstart Terminal'이라는 항목이 보이실 것입니다. 이 아이콘을 눌러 실행하시면 됩니다. 처음 실행에 시간이 꽤 소요되니, 참을성을 갖고 기다립시다.

 

실행이 되고 나면 다음과 같은 화면이 나올 것입니다. 이제 Docker를 사용할 준비가 되었습니다. Docker for Windows를 사용하는 경우, 터미널에서 바로 Docker를 실행할 수 있습니다.

 

Mac

윈도우와 동일한 방법으로 구성할 수 있습니다. Mac에서 Docker를 구동하기 위해서는 Yosemity버전부터 지원되는 Hypervisor방식으로 지원되기 때문에 최신 버전의 MacOS를 사용하시기를 권장합니다.

 

우선 Docker 홈페이지(https://www.docker.com/get-started)에서 Docker for Mac을 다운로드하여 설치해줍시다. 다운로드에는 역시나 Log-in이 필요하므로 Sign Up 페이지를 통해 회원가입을 한 후에 다운로드를 하도록 합시다.

 

Mac에서는 Windows와 달리 터미널을 열어 바로 실행할 수 있습니다. 때문에 설치가 완료되고 Docker아이콘을 눌러 상태가 초록불로 바뀌면 사용 가능한 상태입니다.

 

Linux (Ubuntu기준)

리눅스에서는 CLI를 이용한 다운로드를 할 수 있다. 여기서는 Ubuntu 18.08 LTS를 기준으로 하는 설치방법을 작성합니다.

 

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
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 bionic stable"
sudo apt update
apt-cache policy docker-ce

우선 위 코드를 한줄씩 실행합니다. 위 과정은 Docker 설치에 필요한 프로그램들과 커널 repository를 추가하는 과정이 포함되어 있습니다. 위 실행코드의 마지막 줄인 apt-cache policy docker-ce를 실행하면 다음과 같은 메시지를 확인할 수 있습니다.

 

docker-ce:
  설치: 5:18.09.5~3-0~ubuntu-bionic
  후보: 5:18.09.5~3-0~ubuntu-bionic
  버전 테이블:
 *** 5:18.09.5~3-0~ubuntu-bionic 500
        500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
        100 /var/lib/dpkg/status
     5:18.09.4~3-0~ubuntu-bionic 500
        500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
     5:18.09.3~3-0~ubuntu-bionic 500
        500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
     5:18.09.2~3-0~ubuntu-bionic 500
        500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
     5:18.09.1~3-0~ubuntu-bionic 500
        500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
     5:18.09.0~3-0~ubuntu-bionic 500
        500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
     18.06.3~ce~3-0~ubuntu 500
        500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
     18.06.2~ce~3-0~ubuntu 500
        500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
     18.06.1~ce~3-0~ubuntu 500
        500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
     18.06.0~ce~3-0~ubuntu 500
        500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
     18.03.1~ce~3-0~ubuntu 500
        500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages

여기서 만약 Docker 설치가 안되어있다면, 위 메세지중 설치 부분에서

설치: (none)

이라는 메세지를 보시게 될 것입니다. 이 경우에, 다음 명령어를 통해 Docker를 설치할 수 있습니다.

sudo apt install docker-ce

 

또한 다음 명령어를 통해 Docker가 잘 실행되고 있는지 살펴볼 수 있습니다.

sudo systemctl status docker

 

명령어 실행시 다음과 같은 결과를 얻을 수 있습니다.

● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2019-04-21 15:26:35 KST; 24h ago
     Docs: https://docs.docker.com
 Main PID: 32294 (dockerd)
    Tasks: 39
   CGroup: /system.slice/docker.service
           └─32294 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

 4월 21 16:13:00 dev-quandumdl dockerd[32294]: time="2019-04-21T16:13:00.195795118+09:00" level=info msg="ignoring event 
 4월 21 16:14:24 dev-quandumdl dockerd[32294]: time="2019-04-21T16:14:24.381426763+09:00" level=info msg="ignoring event 
 4월 21 16:23:02 dev-quandumdl dockerd[32294]: time="2019-04-21T16:23:02.769519213+09:00" level=info msg="ignoring event 
 4월 21 16:27:41 dev-quandumdl dockerd[32294]: time="2019-04-21T16:27:41.812979644+09:00" level=info msg="ignoring event 
 4월 21 16:27:53 dev-quandumdl dockerd[32294]: time="2019-04-21T16:27:53.020262037+09:00" level=info msg="ignoring event 
 4월 21 16:28:09 dev-quandumdl dockerd[32294]: time="2019-04-21T16:28:09.185432250+09:00" level=info msg="ignoring event 
 4월 21 16:43:47 dev-quandumdl dockerd[32294]: time="2019-04-21T16:43:47.489995202+09:00" level=info msg="ignoring event 
 4월 21 16:44:21 dev-quandumdl dockerd[32294]: time="2019-04-21T16:44:21.922326985+09:00" level=info msg="ignoring event 
 4월 22 13:46:09 dev-quandumdl dockerd[32294]: time="2019-04-22T13:46:09.916430150+09:00" level=info msg="ignoring event 
 4월 22 13:48:13 dev-quandumdl dockerd[32294]: time="2019-04-22T13:48:13.633963668+09:00" level=info msg="ignoring event

 

 

Docker 실행

설치가 완료되었다면 Docker 이미지를 받아서 바로 실행해 볼 수 있습니다. 여기서는 Docker가 잘 실행되는지 hello-world 이미지를 통해 확인해 봅시다

docker run hello-world

 

만약 정상적으로 실행이 잘 되었다면 아래와 같은 메시지를 확인할 수 있습니다.

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

 

그렇다면 이제 PyTorch 개발환경을 설정해봅시다.

 

Docker이미지의 공유를 위해 Docker에서는 Docker Hub(https://hub.docker.com/)라는 사이트를 통해 이미지를 공유할 수 있도록 제공하고 있습니다. 이 사이트에서는 자신이 개발하고 싶은 도구가 설정되어 있는 여러 개발 환경을 검색을 통해 찾아볼 수 있습니다.

Docker Hub 메인페이지

이번 포스트에서는 PyTorch를 예시로 설정해보도록 하겠습니다. 우선 위 화면에서 검색에 PyTorch를 검색해봅시다.

 

PyTorch 검색 결과

위와 같은 검색 결과를 확인할 수 있으실 것입니다. 저는 여기서 pytorch에서 공식으로 제공해 주고 있는 Docker 이미지를 사용하도록 하겠습니다. 사용을 위해 pytorch/pytorch를 클릭해 봅시다.

 

Docker 이미지 설명란

여기서는 이미지에 대한 전반적인 설명과 이미지를 받는 커맨드를 확인할 수 있습니다. 보통 이미지를 다운로드할 경우,

docker pull (이미지 이름)

의 형식으로 커맨드를 실행시켜 이미지를 다운받을 수 있습니다. 실행시켜 봅시다.

 

다운로드가 끝났다면 Docker 이미지를 실행해 봅시다.

sudo docker run -it pytorch/pytorch

 

-it 인자는 각각 다음과 같습니다.

  • -i: interactive. (default: False) 표준 입력(bash)을 활성화하며, 컨테이너와 연결(attach)되어 있지 않더라도 표준 입력을 유지합니다. 보통 이 옵션을 사용하여 Bash에 명령을 입력합니다.
  • -t: tty. (default: False) TTY 모드(pseudo-TTY)를 사용합니다. Bash를 사용하려면 이 옵션을 설정해야 합니다. 이 옵션을 설정하지 않으면 명령을 입력할 수는 있지만 셀이 표시되지 않습니다.

즉, Bash에 명령을 입력할 수 있게 하기 위한 argument입니다.

 

실행이 잘 되었다면 다음과 같은 커맨드 상태로 변경됩니다.

jwserver@dev-quandumdl:~$ docker run -it pytorch/pytorch
root@6119cbf61e3b:/workspace#

 

Nvidia docker

여기까지 잘 따라오셨다면 docker를 실행하는데는 문제가 없을 것입니다. 하지만 한 가지 문제가 남아있습니다. 우리는 PyTorch/Tensorflow를 사용할 때 GPU를 같이 사용하고 싶어한다는 점입니다. 따라서 Docker가 GPU를 인식하도록 하게 만들고 싶습니다.

 

하지만 Docker 자체에서는 GPU를 인식하도록 하는 기능을 제공하고 있지 않습니다. 이는 Docker의 가상환경은 실제 GPU와 연결될 수 없기 때문입니다. 때문에 우리는 nvidia-docker를 이용해서 Docker에서도 GPU를 인식할 수 있도록 만들고자 합니다. (아래 과정은 https://github.com/NVIDIA/nvidia-docker에서 확인할 수 있습니다.)

 

우선 다음 명령어를 통해 만약 설치되어 있는 nvidia-docker가 있다면 제거해줍시다. (이 명령어는 1.0버전 이하의 nvidia-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

 

다음 명령어를 통해 Docker에서와 같이 Nvidia-docker의 kernel repository를 추가해줍시다.

# 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

 

여기까지 잘 진행되었다면 nvidia-docker를 설치하도록 합니다.

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

 

여기까지 잘 설정되었다면 docker 명령어 대신 nvidia-docker를 사용하는 방식으로 docker를 사용할 수 있습니다. 명령어를 실행해서 docker에서의 GPU 지원 차이를 확인할 수 있습니다.

 

기존 Docker 사용시
nvidia-docker 사용시 화면. (GPU를 2개 사용중이기에 2개의 상태가 출력되고 있다)

 

'Tips > Programmings' 카테고리의 다른 글

Github README.md 작성법  (0) 2019.02.16