docker로 ubuntu18.04 /cuda10.1 /cudnn7 /opencv4.4.0/pytorch1.4.0 환경 만들기
프로젝트 진행 중 ubuntu 18.04, cuda 10.1, cudnn 7, opencv 4.4.0, pytorch 1.4.0 의 환경을 구성해야 하는 일이 생겼다.
docker로 가상환경을 구상하고자 한 것은
- 반복되는 서버 초기화에 지쳤고...^^
- 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