본문 바로가기

Docker & Kubernetes/Docker

[Docker] 도커로 딥러닝 환경 구축하기

반응형

딥러닝 모델 학습/테스트 환경에 필요한

GPU, 주피터노트북 등 필요한 환경 구축에 관한 포스팅

 

 

도커에서 GPU 사용하기

기본 개념

- 기본적으로 Docker Image로 생성된 Container 내에서는, Host OS가 보유한 GPU 자원은 사용할 수 없다

- 따라서 도커 컨테이너 안에서 GPU 사용을 위한 설정이 필요

- 기본적으로 Host OS에는 GPU 자원이 있고, Nvidia가 설치된 상태여야 한다.

- 또한 당연히 Docker도 설치된 상태여야한다

 

nvidia-smi 화면

 

Nvidia-docker 설치

  • Docker에서 GPU를 사용하기 위해서는 nvidia-docker가 설치해야 한다.

< 설치 과정 >

1. 우선 nvidia-docker1이 설치되어있다면 확인 후 제거해야 한다

- 아래 코드는 docker 버전 업그레이드가 필요한 경우에만 실행한다

$ 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. 레파지토리에 추가한다

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

 

3. nvidia-docker2를 설치하고 docker 데몬을 다시 로드한다

sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd

 

4. 도커 환경에서 nvidia를 바라보는지 테스트한다

docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi

<Test 화면>

 

5. 도커 실행 시 default로 nvidia-docker로 설정하기

$ vi /etc/docker/daemon.json

- daemon.json 파일을 아래와 같이 수정한다

- 위와 같이 설정하면 nvidia-docker명령어가 아닌 docker 명령만으로 GPU를 사용할 수 있다

 

6. Trouble Shooting

- 특정 이미지의 경우 nvidia-docker를 설치하고, default-runtime을 설정해도 위와 같이 nvidia-smi가 실행이 안될 경우가 있다. 그럴 경우에는 runtime을 다시 nvidia로 지정하고, 특정 GPU를 바라보게 한 뒤 실행

 

$ docker run --rm --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=0,1 [이미지이름]

 

위와 같이 nvidia-smi가 잘 실행되는 것을 확인 할 수 있다

 

도커에서 쥬피터 노트북 사용

$ docker run -it -p 8888:8888 --name [컨테이너이름] [이미지이름]

- 도커 컨테이너 내부에서 쥬피터 노트북을 실행하기 위해서는 포트포워딩을 해줘야한다

- '-p' 인자 뒤에 오는 포트는 [호스트포트]:[컨테이너포트] 이다.

 

$ jupyter notebook -no-browser --ip=0.0.0.0 --port=8888 --allow-root

- 도커 컨테이너 내부에서 쥬피터 노트북을 실행할 때 명령어

- 실제 실행시에는 '서버ip:지정포트'로 접속한다

 

도커에서 Host OS의 데이터 자원 공유

$ docker run --v [호스트 폴더 경로]:[컨테이너 폴더 경로] [이미지] 

- Host os에 있는 데이터 혹은 코드를 컨테이너 내부에서 사용하고자 할 때

- '-v' 옵션을 사용하면 쉽게 호스트와 자원을 공유할 수 있다

 

 

도커에서 Tensorboard 접속

$ tensorboard --logdir=[로그파일위치] --bind_all

- 도커 컨테이너 안에서 텐서보드 실행시, 꼭 --bindall 파라미터를 같이 작성해야 접속 가능

- 접속은 http://localhost:6006 (기본 포트 : 6006, 변경 가능)

- 이때 로컬과 도커 컨테이너의 사용하려는 포트가 포트포워딩이 되어 있어야한다 

반응형