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