Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-15 02:05
관리 메뉴

nomad-programmer

[DevOps/Docker] 딥러닝/기계학습에서 Docker 이용 (a.k.a Deepo) 본문

DevOps/Docker

[DevOps/Docker] 딥러닝/기계학습에서 Docker 이용 (a.k.a Deepo)

scii 2020. 11. 29. 00:43

Docker가 제품 환경에서 실제 가동되는 시스템의 대부분은 글로벌하게 전개하는 대규모 웹 시스템으로, 컨테이너 오케스트레이션 툴인 Kubernetes를 사용하여 운용되는 경우가 많다.

하지만 Docker가 갖고 있는 높은 이식성을 살려 기계학습 등에서도 자주 이용되고 있다. 특히 딥러닝(심층학습)에서는 프레임워크나 다양한 라이브러리를 이용하여 개발이 이루어지는 경우가 일반적인데, Docker를 사용하면 그러한 버전의 차이나 환경을 의식하지 않고 개발할 수 있다는 장점이 있다.

예를 들어 기계학습에서 널리 이용되는 개발 툴인 Jupyter Notebook이나 딥러닝이 특기인 프레임워크 TensorFlow는 Docker Hub에서 공식 Docker 이미지를 제공하고 있다.

게다가 Kubernetes에서 TensorFlow를 작동시키는 환경을 구축하기 위해 Kuberflow라는 오픈소스 소프트웨어도 개발이 진행되고 있다. 모델 개발 - 학습 - 추론이라는 일련의 기능을 제공한다.

  • JupyterHub
  • TensorFlow Traning Container
  • TensorFlow Serving

github.com/kubeflow/kubeflow

 

kubeflow/kubeflow

Machine Learning Toolkit for Kubernetes. Contribute to kubeflow/kubeflow development by creating an account on GitHub.

github.com

또한 Microsoft Azure가 제공하는 컨테이너를 이용한 Azure Batch Shipyard의 경우 Microsoft Cognitive Toolkit(CNTK) 뿐만 아니라 TensorFlow, Apache, MXNet, Chainer 등 다양한 프레임워크를 지원한 대규모 병렬 컴퓨팅이나 하이퍼포먼스 컴퓨팅(HPC)의 배치 잡 실행 서비스가 제공되고 있다.

github.com/Azure/batch-shipyard

 

Azure/batch-shipyard

Simplify HPC and Batch workloads on Azure. Contribute to Azure/batch-shipyard development by creating an account on GitHub.

github.com

Docker는 웹 엔지니어뿐만 아니라 폭넓은 분야의 엔지니어에게 편리한 툴로 이용되고 있다.


Deepo를 이용한 머신러닝

딥러닝 환경 구축의 어려움은 상당하다. 데스크탑에서 cuda나 cudnn등 nvidia 가속을 이용하는 환경을 구축하는 것이 그리 간단하지않다. 파이썬의 가상화를 위하여 anaconda를 주로 사용하지만 conda 업그레이드시 함께 포함된 패키지가 업데이트되면서 호환성이 깨지는 경우가 종종 발생한다.
이런 어려움이 많아서일까? 그래서 Deepo가 나온 것 같다. Deepo는 딥러닝/머신러닝 개발 환경을 쉽게 구축할 수 있는 all-in-one Docker 이다. 아래의 링크를 클릭하면 Deepo Github 페이지에 방문할 수 있다.

github.com/ufoym/deepo#Installation

 

ufoym/deepo

Set up deep learning environment in a single command line. - ufoym/deepo

github.com

Deepo 설치 방법은 Deepo Github 페이지에 자세히 나와있어 생략한다.

참고로 Deepo에서 GPU연산을 사용하려면 nvidia-docker가 설치되어 있어야 한다. 그래야 GPU를 이용한 기계학습이 가능하다.

github.com/NVIDIA/nvidia-docker

 

NVIDIA/nvidia-docker

Build and run Docker containers leveraging NVIDIA GPUs - NVIDIA/nvidia-docker

