クラウドエンジニアのノート

情報技術系全般,自分用メモを公開してます。

SingularityコンテナでOpenCV+Boostを使ったC++コードをコンパイル

はじめに

研究でC++コードをpybind11を使ってPythonから呼んで強化学習をしています.

強化学習GPU上で回したくなったのですが,残念ながらC++系ライブラリを導入するためのsudo権限が付与されておらず,サーバ上でC++コードが実行できません.

そこで,Singularityコンテナ上でビルド&実行までできる環境を作成して,そのままGPUを使った強化学習を行えるようにします.

コンテナ作成

作成したビルド&強化学習に必要な環境

  • Ninja build
  • OpenCV 3.4.6
  • Boost 1.65
  • Pipenv
  • python
  • VLC(動画出力するため)

実行方法は2つあります

  • Singularity Libraryからpull
  • .defファイルからローカルでbuild

Singularity Libraryからpull

Singularity Library(SyLabs)にコンテナを公開しました

cloud.sylabs.io

以下のコードでビルドできると思います

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の詳しい使い方は以下の記事を参考にしてください

tmyoda.hatenablog.com

.defファイル

注意点

  • DockerHubで公開されている,/consol/ubuntu-xfce-vnc を使用したかったのですが,のubuntuバージョンが16.04までだったので,18.04に対応させたdocker container(tmyoda/ubuntu-xfce-vnc:18.04)を作成し,DockerHubに上げたものをベースに作成しています.

  • 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