编译参考文档:https://mmdeploy.readthedocs.io/zh-cn/latest/01-how-to-build/linux-x86_64.html
问题现象
编译环境:
- ubuntu 22.04
- gcc/g+±11
- cmake16
- cuda-11.8
- cudnn-linux-x86_64-8.9.6.50
- ppl.cv-0.7.0
- TensorRT-8.6.1.6
- onnxruntime 更换了各种版本(onnxruntime-linux-x64-1.16.1,
onnxruntime-linux-x64-1.8.1, onnxruntime-linux-x64-gpu-1.16.1,
onnxruntime-linux-x64-gpu-1.18.1, onnxruntime-linux-x64-gpu-1.8.1)
编译的时候始终报错:error: ‘CustomOpApi’ in namespace ‘Ort’ does not name a type; 如下图:
大概能确定是找不到 CustomOpApi 的定义,经过全盘搜索 grep -rn “CustomOpApi” *.h | more ,发现该定义位于 ./onnxruntime-linux-x64-1.8.1/include/onnxruntime_cxx_inline.h, ./onnxruntime-linux-x64-gpu-1.8.1/include/onnxruntime_cxx_inline.h 头文件中。
原来是我参考了 ONNX Runtime built with cuDNN 8.x are not compatible with cuDNN 9.x. 说明将 onnxruntime 的版本升级成 1.18.1 了,导致找不到 CustomOpApi 这个类的定义。
所有这里有一个坑:
mmdeploy 官方文档源码编译依赖的 onnxruntime-1.8.1 只兼容 CUDA-11.0.3 和
cnDNN-8.0.4,而我的编译环境 CUDA-11.8 和 cnDNN-8.9 要求使用 onnxruntime-1.18。
还不确定真实使用 onnxruntime 推理引擎时候会不会有问题。
解决办法
配置环境变量,编译 mmdeploy 源码时使用 onnxruntime-1.8.1 版本依赖即可。
export ONNXRUNTIME_DIR=path/to/onnxruntime-1.8.1
tricks: cmake 输出 gcc/g++ 编译明细的配置参数
一般情况下 cmake 不会输出 gcc/g++ 编译命令,及详细参数的,但是这些参数非常有助于检查详细参数(如:头文件和依赖库是否配置正确、完善),进而排查编译问题。包括以下两个步骤:
1. cmake 生成 MakeFile :增加 -DCMAKE_VERBOSE_MAKEFILE=ON
rm -rf build && mkdir -p build && cd build
cmake .. \
-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" \
-Dpplcv_DIR=${PPLCV_DIR}/cuda-build/install/lib/cmake/ppl \
-DTENSORRT_DIR=${TENSORRT_DIR} \
-DCUDNN_DIR=${CUDNN_DIR} \
-DONNXRUNTIME_DIR=${ONNXRUNTIME_DIR} \
-DCMAKE_VERBOSE_MAKEFILE=ON
2. 编译:增加 VERBOSE=1 参数
cmake --build . -- -j$(nproc) VERBOSE=1
配置好之后编译时会输出以下详细信息啦:
(-isystem 参数有助于抑制使用尖括号引用的第三方头文件带来的编译警告)
cd /home/chenghj11/mmdeploy/mmdeploy/build-ort/csrc/mmdeploy/backend_ops/onnxruntime && /usr/bin/g++-11 -DMMDEPLOY_API_EXPORTS=1 -I/home/chenghj11/mmdeploy/mmdeploy/csrc/mmdeploy/backend_ops/onnxruntime/common -I/home/chenghj11/mmdeploy/mmdeploy/csrc/mmdeploy/backend_ops/onnxruntime/../common -I/home/chenghj11/mmdeploy/mmdeploy/csrc -isystem /home/chenghj11/mmdeploy/onnxruntime-linux-x64-gpu-1.8.1/include -O3 -fPIC -fvisibility=hidden -std=gnu++14 -MD -MT csrc/mmdeploy/backend_ops/onnxruntime/CMakeFiles/mmdeploy_onnxruntime_ops_obj.dir/onnxruntime_register.cpp.o -MF CMakeFiles/mmdeploy_onnxruntime_ops_obj.dir/onnxruntime_register.cpp.o.d -o CMakeFiles/mmdeploy_onnxruntime_ops_obj.dir/onnxruntime_register.cpp.o -c /home/chenghj11/mmdeploy/mmdeploy/csrc/mmdeploy/backend_ops/onnxruntime/onnxruntime_register.cpp