解决onnxruntime运行mmdeploy导出的onnx模型报FAIL : Load model from xxx.onnx failed:Fatal error: mmdeploy:grid_sampler(-1) is not a registered function/op
1. 环境
系统:
mmdeploy-mmdet:ubuntu20.04-cuda11.8-mmdeploy1.3.1 docker镜像。
相关软件:
mmdetection 3.3.0
mmdeploy 1.3.1
onnx 1.13.1
onnxruntime-gpu 1.15.1
转换模型:
Co-DETR,使用co_dino_5scale_r50_8xb2_1x_coco.py模型配置。
2. 问题
利用mmdeploy将codetr模型导出后,使用onnxruntime框架运行模型,代码如下:
import onnxruntime import numpy as np onnx_file = r"work_dir/xxx/onnx/best_coco_bbox_mAP_epoch_12.onnx" input = np.random.randn(1,3,480,480).astype(np.float32) sess = onnxruntime.InferenceSession(onnx_file, providers=['CUDAExecutionProvider', 'CPUExecutionProvider']) dets,labels = sess.run(['dets', 'labels'], {'input': input})
报错:
FAIL : Load model from end2end.onnx failed:Fatal error: mmdeploy:grid_sampler(-1) is not a registered function/op
这是因为codetr模型使用了mmdeploy的自定义算子grid_sampler,需要在使用的时候先导入自定义算子。
3. 解决
首先,因为加载自定义算子库,需要使用onnxruntime的C++库,因此需要先找到C++ onnxruntime 的共享库libonnxruntime.so,官方镜像是放在:/root/workspace/onnxruntime-linux-x64-gpu-1.15.1/lib。注意,这个so文件来自onnxruntime的C++库,
mmdeploy项目直接是下载官方已经编译打包好的项目,参考:install_onnxruntime.sh。
然后,找到mmdeploy项目安装编译后的算子库libmmdeploy_onnxruntime_ops.so,官方镜像是放在/root/workspace/mmdeploy/build/lib。
确认 mmdeploy 的 onnxruntime 版本一致(非常关键):
strings libmmdeploy_onnxruntime_ops.so | grep onnxruntime
看看这个包的编译依赖的版本是否与当前使用的onnxruntime版本一致:
import onnxruntime print(onnxruntime.__version__)
确认无误后将这两个目录加入到中:
export LD_LIBRARY_PATH=/root/workspace/onnxruntime-linux-x64-gpu-1.15.1/lib:/root/workspace/mmdeploy/build/lib:$LD_LIBRARY_PATH
也可以在启动容器的时候作为环境参数传入:
-e LD_LIBRARY_PATH=/root/workspace/onnxruntime-linux-x64-gpu-1.15.1/lib:/root/workspace/mmdeploy/build/lib:$LD_LIBRARY_PATH
修改推理代码:
import onnxruntime import numpy as np onnx_file = r"work_dir/yourpath/best_coco_bbox_mAP_epoch_12.onnx" mmdeploy_ops_lib = r"/root/workspace/mmdeploy/mmdeploy/lib/libmmdeploy_onnxruntime_ops.so" session_options = onnxruntime.SessionOptions() session_options.register_custom_ops_library(mmdeploy_ops_lib)
input = np.random.randn(1,3,480,480).astype(np.float32) sess = onnxruntime.InferenceSession(onnx_file, session_options, providers=['CUDAExecutionProvider', 'CPUExecutionProvider']) dets,labels = sess.run(['dets', 'labels'], {'input': input})
这样就解决了mmdeploy自定义算子无法运行的问题。
4. 参考
[1] https://github.com/open-mmlab/mmdeploy/issues/2377
(完成)

浙公网安备 33010602011771号