기존 서버 :
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 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 접속해서 예쁘게 잘 훈련중 🌠