SingularityコンテナでOpenCV+Boostを使ったC++コードをコンパイル
はじめに
研究でC++コードをpybind11を使ってPythonから呼んで強化学習をしています.
強化学習をGPU上で回したくなったのですが,残念ながらC++系ライブラリを導入するためのsudo権限が付与されておらず,サーバ上でC++コードが実行できません.
そこで,Singularityコンテナ上でビルド&実行までできる環境を作成して,そのままGPUを使った強化学習を行えるようにします.
コンテナ作成
作成したビルド&強化学習に必要な環境
実行方法は2つあります
- Singularity Libraryからpull
- .defファイルからローカルでbuild
Singularity Libraryからpull
Singularity Library(SyLabs)にコンテナを公開しました
以下のコードでビルドできると思います
singularity pull library://tmyoda/default/headless-ubuntu-xfce-pipenv-opencv-boost singularity build --sandbox cpp_vnc headless-ubuntu-xfce-pipenv-opencv-boost.sif
実行方法は以下の通りです
singularity instance start -w cpp_vnc xfce singularity start -w instance://xfce
Singularityの詳しい使い方は以下の記事を参考にしてください
.defファイル
注意点
DockerHubで公開されている,
/consol/ubuntu-xfce-vncを使用したかったのですが,のubuntuバージョンが16.04までだったので,18.04に対応させたdocker container(tmyoda/ubuntu-xfce-vnc:18.04)を作成し,DockerHubに上げたものをベースに作成しています.- 以下記事参照 tmyoda.hatenablog.com
OpenCVは動画生成したかったので,その辺のオプション有効にしてます
Bootstrap: docker
From: tmyoda/ubuntu18-xfce-vnc:latest
%environment
export LC_ALL=C.UTF-8
export Lang=C.UTF-8
export PIPENV_VENV_IN_PROJECT=1
export PATH="/usr/local/opt/openssl/bin:$PATH"
# pipenv property
export PIPENV_VENV_IN_PROJECT=1
export PIPENV_SKIP_LOCK=1
%post
apt update
# for jupyter and pipenv
apt install -y bzip2 ca-certificates curl git ffmpeg openssl libssl-dev \
libsqlite3-dev libreadline6-dev libbz2-dev libssl-dev libsqlite3-dev libncursesw5-dev \
libffi-dev libdb-dev libexpat1-dev zlib1g-dev liblzma-dev libgdbm-dev libmpdec-dev \
vim-tiny build-essential inkscape jed libsm6 libxext-dev libxrender1 lmodern netcat tzdata unzip \
wget build-essential gcc zlib1g-dev python3-distutils vlc bash-completion
# pip
curl -kL https://bootstrap.pypa.io/get-pip.py | python3
# pipenv
pip3 install virtualenv
pip3 install pipenv
apt install -y \
libboost1.65-all-dev libboost1.65-dev libboost1.65-tools-dev ninja-build ccache \
libncurses5-dev libavutil-dev libavcodec-dev libavfilter-dev libavformat-dev libavdevice-dev ffmpeg pkg-config \
cmake libgtk-3-dev libjpeg-dev
# opencv3.4.6
wget https://github.com/opencv/opencv/archive/3.4.6.tar.gz
tar zxvf 3.4.6.tar.gz
cd opencv-3.4.6
export SOURCE_DIR="../"
export BUILD_DIR="/build"
export GENERATOR_NAME="Unix Makefiles"
# build opencv
mkdir build
cd build
cmake \
-G "${GENERATOR_NAME}" \
--build ${BUILD_DIR} \
-D BUILD_CUDA_STUBS=OFF \
-D BUILD_DOCS=OFF \
-D BUILD_EXAMPLES=OFF \
-D BUILD_JASPER=OFF \
-D BUILD_JPEG=ON \
-D BUILD_OPENEXR=OFF \
-D BUILD_PACKAGE=ON \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_PNG=ON \
-D BUILD_SHARED_LIBS=ON \
-D BUILD_TBB=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_TIFF=OFF \
-D BUILD_WITH_DEBUG_INFO=ON \
-D BUILD_ZLIB=OFF \
-D BUILD_WEBP=OFF \
-D BUILD_opencv_apps=ON \
-D BUILD_opencv_calib3d=ON \
-D BUILD_opencv_core=ON \
-D BUILD_opencv_cudaarithm=OFF \
-D BUILD_opencv_cudabgsegm=OFF \
-D BUILD_opencv_cudacodec=OFF \
-D BUILD_opencv_cudafeatures2d=OFF \
-D BUILD_opencv_cudafilters=OFF \
-D BUILD_opencv_cudaimgproc=OFF \
-D BUILD_opencv_cudalegacy=OFF \
-D BUILD_opencv_cudaobjdetect=OFF \
-D BUILD_opencv_cudaoptflow=OFF \
-D BUILD_opencv_cudastereo=OFF \
-D BUILD_opencv_cudawarping=OFF \
-D BUILD_opencv_cudev=OFF \
-D BUILD_opencv_features2d=ON \
-D BUILD_opencv_flann=ON \
-D BUILD_opencv_highgui=ON \
-D BUILD_opencv_imgcodecs=ON \
-D BUILD_opencv_imgproc=ON \
-D BUILD_opencv_java=OFF \
-D BUILD_opencv_ml=ON \
-D BUILD_opencv_objdetect=ON \
-D BUILD_opencv_photo=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_shape=ON \
-D BUILD_opencv_stitching=ON \
-D BUILD_opencv_superres=ON \
-D BUILD_opencv_ts=ON \
-D BUILD_opencv_video=ON \
-D BUILD_opencv_videoio=ON \
-D BUILD_opencv_videostab=ON \
-D BUILD_opencv_viz=OFF \
-D BUILD_opencv_world=OFF \
-D CMAKE_BUILD_TYPE=RELEASE \
-D WITH_1394=ON \
-D WITH_CUBLAS=OFF \
-D WITH_CUDA=OFF \
-D WITH_CUFFT=OFF \
-D WITH_EIGEN=ON \
-D WITH_FFMPEG=ON \
-D WITH_GDAL=OFF \
-D WITH_GPHOTO2=OFF \
-D WITH_GIGEAPI=ON \
-D WITH_GSTREAMER=ON \
-D WITH_GTK=ON \
-D WITH_INTELPERC=OFF \
-D WITH_IPP=ON \
-D WITH_IPP_A=OFF \
-D WITH_JASPER=ON \
-D WITH_JPEG=ON \
-D WITH_LIBV4L=ON \
-D WITH_OPENCL=ON \
-D WITH_OPENCLAMDBLAS=OFF \
-D WITH_OPENCLAMDFFT=OFF \
-D WITH_OPENCL_SVM=OFF \
-D WITH_OPENEXR=ON \
-D WITH_OPENGL=ON \
-D WITH_OPENMP=OFF \
-D WITH_OPENNI=OFF \
-D WITH_PNG=ON \
-D WITH_PTHREADS_PF=OFF \
-D WITH_PVAPI=ON \
-D WITH_QT=OFF \
-D WITH_TBB=ON \
-D WITH_TIFF=ON \
-D WITH_UNICAP=OFF \
-D WITH_V4L=OFF \
-D WITH_VTK=OFF \
-D WITH_WEBP=ON \
-D WITH_XIMEA=OFF \
-D WITH_XINE=OFF \
${SOURCE_DIR}
make -j8
make install
echo /usr/local/lib > /etc/ld.so.conf.d/opencv.conf
ldconfig -v
# clean up
apt clean
rm -rf /var/lib/apt/lists/*
%labels
Author tmyoda
Version v0.0.3