github.com

GPU 딥러닝을 위한 deepo 이미지 실행

$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ufoym/deepo         latest              f46864e9b74d        3 months ago        15.1GB

// 이미지 실행
$ docker container run --gpus all -it -p 8888:8888 -v <경로>/deepo/data:/data -v <경로>/deepo/config:/config ufoym/deepo /bin/bash
  • -v (--volume) : 볼륨 옵션을 이용하여 data 및 config 파일들을 공유하도록하였다. 그래서 도커가 다시 실행하여도 데이터가 보존된다.
  • --gpus all : 컨테이너의 GPU 사용을 가능하도록 하는 옵션이다.
  • -it : 인터랙티브 터미널을 사용하기 위한 옵션이다.
  • /bin/bash : 터미널에서 실행할 명령어이다. bash 쉘을 통해 도커에 진입하게 된다.

Jupyter-LAB 설치

만약 jupyter-lab 설치가 되어 있지 않다면, 설치한다.

pip install jupyterlab

// 또는 외부에서 명령
docker container exec -it <container-name> pip install jupyter-lab

jupyter-lab 실행

// jupyter-lab config 파일 생성
jupyter lab --generate-config
vim jupyter_notebook_config.py

// 공유 볼륨으로 지정한 디렉토리로 경로 변경
c.NotebookApp.notebook_dir = '/data'
c.NotebookApp.open_browser = False
c.NotebookApp.allow_root = True
c.NotebookApp.port = 8888
c.NoteboolApp.ip = '0.0.0.0'
nohup jupyter lab --ip 0.0.0.0 --port 8888 --allow-root --no-browser &

// 만약 config 파일의 내용을 수정했다면 아래와 같이 간단히 실행하면 된다.
nohup jupyter lab --ip 0.0.0.0 &

port는 docker 실행시 지정한 8888번 포트를 지정한다. 그러면 호스트 OS의 8888번 포트를 열어두기만 하면 외부에서도 접근 가능하다. 
그리고 컨테이너 내부에서 root로 실행시키고 있기 때문에, --allow-root 옵션이 필요하다. 브라우저 또한 없기 때문에 --no-browser 옵션도 같이 넣어 실행한다.

nohup 이란?

nohup이란 HUP(hangup) 신호를 무시하도록 만드는 리눅스의 POSIX 명령어이다. 일반적으로 출력을 별도로 넘겨주지 않으면 nohup.out 이라는 이름의 파일로 출력한다.
보통 쉘 스크립트나 프로그램을 실행시킬 때 터미널에서 실행시키게 되면, 세션이 끊기거나 로그아웃을 할 경우 돌아가던 프로그램과 스크립트가 멈추가 된다.
이런 겨우 "nohup" 명령을 사용하면 터미널 세션이 끊기거나 로그아웃을 해도 프로세스가 종료되지 않고 지속적으로 실행된다.

& 와 다른점은 & 는 백그라운드라서 로그아웃을 하면 종료되고, nohup 은 그대로 유지된다.

Deepo에 변경 사항 저장

필요에 따라 Jupyter LAB 등 별도의 라이브러리나 프레임워크를 설치하는 경우, docker를 실행할 때마다 초기화되기 때문에 재설치의 번거로움이 있다. 이런 경우 변경사항을 저장해서 본인이 원하는 최적의 환경을 구축할 수 있다.

$ docker container commit <container-id> <new-image-name>

위의 명령을 실행하면 현재 실행중인 컨테이너의 상태를 저장하여 새로운 docker image로 생성한다.

$ docker container commit -a "[user name]" -m "Deepo JupyterLAB" e34a [user name]/deepo:1.0

생성한 새로운 이미지를 시작하려면 아래와 같은 명령을 통해 실행하면 된다.

$ docker container run --gpus all -it -p 8888:8888 -v <경로>/deepo/data:/data -v <경로>/deepo/config:/config --name=deepo_jupyterlab <user name>/deepo:1.0 /bin/bash
Comments