사이트 이용규칙을 준수하여
닥터몰라 회원과 자유롭게 소통하는 게시판입니다.

PyCharm과 도커를 이용한 딥러닝 개발환경 구축하기: Workstation side

iMola   |   조회 수: 708   |   추천 수: 4    작성 일: 2019.02.15 11:11 (5개월 전)
게임  

2012년 컴퓨터 비전계를 발칵 뒤집어 놓은 딥러닝은 컴퓨터 비전 뿐만 아니라 여러 분야의 학계, 산업계에 큰 파장을 일으키고 있다. 모두가 컴퓨터가 바둑에서 인간을 이길 수 없다고 말할 때 딥러닝 기반의 강화학습 기술로 무장한 알파고는 이세돌을 꺾었고(링크), 수십년간 연구되었지만 여전히 까마득한 고지로 여겨졌던 기계 번역 역시 딥러닝 기반 기술이 적용되면서 성큼 발전했다(링크). ‘고인물’로 여겨지던 단백질 접힘 구조 예측 역시 딥러닝으로 무장한 딥마인드의 Alphafold가 기존의 기술들을 압도하는 성능을 보여주었다(링크). 하지만 딥러닝이 빛을 보기까지 오랜 시간이 걸린 이유는 딥러닝(특히 학습)이 엄청난 컴퓨팅 파워를 요구하기 때문이다.

 

엄청난 컴퓨팅 파워는 일반적으로 엄청난 열과(이를 식히기 위한 엄청난 소음) 엄청난 전력소모 등을 동반한다. 거기에 딥러닝은 방대한 크기의 데이터셋이 있는 문제를 푸는 경우가 많다. 덕분에 손에 들고다니는 랩탑이나 흔히 보는 크기의 데스크톱에서는 제대로 된 딥러닝 학습 성능을 기대하기 어렵다. 그래서 보통은 여러 개의 CPU와 그래픽 카드가 달린 강력한(그리고 시끄러운) 컴퓨터를 사시사철 시원한 공간에서 소음과 전력소모에 관계 없이 관리, 사용하기 위해 ‘서버실’이라는 공간에 둔다. 이 시리즈는 실제 개발이 이루어질 랩탑이나 엔트리 급의 데스크톱 PC(PyCharm 개발환경 기준)와 실제 학습이 이루어질 강력한 워크스테이션을 이용해 딥러닝 개발환경을 구축하는 방법을 다룬다. 

 

여러 대의 워크스테이션에 쉽게 통일된 개발환경을 구축하기 위해 엔비디아 도커(Nvidia Docker)를 사용하였다. 왜 이런 목적으로 도커를 사용하였는지, 도커에는 어떤 장점이 있는지, 도커란 무엇인지 등에 대해서는 더 잘 설명된 글을 읽을 것을 권한다(링크). 본 글인 Workstation side편에서는 우분투 기반의 워크스테이션에 도커와 엔비디아 도커를 설치하고, 몇 가지 실 사용에 필요한 팁들과 외부에서 도커 데몬에 접근할 수 있도록 tcp 포트를 설정하는 방법을 다룬다. Desktop side 편에서는 PyCharm을 이용해 이렇게 만들어진 워크스테이션의 도커 데몬과 로컬의 개발환경을 연동하는 방법을 다룬다. 물론 이 글에서 다루는 내용은 매우 기본적인 내용이고, 이보다 더 멋진 개발환경을 구축할 수 있을 것이다. 그런 내용을 알고 있다면 이 글에 덧글로, 혹은 더 멋진 글을 써서 공유해 주시길 기대하며 글을 시작한다.

 

 

들어가며…

 

이 글은 Ubuntu 16.04 LTS, Ubuntu 18.04 LTS를 운영체제로 사용하고 CUDA를 지원하는 Nvidia의 그래픽카드가 장착된 워크스테이션에 딥러닝 개발환경을 구축하는 것을 목표로 한다. 또한, 글 초반에 밝힌 바와 같이 서버실에 있는 워크스테이션에 개발환경을 구축해야 하므로 모든 설명은 쉘 기반으로 이뤄진다. 막 운영체제 세팅이 된 상태에서 아래 내용을 따라 설치하면 가장 기본적인 tensorflow 딥러닝 개발 환경을 구축할 수 있다. 이 글을 작성하기 위해 다음 글, 문서들을 참조했다(링크1, 링크2, 링크3, 링크4, 링크5).

 

 

