官网是有参考文档(https://mmdeploy.readthedocs.io/en/latest/05-supported-backends/openvino.html)的,但是是基于 openvino 2022.3.0 版本,我照着做的时候在模型转换这一步出错,所以我把正确的依赖版本的及操作步骤放上来供参考。
安装 OpenVINO 推理引擎
1. 安装 openvino-runtime python sdk
不要安装官方文档中 2022.3.0 版本,模型转换时会报错:RuntimeError: OpenVINO Model Optimizer is not found or configured improperly(细查是:python -c ‘from openvino._pyopenvino import get_version’ ImportError: /miniconda3/envs/open-mmlab/lib/python3.8/site-packages/openvino/_pyopenvino.cpython-38-x86_64-linux-gnu.so: undefined symbol: _ZN2ov3Any4Base9to_stringEv)。
一般碰到使用第三方库时候未定义的错误提示都首先要考虑版本兼容性问题,所以我放弃了在 2022.3.0 版本的折腾,换成 2023.1.0 版本。
pip install openvino-dev==2023.1.0 -i https://mirrors.aliyun.com/pypi/simple/
2.安装 openvino-runtime
# 由于转换模型失败,所以没有使用官方文档的 2022.3.0 版本
# wget https://storage.openvinotoolkit.org/repositories/openvino/packages/2022.3/linux/l_openvino_toolkit_ubuntu20_2022.3.0.9052.9752fafe8eb_x86_64.tgz
wget https://storage.openvinotoolkit.org/repositories/openvino/packages/2023.1/linux/l_openvino_toolkit_ubuntu20_2023.1.0.12185.47b736f63ed_x86_64.tgz
tar xzf ./l_openvino_toolkit*.tgz
cd l_openvino*
export InferenceEngine_DIR=$pwd/runtime/cmake
bash ./install_dependencies/install_openvino_dependencies.sh
3.配置环境变量
export InferenceEngine_DIR=mmdeploy/openvino/l_openvino_toolkit_ubuntu20_2023.1.0.12185.47b736f63ed_x86_64/runtime/cmake/
4.安装确认,
ldd 输出出现 libopenvino.so.2230 => not found 字样。需要配置环境变量:export LD_LIBRARY_PATH=/mmdeploy/openvino/l_openvino_toolkit_ubuntu20_2023.1.0.12185.47b736f63ed_x86_64/runtime/lib/intel64:$LD_LIBRARY_PATH
ldd /usr/local/lib/libmmdeploy.so
...
libopenvino.so.2230 => /home/chenghj11/mmdeploy/openvino/l_openvino_toolkit_ubuntu20_2022.3.0.9052.9752fafe8eb_x86_64/runtime/lib/intel64/libopenvino.so.2230 (0x00007f7a4b5dc000)
...
编译 mmdeploy
如需编译 openvino 支持,要修改编译参数: -DMMDEPLOY_TARGET_DEVICES=‘cuda;cpu’ -DMMDEPLOY_TARGET_BACKENDS=“trt;ort;openvino” -DInferenceEngine_DIR=${InferenceEngine_DIR}
一下是同时支持 tensorrt 和 openvino 的 cmake 指令
cmake .. \
-DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} \
-DCMAKE_CXX_COMPILER=g++-11 \
-DMMDEPLOY_BUILD_SDK=ON \
-DMMDEPLOY_BUILD_EXAMPLES=ON \
-DMMDEPLOY_BUILD_SDK_PYTHON_API=ON \
-DMMDEPLOY_TARGET_DEVICES="cuda;cpu" \
-DMMDEPLOY_TARGET_BACKENDS="trt;ort;openvino" \
-Dpplcv_DIR=${PPLCV_DIR}/cuda-build/install/lib/cmake/ppl \
-DTENSORRT_DIR=${TENSORRT_DIR} \
-DCUDNN_DIR=${CUDNN_DIR} \
-DONNXRUNTIME_DIR=${ONNXRUNTIME_DIR} \
-DInferenceEngine_DIR=${InferenceEngine_DIR} \
-DCMAKE_VERBOSE_MAKEFILE=ON
模型转换
(略)
推理性能
硬件平台:32核64G,wsl2-ubuntu_20.04
模型:swin transformer 骨干网的 fasterrcnn 模型。
执行命令:nohup ./build/bin/object_detection cpu /openvino/deploy_result /mnt/d/样本/ 2>&1 > openvino-20241114.log &
实验设计:推理了 17320 张样本,平均耗时 843ms。期间有抖动的情况。
均值 标准差
843.8707703 402.9689183
总结
在大部分量化方案都不支持 transformer 骨干网情况下,且没有 nvidia 的场景中 openvino 也是一个选择之一吧。也不是不能用,别用在太实时的场景中就行。