解决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

(完成)

 

posted @ 2025-12-18 15:10  大师兄啊哈  阅读(34)  评论(0)    收藏  举报