Nvidia Docker 설치 과정

 

그래픽카드를 사용하는 딥러닝 개발환경 구축을 위해서는 당연히 그래픽카드 드라이버를 먼저 설치해야 한다. 아래 명령을 따라 그래픽카드 드라이버를 설치한다. 그래픽 드라이버 버전은 바꿔서 설치해도 문제 없다. 필자는 다음 사이트(링크)에서 엔비디아 인증된(베타가 아닌) 최신 드라이버를 설치하고 있다. 만약 그래픽카드 드라이버가 설치되어 있다면 이 단계를 건너뛴다.

 

1
2
3
4
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-387
sudo reboot
cs

 

그래픽카드 드라이버가 설치되었으면 아래 명령어로 그래픽카드 드라이버 설치가 제대로 되었는지를 확인한다.

 

1
nvidia-smi
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.59                 Driver Version: 390.59                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  TITAN Xp            Off  | 00000000:02:00.0  On |                  N/|
| 23%   38C    P8    17W / 250W |     18MiB / 12196MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  TITAN Xp            Off  | 00000000:03:00.0  On |                  N/|
| 23%   41C    P8    18W / 250W |      9MiB / 12196MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1458      G   /usr/lib/xorg/Xorg                            15MiB |
|    1      1458      G   /usr/lib/xorg/Xorg                             6MiB |
+-----------------------------------------------------------------------------+
cs

 

위와 같은 형식의 창에서 설치된 그래픽카드의 개수, 상태 등을 확인할 수 있다면 그래픽카드 드라이버가 정상적으로 설치된 것이다. 만약 그래픽 드라이버가 정상적으로 설치되지 않는다면 드라이버를 제거하고 다음 문서(링크)를 참조해서 재설치해보자.

 

그래픽카드 드라이버가 정상적으로 설치되었다면 docker를 설치해야 한다. 다음과 같은 명령어를 통해 docker 설치를 위한 저장소를 추가한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo apt-get update
 
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
 
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
 
sudo apt-key fingerprint 0EBFCD88
 
sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
cs

 

아래 명령어로 docker-ce(community edition)을 설치한다.

 

1
2
sudo apt-get update
sudo apt-get install docker-ce
cs

 

(선택) docker 명령어는 sudo를 입력해야 하는데(예: sudo docker run …) 이것이 상당히 번거롭기 때문에 다음 명령을 입력한다. 이 명령어를 적용시키기 위해서는 재부팅이 필요하다.

 

1
2
sudo usermod -aG docker $USER
sudo reboot
cs

 

도커가 제대로 설치되었는지를 확인하기 위해 아래 명령어를 입력한다. 만약 위 명령을 입력하지 않았다면 앞에 sudo를 붙여줘야 한다.

 

1
2
3
docker ps
 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cs

 

위와 같은 목록이 나타난다면 도커 설치가 제대로 된 것이다.

 

이제 그래픽 카드를 도커 컨테이너에서 이용하기 위해 엔비디아 도커 2를 설치해야 한다. 아래 명령을 통해 엔비디아 도커 2 설치를 위한 저장소를 추가한다.

 

1
2
3
4
5
6
curl --L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl --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
cs

 

이후 아래 명령을 통해 Nvidia docker 2를 설치한다.

 

1
2
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
cs

 

여기까지 설치가 되었으면 아래 명령을 통해 제대로 설치가 되었는지를 확인할 수 있다.

 

1
docker run --runtime=nvidia --rm -ti nvidia/cuda:9.0-runtime nvidia-smi
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.59                 Driver Version: 390.59                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  TITAN Xp            Off  | 00000000:02:00.0  On |                  N/|
| 23%   38C    P8    17W / 250W |     18MiB / 12196MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  TITAN Xp            Off  | 00000000:03:00.0  On |                  N/|
| 23%   41C    P8    18W / 250W |      9MiB / 12196MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
cs

 

