Docker

docker로 ubuntu18.04 /cuda10.1 /cudnn7 /opencv4.4.0/pytorch1.4.0 환경 만들기

개발챙 2021. 8. 11. 22:49
728x90

프로젝트 진행 중 ubuntu 18.04, cuda 10.1, cudnn 7, opencv 4.4.0, pytorch 1.4.0 의 환경을 구성해야 하는 일이 생겼다.

docker로 가상환경을 구상하고자 한 것은

  1. 반복되는 서버 초기화에 지쳤고...^^
  2. conda환경은 이제 트렌디하지 않기 때문이다

시간이 많이 없고 처음 해보는 거라 깊은 이해없이 하게 된 감이 없지않아 있지만 ㅠㅠ docker에 대한 깊은 이해는 앞으로 해가도록 하고 일단 이 환경을 구성하는데 성공한 것에 박수를 치면서 ㅎㅎㅎㅎ 경험을 공유하고자 한다


ubuntu 18.04환경의 원격서버에서 진행하였다

1. base가 되어줄 nvidia/cuda:10.1-cudnn7-devel-ubuntu18.04 이미지 pull

https://github.com/NVIDIA/nvidia-docker

 

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

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

github.com

$ docker pull nvidia/cuda:10.1-cudnn7-devel-ubuntu18.04

2. 이 이미지로 컨테이너 실행(생성)

docker run -it nvidia/cuda:10.1-cudnn7-devel-ubuntu18.04 bash
$ sudo docker run --gpus all -it --name [컨테이너이름] -v [volume이름]:[볼륨연결할컨테이너내경로] --ipc=host [이미지이름]
# ipc=host옵션은 gpu 사용시 메모리 문제 발생 해결을 위해 사용하였는데 컨테이너의 ipc모드를 설정해주는 옵션이다

컨테이너를 실행하기 위해서 쓰이는 docker run

docker run 커맨드의 기본 포멧 $ docker run (<옵션>) <이미지 식별자> (<명령어>) (<인자>)

-it 옵션은 

컨테이너를 종료하지 않은체로, 터미널의 입력을 계속해서 컨테이너로 전달하기 위해서 사용. 특히 컨테이너의 쉘(shell)이나 CLI 도구를 사용할 때 매우 유용. Ctrl + P를 누르고 Ctrl + Q를 누르면 Container를 죽이지 않고 탈출할 수 있다.

3. 컨테이너에서 opencv 설치

설치에 필요한 패키지들 설치

$ sudo apt-get update
$ sudo apt-get upgrade

# install the dependencies
$ sudo apt-get install build-essential cmake git unzip pkg-config
$ sudo apt-get install libjpeg-dev libpng-dev libtiff-dev
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt-get install libgtk2.0-dev libcanberra-gtk*
$ sudo apt-get install python3-dev python3-numpy python3-pip
$ sudo apt-get install libxvidcore-dev libx264-dev libgtk-3-dev
$ sudo apt-get install libtbb2 libtbb-dev libdc1394-22-dev
$ sudo apt-get install libv4l-dev v4l-utils
$ sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
$ sudo apt-get install libavresample-dev libvorbis-dev libxine2-dev
$ sudo apt-get install libfaac-dev libmp3lame-dev libtheora-dev
$ sudo apt-get install libopencore-amrnb-dev libopencore-amrwb-dev
$ sudo apt-get install libopenblas-dev libatlas-base-dev libblas-dev
$ sudo apt-get install liblapack-dev libeigen3-dev gfortran
$ sudo apt-get install libhdf5-dev protobuf-compiler
$ sudo apt-get install libprotobuf-dev libgoogle-glog-dev libgflags-dev
# a symlink to videodev.h
$ cd /usr/include/linux
$ sudo ln -s -f ../libv4l1-videodev.h videodev.h
$ cd ~

opencv 설치 zip파일 다운 및 압축해제

$ cd ~
$ mkdir opencv_build && cd opencv_build
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.4.0.zip
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.4.0.zip

$ unzip opencv.zip
$ unzip opencv_contrib.zip

$ mv opencv-4.4.0 opencv
$ mv opencv_contrib-4.4.0 opencv_contrib

$ cd opencv
$ mkdir build
$ cd build

cmake실행

cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_ENABLE_NONFREE=ON \
-D WITH_TBB=OFF \
-D WITH_IPP=OFF \
-D WITH_1394=OFF \
-D BUILD_WITH_DEBUG_INFO=OFF \
-D BUILD_DOCS=OFF \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D WITH_QT=OFF \
-D WITH_GTK=ON \
-D WITH_OPENGL=ON \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-D WITH_V4L=ON  \
-D WITH_FFMPEG=ON \
-D WITH_XINE=ON \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON ../

make실행

$ make -j$(nproc)
$ sudo make install
$ sudo ldconfig
$ sudo apt-get update

4. pytorch도 설치

$ pip3 install torch==1.4.0 torchvision==0.5.0

5. 이 컨테이너를 이미지로 저장

commit 과 push

[commit]

sudo docker container ls로 이름 확인

편의를 위해 이름도 바꿔줌

$ sudo docker rename 예전이름 바꿀이름

이후 commit 해준다

$ sudo docker commit CONTAINER IMAGE_NAME

[push]

docker cloud에 로그인

$ docker login

docker user id 변수 지정(편의 위해)

$ export DOCKER_ID_USER="changjoy"

docker image에 태그 달기

$ sudo docker tag torch_cv2 $DOCKER_ID_USER/ubuntu18.04-cuda10.1-cudnn7-torch1.4.0-opencv4.4.0

Tag 가 적용되어 있는 Image 를 Docker Cloud 에 Push

$ sudo docker push $DOCKER_ID_USER/ubuntu18.04-cuda10.1-cudnn7-torch1.4.0-opencv4.4.0


https://hub.docker.com/r/changjoy/ubuntu18.04-cuda10.1-cudnn7-torch1.4.0-opencv4.4.0

 

Docker Hub

 

hub.docker.com

잘 push되었다! 

docker에서 gpu를 사용하기 위해선 nvidia toolkit도 설치해주어야 한다.

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
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 update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

이후 다시 컨테이너 실행해보겠다

docker run -it --gpus all torch_cv2 bash

python3실행 후 torch로 gpu 사용 확인

컨테이너 재실행
종료된 컨테이너를 다시 시작하기 위해서는 'ps -a'로 해당 CONTAINER ID를 'start'로 실행시키고 'attach'로 접속하면 된다.

docker start 85193668a4b5
docker attach 85193668a4b5

728x90