본문 바로가기

Docker setting

Docker CUDA Image 가져와서 딥러닝 환경 세팅까지

기존 서버 : 

Ubuntu 18.04

CUDA 10.2

NVIDIA RTX 2080 Ti

 

위에 CUDA 10.0 도커를 구동해야 하는 상황이 왔다.

 

학습용 코드가 tensorflow-gpu==1.13.1, keras==2.2.4를 지원하는데 버전을 맞추기 위해서는 CUDA 10.0버전이 필요하기 때문.

 

1. Docker Pull from Docker Hub

docker hub에서 적당한 docker image 검색

 

nvidia/cuda 공식 이미지 중에서 CUDA 10.0, cudnn7, ubuntu 18.04용 tag를 검색합니다.

 

너로 정햇다!

10.0-cudnn7-runtime-ubuntu18.04 이미지를 선택합니다.

docker pull nvidia/cuda:10.0-cudnn7-runtime-ubuntu18.04

docker pull 명령어 뒤에 가져오고 싶은 docker image tag 입력

아래와 같이 나오면 성공입니다.

 

 

도커 이미지를 잘 받아왔는지 확인

docker images

순서대로 REPOSITORY, TAG, IMAGE ID, CREATED, SIZE 입니다.

 

 

2. Docker TAG 변경

한 서버에서 구동하고 있는 도커가 많고 저 TAG명을 그대로 쓰기는 어려우니

REPOSITORY와 TAG이름을 변경해봅시다.

 

docker tag 기존 REPOSITORY:기존TAG 바꿀REPOSITORY:바꿀TAG

docker tag nvidia/cuda:10.0-cudnn7-runtime-ubuntu18.04 trainserver:cuda10.0

docker images로 확인해보면 다음과 같이 새로운 docker image가 생성되었음을 알 수 있습니다.

IMAGE ID는 같고 REPOSITORY와 TAG이름만 다른 것을 확인!

 

 

3. Docker RUN with PORT

이제 도커이미지를 컨테이너로 올리는 작업이 남았다.

처음에 이 개념이 잘 이해가 안됐는데, Docker Hub에서 가져온 이미지를 붕어빵 틀로 생각하고

원하는만큼 붕어빵, 즉 컨테이너를 만들 수 있다고 생각하면 된다.

 

도커를 설치한 서버는 서버실에 있고 나는 ssh를 통해 원격으로 작업해야 하는 상황이므로

port를 뚫어주는 작업을 같이 했다.

 

docker run <옵션> <이미지 이름> <실행될 장소>

 

docker run 명령어에 필수적으로 들어가야 하는 옵션에 -it 가 있다.

예전 도커 버전에는 -i와 -t를 따로 쓰기도 했는데 지금은 -it로 붙여 쓸 수 있다.

 

-i (=interactive) : 사용자와 상호작용 할 수 있는 표준입출력을 제공한다는 명령어이다.

-t (=tty) : 텍스트 기반의 터미널(pseudo-tty)를 사용가능하게 해준다. (bash 셀 사용할 때!)

-gpus : 특정 gpu만 할당

-p : <호스트 포트> : <컨테이너 포트>

 

즉, 도커 컨테이너를 굽고 bash에 접속해서 딥러닝 무언가를 학습할 계획이라면 무조건 적어야 하는 명령어...

 

docker 공식 페이지를 참고하세요!

docker run -it --names="jhhuh_cuda10.0" --gpus "device=1" -p 32805:22 -p 32609:8888 trainserver:cuda10.0 /bin/bash

지금의 경우에는 내컴퓨터에서 ssh 원격으로 서버 컴퓨터에 접속해야 하므로

서버 호스트의 22번 포트를 32805번 포트로 열어주었다. 

위 명령어를 실행한 후

docker ps -a

를 통해 도커 컨테이너 확인.

 

도커를 실행시켜주면 PORT가 열린다.

docker start <컨테이너 ID>

 

4. docker 내부 config 세팅

이렇게 끝난게 아니라 docker 내부에 접속해서 ssh를 열어주어야 한다.

우선 도커 내부에 들어간다.

docker attach <컨테이너 ID>

기본 세팅

apt-get update
apt-get install sudo
sudo apt-get install vim
apt-get install net-tools vim openssh-server

 

config 파일을 열고(만약 빈 파일이면 openssh-server 설치가 안 된 것) 

vim /etc/ssh/sshd_config

# PermitRootLogin prohibit-password  의 주석을 제거하고

PermitRootLogin yes 

로 바꿔준뒤 저장합니다.

 

ssh로 이 컨테이너에 접속할 때 입력할 비밀번호 입력!

passwd root

 

마지막으로 docker 내부에서 ssh 켜주기

service ssh start

이제 원격으로 연결할 수 있습니다!

ssh -p 32805 root@ip_address

 

 

 

5. tensorflow, keras 설치

여기까지만 왔다면 이제 다 된거나 다름없습니다. (내 생각)

 

도커 내부에 들어오면 pip도 없고 python도 연결이 안되어있어서 하나씩 깔아줍니다.

 

sudo apt-get -y install python3-pip
apt-get update
alias pip=pip3

 

tensorflow, keras, opencv 설치

pip install tensorflow-gpu==1.13.1
pip install keras==2.2.4
pip install opencv-python

 

현재 서버에서는 CUDA 10.0, cudnn7에 맞는 tensorflow-gpu 버전이 1.13.1이었는데

설치 후 python3 쉘 창에서 다음 명령을 실행했을 때 libcudnn 오류가 뜬다면 tensorflow-gpu 버전을 높여보는 것을 추천합니다.

#[python3]
import tensorflow
tensorflow.test.is_gpu_available()

 

이때 설치할때도 clone한 코드 repository에서는 tensorflow-gpu 1.12를 권장한다고 했지만 

libcudnn9.0 라이브러리를 못찾는다는 오류가 나와서

tensorflow-gpu==1.13.1 버전으로 업그레이드하니 충돌 없이 잘 되었음.

 

GPU 접속해서 예쁘게 잘 훈련중 🌠