역시 위와 같은 내용이 출력되면 제대로 설치가 이뤄진 것이다.


 

추가 설정하기(선택)

 

이 부분은 PyCharm과 연동해서 개발환경을 구축하기 위해 추가로 설정해줘야 할 부분이다. 만약 이런 IDE를 사용하지 않는다면 이 부분은 건너뛰어도 무방하다.

 

먼저, default runtime을 설정해줘야 한다. 직접 입력해서 도커를 실행시키는 경우에는 단지 --runtime=nvidia를 추가해줘야 하는 귀찮음으로 끝나겠지만, Pycharm과 같은 IDE에서 원격으로 모든 기능을 원활하게 사용하기 위해서는 이 부분을 해결해야 한다. 

 

아래와 같은 명령을 입력해 daemon.json 파일을 연다.

 

1
sudo vim /etc/docker/daemon.json
cs
1
2
3
4
5
6
7
8
9
{
    "default-runtime""nvidia",
    "runtimes": {
        "nvidia": {
            "path""/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
cs

 

원래 파일에는 “default-runtime”: “nvidia”, 부분이 없을 것이다. 이 줄의 내용을 추가한다. 이 때 쉼표를 빠뜨리지 않도록 주의하자.

 

이후 아래와 같은 명령으로 도커 서비스를 다시 시작한다.

 

1
2
sudo service docker stop
sudo service docker restart
cs

 

이후 위에서 사용했던 명령에서 --runtime=nvidia 부분을 삭제한 명령을 입력해 제대로 동작하는지를 확인한다.

 

1
docker run --rm -ti nvidia/cuda:9.0-runtime nvidia-smi
cs

 

만약 로컬 데스크톱 컴퓨터(우분투)에서 도커 개발환경을 구축한 것이라면 다음 내용은 필요하지 않다(기본적으로 Unix 소켓을 통해 설치된 PyCharm과 통신할 수 있다). 다음 내용은 PyCharm이 설치된 컴퓨터와 실제로 딥 러닝 학습에 사용할 컴퓨터가 다른 경우에 PyCharm을 이용해 원격으로 docker daemon에 접속하기 위한 설정이다.

 

아래 명령을 통해 docker.service 파일을 수정한다.

 

1
sudo vim /lib/systemd/system/docker.service
cs

 

ExecStart로 시작하는 줄 끝에 -H tcp://0.0.0.0:2375 부분을 추가한다.

 

1
ExecStart=usrbindocker daemon -H fd:/ -H tcp://0.0.0.0:2375
cs

 

이후 파일의 변경사항을 저장하고 아래와 같은 명령을 통해 변경된 사항을 반영한다.

 

1
2
systemctl daemon-reload
sudo service docker restart
cs

 

여기까지 모든 작업이 끝났다면 아래와 같은 명령을 통해 http로 도커 API에 접속할 수 있는지를 확인한다.

 

1
curl http://localhost:2375/version
cs
1
{“Platform”:{“Name”:”Docker Engine - Community”},”Components”:[{“Name”:”Engine”,”Version”:”18.09.0”,”Details”:{“ApiVersion”:”1.39”,”Arch”:”amd64”,”BuildTime”:”2018-11-07T00:16:44.000000000+00:00”,”Experimental”:”false”,”GitCommit”:”4d60db4”,”GoVersion”:”go1.10.4”,”KernelVersion”:”4.4.0-116-generic”,”MinAPIVersion”:”1.12”,”Os”:”linux”}}],”Version”:”18.09.0”,”ApiVersion”:”1.39”,”MinAPIVersion”:”1.12”,”GitCommit”:”4d60db4”,”GoVersion”:”go1.10.4”,”Os”:”linux”,”Arch”:”amd64”,”KernelVersion”:”4.4.0-116-generic”,”BuildTime”:”2018-11-07T00:16:44.000000000+00:00”}
cs

 

위와 같은 형태의 메시지가 나온다면 설정이 완료된 것이다.

 

다만 이렇게 설정할 경우 노출된 도커 포트가 보호받지 못한다. 만약 워크스테이션으로 진입할 수 있는 외부 패킷이 차단되지 않는 환경이라면 tls 설정을 통해 노출된 포트를 보호할 수 있다. 이 내용은 다음 문서(링크)를 참조하자.

 

여기까지 딥러닝 개발환경 구축을 위한 기본적인 설치가 끝났다. 이 외에도 워크스테이션을 서버로 활용하기 위해 몇 가지 설정 등을 해 줘야겠지만 그 부분은 이 글에서는 다루지 않는다.


 

설치된 서버에서 텐서플로우 구동해보기

 

보통 GPU에서 동작하는 텐서플로우를 설치하기 위해서는 CUDA, CuDNN, Tensorflow-GPU 버전 등을 추가로 설치해 줘야 한다. 하지만 도커를 이용하면 따로 이런 설치 없이 이미지를 내려받는 것으로 모든 환경을 세팅할 수 있다. 실제로 서버에서 텐서플로우가 제대로 구동되는지를 확인하기 위해 이미 개발환경이 세팅된 이미지를 가져오자.

 

1
docker pull tensorflow/tensorflow:latest-gpu-py3
cs

 

위 명령을 입력하면 도커는 해당 이미지를 도커 허브로부터 내려받는다(다른 버전을 내려받고 싶다면 링크 참조). 도커 허브에 올려져 있는 이미지를 내려받을 때에는 로그인이 필요하지 않지만 도커 허브에 직접 만든 이미지를 올리고, 여러 워크스테이션에서 이를 쉽게 내려받으려면 도커 허브에 회원가입을 하고 docker login 명령을 통해 로그인해야 한다. 이미지를 성공적으로 받았으면 아래 명령을 통해 새로운 컨테이너를 생성하고 bash를 실행한다. (아래 명령은 도커의 실행을 보여주기 위해 명령행의 앞쪽까지 모두 포함하고 있다. 실제 입력시에는 $ 뒷 부분만 입력하면 된다.)

 

1
2
[email protected]:~$ docker run --rm -it tensorflow/tensorflow:latest-gpu-py3 /bin/bash
[email protected]:/notebooks#
cs

 

그러면 새로운 컨테이너의 bash가 실행되는데, 여기서 원하는 동작을 수행할 수 있다. ls로 디렉토리 트리 구조를 탐색할 수도 있고 nvidia-smi 명령을 통해 그래픽 카드가 제대로 인식되고 있는지를 다시 확인할 수도 있다. 우리의 목적은 텐서플로우 동작 확인이니 python을 실행시켜보도록 하자.

 

1
2
3
4
5
[email protected]:/notebooks# python
Python 3.5.2 (default, Nov 23 201716:37:01)
[GCC 5.4.0 20160609] on linux
Type “help”, “copyright”, “credits” or “license” for more information.
>>>
cs

 

python이 실행되었으면 아래와 같은 코드를 차례로 입력하여 텐서플로우 동작을 확인할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> import tensorflow as tf
>>> hello = tf.constant(‘hello, tensorflow’)
>>> sess = tf.Session()
2019-02-15 01:29:20.374327: I tensorflowcoreplatform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2019-02-15 01:29:20.690045: I tensorflowcorecommon_runtimegpugpu_device.cc:1432] Found device 0 with properties:
name: TITAN Xp major: 6 minor: 1 memoryClockRate(GHz): 1.582
pciBusID: 0000:02:00.0
totalMemory: 11.91GiB freeMemory: 11.72GiB
2019-02-15 01:29:20.853128: I tensorflowcorecommon_runtimegpugpu_device.cc:1432] Found device 1 with properties:
name: TITAN Xp major: 6 minor: 1 memoryClockRate(GHz): 1.582
pciBusID: 0000:03:00.0
totalMemory: 11.91GiB freeMemory: 11.73GiB
2019-02-15 01:29:20.854712: I tensorflowcorecommon_runtimegpugpu_device.cc:1511] Adding visible gpu devices: 01
2019-02-15 01:29:25.317635: I tensorflowcorecommon_runtimegpugpu_device.cc:982] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-02-15 01:29:25.317681: I tensorflowcorecommon_runtimegpugpu_device.cc:9880 1
2019-02-15 01:29:25.317691: I tensorflowcorecommon_runtimegpugpu_device.cc:10010: N Y
2019-02-15 01:29:25.317698: I tensorflowcorecommon_runtimegpugpu_device.cc:10011: Y N
2019-02-15 01:29:25.318258: I tensorflowcorecommon_runtimegpugpu_device.cc:1115] Created TensorFlow device (job:localhostreplica:0/task:0/device:GPU:0 with 11345 MB memory)  physical GPU (device: 0, name: TITAN Xp, pci bus id: 0000:02:00.0, compute capability: 6.1)
2019-02-15 01:29:25.351893: I tensorflowcorecommon_runtimegpugpu_device.cc:1115] Created TensorFlow device (job:localhostreplica:0/task:0/device:GPU:1 with 11354 MB memory)  physical GPU (device: 1, name: TITAN Xp, pci bus id: 0000:03:00.0, compute capability: 6.1)
>>> sess.run(hello)
b’hello, tensorflow’
cs

 

