From b9fa937504ad77f93ec2ffff10dc9c30aa3eaf1c Mon Sep 17 00:00:00 2001 From: LI Qing Date: Wed, 4 Dec 2019 03:49:43 +0000 Subject: [PATCH] Add Intel OpenVINO demo This demo shows how to run Intel OpenVINO Inference Engine on Occlum inside SGX enclaves --- demos/README.md | 1 + demos/openvino/.gitignore | 4 + demos/openvino/README.md | 29 +++++ demos/openvino/download_and_build_openvino.sh | 119 ++++++++++++++++++ demos/openvino/download_openvino_model.sh | 7 ++ demos/openvino/install_cmake.sh | 8 ++ demos/openvino/run_benchmark_on_occlum.sh | 37 ++++++ 7 files changed, 205 insertions(+) create mode 100644 demos/openvino/.gitignore create mode 100644 demos/openvino/README.md create mode 100755 demos/openvino/download_and_build_openvino.sh create mode 100755 demos/openvino/download_openvino_model.sh create mode 100755 demos/openvino/install_cmake.sh create mode 100755 demos/openvino/run_benchmark_on_occlum.sh diff --git a/demos/README.md b/demos/README.md index 3a71ae15..78a2daab 100644 --- a/demos/README.md +++ b/demos/README.md @@ -6,5 +6,6 @@ This directory contains sample projects that demonstrate how Occlum can be used * `hello_cc/`: A sample C++ project built with Makefile/CMake. * `hello_bazel/`: A sample C++ project built with [Bazel](https://bazel.build). * `https_server/`: A HTTPS file server based on [Mongoose Embedded Web Server Library](https://github.com/cesanta/mongoose). +* `openvino/` A benchmark of [OpenVINO Inference Engine](https://docs.openvinotoolkit.org/2019_R3/_docs_IE_DG_inference_engine_intro.html). * `tensorflow_lite/`: A demo and benchmark of [Tensorflow Lite](https://www.tensorflow.org/lite) inference engine. * `xgboost/`: A demo of [XGBoost](https://xgboost.readthedocs.io/en/latest/). diff --git a/demos/openvino/.gitignore b/demos/openvino/.gitignore new file mode 100644 index 00000000..b3032582 --- /dev/null +++ b/demos/openvino/.gitignore @@ -0,0 +1,4 @@ +deps/ +openvino_src/ +model/ +occlum_context/ diff --git a/demos/openvino/README.md b/demos/openvino/README.md new file mode 100644 index 00000000..6cff1f83 --- /dev/null +++ b/demos/openvino/README.md @@ -0,0 +1,29 @@ +# Use OpenVINO Inference Engine in SGX with Occlum + +This project demonstrates how Occlum enables [OpenVINO](https://github.com/opencv/dldt) in SGX enclaves. + +Step 1: Install CMake(3.15.5), because OpenVINO depends on a newer version of CMake +``` +./install_cmake.sh +``` + +Step 2: Download OpenVINO and build the Inference Engine, it will also download and install OpenCV +``` +./download_and_build_openvino.sh +``` +When completed, the resulting OpenVINO can be found in `openvino_src` directory. Threading Building Blocks (TBB) is used by default. To use OpenMP, add option `--threading OMP` when invoking the script above. + +Step 3: Download the example of OpenVINO models from [01.org](https://download.01.org/opencv/) +``` +./download_openvino_model.sh +``` + +Step 4: Run OpenVINO Inference Engine benchmark app inside SGX enclave with Occlum +``` +./run_benchmark_on_occlum.sh +``` + +Step 5 (Optional): Run OpenVINO Inference Engine benchmark app in Linux +``` +./openvino_src/inference-engine/bin/intel64/Release/benchmark_app -m ./model/age-gender-recognition-retail-0013.xml +``` diff --git a/demos/openvino/download_and_build_openvino.sh b/demos/openvino/download_and_build_openvino.sh new file mode 100755 index 00000000..875b0979 --- /dev/null +++ b/demos/openvino/download_and_build_openvino.sh @@ -0,0 +1,119 @@ +#!/bin/bash +PREFIX=/usr/local/occlum/x86_64-linux-musl +THREADING=TBB +set -e + +show_usage() { + echo + echo "Usage: $0 [--threading ]" + echo + exit 1 +} + +build_opencv() { + rm -rf deps/zlib && mkdir -p deps/zlib + pushd deps/zlib + git clone https://github.com/madler/zlib . + CC=occlum-gcc CXX=occlum-g++ ./configure --prefix=$PREFIX + make + sudo make install + popd + + rm -rf deps/opencv && mkdir -p deps/opencv + pushd deps/opencv + git clone https://github.com/opencv/opencv . + git checkout tags/4.1.0 -b 4.1.0 + mkdir build + cd build + cmake ../ \ + -DCMAKE_BUILD_TYPE=RELEASE \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_C_COMPILER=occlum-gcc -DCMAKE_CXX_COMPILER=occlum-g++ \ + -DENABLE_PRECOMPILED_HEADERS=OFF \ + -DOPENCV_PC_FILE_NAME=opencv.pc \ + -DOPENCV_GENERATE_PKGCONFIG=ON \ + -DBUILD_opencv_java=OFF -DBUILD_JAVA_SUPPORT=OFF \ + -DBUILD_opencv_python=OFF -DBUILD_PYTHON_SUPPORT=OFF \ + -DBUILD_EXAMPLES=OFF -DWITH_FFMPEG=OFF \ + -DWITH_QT=OFF -DWITH_CUDA=OFF + make -j + sudo make install + popd +} + +build_tbb() { + rm -rf deps/tbb_cmake && mkdir -p deps/tbb_cmake + pushd deps/tbb_cmake + git clone https://github.com/wjakob/tbb . + git checkout 344fa84f34089681732a54f5def93a30a3056ab9 + mkdir cmake_build && cd cmake_build + cmake ../ \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_COMPILER=occlum-g++ -DCMAKE_C_COMPILER=occlum-gcc \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DTBB_BUILD_TESTS=OFF \ + -DTBB_BUILD_TBBMALLOC_PROXY=OFF + make + sudo make install + popd +} + +# Build OpenVINO +build_openvino() { + rm -rf openvino_src && mkdir openvino_src + pushd openvino_src + git clone https://github.com/opencv/dldt . + git checkout tags/2019_R3 -b 2019_R3 + cd inference-engine + git submodule init + git submodule update --recursive + mkdir build && cd build +# Substitute THREADING lib + cmake ../ \ + -DTHREADING=$THREADING \ + -DENABLE_MKL_DNN=ON \ + -DENABLE_CLDNN=OFF \ + -DENABLE_MYRIAD=OFF \ + -DENABLE_GNA=OFF + [ "$THREADING" == "OMP" ] && rm -rf ../temp/omp/lib/* && cp $PREFIX/lib/libgomp.so ../temp/omp/lib/libiomp5.so + [ "$THREADING" == "TBB" ] && rm -rf ../temp/tbb/lib/* && cp $PREFIX/lib/libtbb.so ../temp/tbb/lib && cp $PREFIX/lib/libtbbmalloc.so ../temp/tbb/lib + cd ../ + rm -rf build && mkdir build && cd build +# Substitute OpenCV + export OpenCV_DIR=$PREFIX/lib/cmake/opencv4 + cmake ../ \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_COMPILER=occlum-g++ -DCMAKE_CXX_FLAGS="-Wno-error=stringop-overflow=" \ + -DCMAKE_C_COMPILER=occlum-gcc -DCMAKE_C_FLAGS="-Wno-error=stringop-overflow=" \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DTHREADING=$THREADING \ + -DENABLE_MKL_DNN=ON \ + -DENABLE_CLDNN=OFF \ + -DENABLE_OPENCV=OFF \ + -DENABLE_MYRIAD=OFF \ + -DENABLE_GNA=OFF + make -j4 + popd +} + +while [ -n "$1" ]; do + case "$1" in + --threading) [ -n "$2" ] && THREADING=$2 ; shift 2 || show_usage ;; + *) + show_usage + esac +done + +if [ "$THREADING" == "TBB" ] ; then + echo "Build OpenVINO with TBB threading" + build_opencv + build_tbb + build_openvino +elif [ "$THREADING" == "OMP" ] ; then + echo "Build OpenVINO with OpenMP threading" + build_opencv + build_openvino +else + echo "Error: invalid threading: $THREADING" + show_usage +fi diff --git a/demos/openvino/download_openvino_model.sh b/demos/openvino/download_openvino_model.sh new file mode 100755 index 00000000..34ff4546 --- /dev/null +++ b/demos/openvino/download_openvino_model.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -e + +rm -rf model && mkdir model +cd model +wget https://download.01.org/opencv/2019/open_model_zoo/R3/20190905_163000_models_bin/age-gender-recognition-retail-0013/FP32/age-gender-recognition-retail-0013.bin +wget https://download.01.org/opencv/2019/open_model_zoo/R3/20190905_163000_models_bin/age-gender-recognition-retail-0013/FP32/age-gender-recognition-retail-0013.xml diff --git a/demos/openvino/install_cmake.sh b/demos/openvino/install_cmake.sh new file mode 100755 index 00000000..1f7bd112 --- /dev/null +++ b/demos/openvino/install_cmake.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -e +cd ~ +wget https://github.com/Kitware/CMake/releases/download/v3.15.5/cmake-3.15.5.tar.gz && tar xf cmake-3.15.5.tar.gz +cd cmake-3.15.5 +./bootstrap +make -j +sudo make install diff --git a/demos/openvino/run_benchmark_on_occlum.sh b/demos/openvino/run_benchmark_on_occlum.sh new file mode 100755 index 00000000..fc2104e0 --- /dev/null +++ b/demos/openvino/run_benchmark_on_occlum.sh @@ -0,0 +1,37 @@ +#!/bin/bash +benchmark=benchmark_app +inference_bin=openvino_src/inference-engine/bin/intel64/Release +occlum_lib=/usr/local/occlum/x86_64-linux-musl/lib +set -e + +# 1. Init Occlum Workspace +rm -rf occlum_context +mkdir occlum_context +cd occlum_context +occlum init +jq '.process.default_mmap_size = "192MB"' Occlum.json > temp_Occlum.json +mv temp_Occlum.json Occlum.json + +# 2. Copy files into Occlum Workspace and Build +cp ../$inference_bin/$benchmark image/bin +cp ../$inference_bin/lib/libinference_engine.so image/lib +cp ../$inference_bin/lib/libformat_reader.so image/lib +cp ../$inference_bin/lib/libcpu_extension.so image/lib +cp ../$inference_bin/lib/libHeteroPlugin.so image/lib +cp ../$inference_bin/lib/libMKLDNNPlugin.so image/lib +cp ../$inference_bin/lib/plugins.xml image/lib +cp $occlum_lib/libopencv_imgcodecs.so.4.1 image/lib +cp $occlum_lib/libopencv_imgproc.so.4.1 image/lib +cp $occlum_lib/libopencv_core.so.4.1 image/lib +cp $occlum_lib/libopencv_videoio.so.4.1 image/lib +cp $occlum_lib/libz.so.1 image/lib +[ -e $occlum_lib/libtbb.so ] && cp $occlum_lib/libtbb.so image/lib +[ -e $occlum_lib/libtbbmalloc.so ] && cp $occlum_lib/libtbbmalloc.so image/lib +mkdir image/proc +cp /proc/cpuinfo image/proc +mkdir image/model +cp -r ../model/* image/model +occlum build + +# 3. Run benchmark +occlum run /bin/$benchmark -m /model/age-gender-recognition-retail-0013.xml