CentOS7上にGeForceのCUDAドライバをインストールし、CUDAを利用できるDocker環境を整えます。GPUをDocker上で使うためにはdockerコマンドの代わりにnvidia-dockerコマンドを使う必要があり、CentOS7へのnvidia-dockerのインストールまでの手順はこちらで解説しています。今回は、すでにCUDA Toolkit 8.0がインストールされているDockerイメージ上でOpenCV 3.2.0をソースコードからコンパイルし、GPUオプションをONにしたOpenCVをインストールしています。
Dockerfile
#Dockerfile FROM nvidia/cuda:8.0-devel-ubuntu16.04 RUN apt-get update && apt-get install -y --no-install-recommends \ wget git cmake nano libeigen3-dev libgtk-3-dev qt5-default freeglut3-dev libvtk6-qt-dev libtbb-dev \ libjpeg-dev libjasper-dev libpng++-dev libtiff-dev libopenexr-dev libwebp-dev \ libhdf5-dev libopenblas-dev liblapacke-dev \ libpython3.5-dev python-numpy python-scipy python-matplotlib python3-numpy python3-scipy python3-matplotlib && rm -rf /var/lib/apt/lists/* COPY opencv-3.2.0.tar.gz . RUN tar xfvz opencv-3.2.0.tar.gz COPY opencv3.2_build-ubuntu16.04.sh /opencv-3.2.0/ RUN cd opencv-3.2.0 && chmod 777 opencv3.2_build-ubuntu16.04.sh && ./opencv3.2_build-ubuntu16.04.sh && cd build && make -j4 RUN cd opencv-3.2.0/build && make install && ldconfig
イメージのビルド
OpenCVのソースコードを先にダウンロードしてDockerfileと同じディレクトリに入れておきます。異なるバージョン、ファイル名の場合はDockerfileを適宜書き換えてください。また、ビルドオプションはopencv3.2_build-ubuntu16.04.shを参考にしましたが、GpuMatを使うためにcudev等をONにしています。opencv3.2_build-ubuntu16.04.sh
ls ------------------------------ Dockerfile opencv3.2_build-ubuntu16.04.sh opencv-3.2.0.tar.gz ------------------------------
docker build -t opencv_gpu . ------------------------------ Successfully tagged opencv_gpu:latest ------------------------------
起動とOpenCVコードのコンパイル
nvidia-dockerを使います。GPUコードを書かない場合にはdockerで十分です。
起動
nvidia-docker run -it opencv_gpu:latest /bin/bash
コード(GPUコードなし)
//test.cpp
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
int main(int argc, const char* argv[])
{
system("wget https://cvtech.cc/wp-content/uploads/2016/10/sample.jpg");
cv::Mat src = cv::imread("sample.jpg", cv::IMREAD_COLOR);
cv::imwrite("output.jpg", src);
return 0;
}
コンパイルと実行(GPUコードなし)
g++ test.cpp -o test.out `pkg-config --cflags opencv` `pkg-config --libs opencv` -L/usr/local/cuda-8.0/lib64 ./test.out
Dockerのファイル掃除
いろいろ試行錯誤しているうちに余計なファイルが溜まるので、その削除方法です。
docker rm $(docker ps -aq) #すべてのコンテナを削除 docker images | awk '/<none/{print $3}' | xargs docker rmi #タグがnoneになっているimageを削除