이제 텐서플로우를 이용한 딥러닝 개발을 위한 가장 기본적인 세팅이 완료되었다. 추가적인 패키지가 필요하다면 이 tensorflow 이미지를 실행시켜 bash를 통해 설치한 후 commit 해서 새로운 이미지를 만들거나(추천하지 않음), Docker file을 통해 tensorflow 이미지를 기반으로 한 새로운 이미지를 만들어 사용할 수 있다. Docker file 등의 도커 사용법은 더 잘 설명되어 있는 글들(링크)을 참조하자.

 

다음 편에서는 사용하는 데스크탑 혹은 랩탑에서 PyCharm을 이용해 실제 개발환경을 세팅하는 내용을 다룰 계획이다. 모두 즐거운 연구, 개발 되시길.

댓글 0

소개

[오늘의 추천곡] Oh my love my darling (사랑과 영혼 ost, 추억의 명곡)

31
작성 일: 2개월 전. kerakera
잡담

오전이 너무 졸립네요..

35 1
작성 일: 2개월 전. 시원한목캔디
영상

[오늘의 추천곡] [이희문, 프렐류드] 한국남자의 청춘가(재즈+민요)

34 2 1
작성 일: 2개월 전. kerakera
잡담

[게임지름 방지만화] 1화 에필로그(글로만 작성)

