2020년 7월 18일 토요일

도커 기반 NVIDIA GPU 드라이버 설치 및 딥러닝 프레임웍 실행

이 글은 도커 기반 NVIDIA GPU 드라이버 설치 및 딥러닝 프레임웍 실행 방법을 설명한다.

머리말
딥러닝 모델 응용 프로그램을 개발하다보면, 다양한 버전과 환경으로 인해 의존성이 꼬여 에러가 나거나 문제가 생기는 경우가 발생한다. 하나의 설치가 다른 패키지에 영향을 주기 때문에, 아나콘다의 가상환경을 만들어 사용하기도 하나, 이 또한 전체 개발 환경에 영향을 미치므로 깨끗하게 해결할 수 있는 방법이 아니다.

이 경우, 엔비디아 GPU 드라이버를 도커 이미지로 설치하고, 이 엔비디아 도커 드라이버 위에서 텐서플로우, 케라스, 파이토치 같은 딥러닝 플랫폼이 담긴 도커를 실행하면 완전히 독립적인 환경에서 딥러닝 모델을 개발할 수 있다.
이 글 내용을 따라하기 위해서는 다음 개발환경이 설치되어 있어야 한다.
  • 우분투 16.04
  • NVIDIA GTX 1070 DRIVER
  • CUDA 9.0
  • DOCKER
도커 이미지 개발 방법에 대한 내용은 아래 링크를 참고한다.
도커 루트 폴더 변경
엔비디아 도커 설치 전에 도커 루트 폴더를 변경해야 한다. 그렇지 않으면, 우분투 루트 용량이 가득차 우분투가 다운될 수 있다. 다음 명령으로 관련 파일을 수정한다.
sudo gedit /lib/systemd/system/docker.service

파일 중에 아래 위치에 data-root 를 사용자 폴더(ex. /home/ktw/data/docker)로 설정한다.
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --data-root=/home/ktw/data/docker

도커 서비스를 재시작한다.
sudo service docker stop
sudo service docker start

도커의 데이터 루트 정보를 재확인해 본다.
docker info | grep Root
Docker Root Dir: /home/ktw/data/docker

엔비디아 도커 이미지 설치
만약, 기존 엔비디아 1.0 도커 버전이 있다면 삭제한다.
sudo 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

엔비디아 2.0 도커 버전을 설치한다.
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 install -y nvidia-docker2
sudo pkill -SIGHUP dockerd

설치 후 엔비디아 도커의 nvidia-smi 명령을 다음과 같이 실행한다.
sudo docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi

다음과 같이 nvidia-docker 명령으로 이미지를 실행할 수도 있다.
sudo nvidia-docker run nvidia/cuda:9.0-base-ubuntu16.04 nvidia-smi

다음 화면이 보이면 성공한 것이다.

만약, 도커 실행 시 디폴트로 엔비디아 도커를 설정하려면 다음과 같이 파일을 수정한다.
sudo gedit /etc/docker/daemon.json

"default-runtime": "nvidia",
"runtimes":
{
   "nvidia":
   {
      "path": "nvidia-container-runtime",
      "runtimeArgs": []
   }
}
                               
텐서플로우 도커 이미지 설치 및 실행
쿠다 9.0에 맞는 텐서플로우 도커 이미지를 설치한다.
sudo docker pull tensorflow/tensorflow:1.8.0-gpu-py3      
sudo docker images   

다음과 같이 텐서플로우 도커를 실행하고, 쥬피터 노트북 서버를 구동한다. 참고로, 8888은 쥬피터 노트북 연결 포트, 6006은 텐서보드 연결 포트이다.
sudo nvidia-docker run -it -p 8891:8888 -p 6006:6006 --name ktw -v /home/ktw/Documents/docker:/notebooks -e PASSWORD="0000" --restart always tensorflow/tensorflow:1.8.0-gpu-py3

쥬피터 노트북을 크롬 등으로 http://localhost:8891 실행해 다음과 같은 화면이 보이면 성공한 것이다.

이제 딥러닝 모델 테스트를 도커 기반으로 진행할 수 있다.

도커의 볼륨 옵션을 사용하면, 도커 실행이 멈추어도, 볼륨과 맵핑된 폴더에 파일을 읽고 저장할 수 있다. 이를 이용해 데이터나 설정만 사용자별로 다르고, 도커 이미지를 여러개 실행하거나 다양한 딥러닝 모델 도커 이미지를 독립적으로 운용할 수 있을 것이다.

다음과 같이 볼륨에 맵핑된 호스트 폴더에 파이썬 파일을 저장하고, 쥬피터 노트북를 실행해보자. 해당 파일이 도커 이미지에서 서비스되고 있는 쥬피터 노트북에 보일 것이다.

import sys
import numpy as np
import tensorflow as tf
from datetime import datetime

device_name = 'gpu'  # Choose device from cmd line. Options: gpu or cpu
shape = (3, 3)
if device_name == "gpu":
    device_name = "/gpu:0"
else:
    device_name = "/cpu:0"
   
with tf.device(device_name):
    random_matrix = tf.random_uniform(shape=shape, minval=0, maxval=1)
    dot_operation = tf.matmul(random_matrix, tf.transpose(random_matrix))
    sum_operation = tf.reduce_sum(dot_operation)
    startTime = datetime.now()

with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as session:
        result = session.run(sum_operation)
        print(result)# It can be hard to see the results on the terminal with lots of output -- add some newlines to improve readability.

print("\n" * 5)
print("Shape:", shape, "Device:", device_name)
print("Time taken:", str(datetime.now() - startTime))


실행 결과는 다음과 같다.

참고 - 도커 이미지 완전 삭제 명령
아래와 같이 -q 옵션을 주어, 도커 프로세스를 멈춘다음, 모든 도커 이미지 번호를 얻어 이미지를 삭제한다.  
sudo docker stop $(sudo docker ps -a -q)
sudo docker rm $(sudo docker ps -a -q)
sudo docker rmi $(sudo docker images -q)

레퍼런스
아래는 아마존 웹 서비스 머신러닝 클라우드 플랫폼 구조에 대한 내용을 링크한 것이다.

댓글 없음:

댓글 쓰기