Add Intel OpenVINO demo

This demo shows how to run Intel OpenVINO Inference Engine on Occlum inside SGX enclaves
This commit is contained in:
LI Qing 2019-12-04 03:49:43 +00:00 committed by Tate, Hongliang Tian
parent 4ee3396152
commit b9fa937504
7 changed files with 205 additions and 0 deletions

@ -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/).

4
demos/openvino/.gitignore vendored Normal file

@ -0,0 +1,4 @@
deps/
openvino_src/
model/
occlum_context/

29
demos/openvino/README.md Normal file

@ -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
```

@ -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 <TBB/OMP>]"
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

@ -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

@ -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

@ -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