45 1
작성 일: 3개월 전. kerakera
잡담

[게임지름 방지만화] 오늘도 내가 참는다 1화

115 1
작성 일: 3개월 전. kerakera
소개

멀티 플랫폼 SSH 클라이언트: Terminus

88
작성 일: 3개월 전. iMola
질문

The silent Age 한글 패치 진행중인가요?

165
작성 일: 4개월 전. Hyosungs
잡담

이제 다음달까지는 평일 공휴일이 없네요 ㅠㅠ

67 2 1
작성 일: 4개월 전. 시원한목캔디
소개

음원을 하나 발매했습니다

88 1
작성 일: 4개월 전. 나무노래
꿀팁

PyCharm과 도커를 이용한 딥러닝 개발환경 구축하기: Workstation side

708 4
작성 일: 5개월 전. iMola
소개

시간에 맞게 다크 모드를 활성화 시켜주는 ‘NightOwl’

275 2 3
작성 일: 5개월 전. iMola
잡담

김종국이 계단 오르는거 보고

167 1
작성 일: 5개월 전. 따스한커피
잡담

새로 가입했습니다 안녕하세요

81 2 3
작성 일: 5개월 전. EDGE
소개

좋은 폰트 종류가 많네요

199 1 1
작성 일: 6개월 전. darking
잡담

내 차에서도 이런소리가 난다면? 빨리가서 확인해 보세요!!

91
작성 일: 6개월 전. 하린그랜파
서버에 요청 중입니다. 잠시만 기다려 주십시오...