自定义 bert 在 onnxruntime 推理错误:TypeError: run(): incompatible function arguments

本文讲述了如何处理在使用自定义BERT模型进行ONNXRuntime推理时遇到的TypeError,关键在于将PyTorchTensor转换为numpy数组以适应运行要求。
部署运行你感兴趣的模型镜像

自定义 bert 在 onnxruntime 推理错误:TypeError: run(): incompatible function arguments

推理代码

    # text embedding
    toks = self.tokenizer([text])
    if self.debug:
        print('toks', toks)

    text_embed = self.text_model_session.run(output_names=['output'], input_feed=toks)

错误提示

Traceback (most recent call last):
  File "/xx/workspace/model/test_onnx.py", line 90, in <module>
    res = inferencer.inference(text, img_path)
  File "/xx/workspace/model/test_onnx.py", line 58, in inference
    text_embed = self.text_model_session.run(output_names=['output'], input_feed=toks)
  File "/xx/miniconda3/envs/py39/lib/python3.9/site-packages/onnxruntime/capi/onnxruntime_inference_collection.py", line 220, in run
    return self._sess.run(output_names, input_feed, run_options)
TypeError: run(): incompatible function arguments. The following argument types are supported:
    1. (self: onnxruntime.capi.onnxruntime_pybind11_state.InferenceSession, arg0: List[str], arg1: Dict[str, object], arg2: onnxruntime.capi.onnxruntime_pybind11_state.RunOptions) -> List[object]

Invoked with: <onnxruntime.capi.onnxruntime_pybind11_state.InferenceSession object at 0x7f975ded1570>, ['output'], {'input_ids': array([[ 101, 3899,  102]]), 'token_type_ids': array([[0, 0, 0]]), 'attention_mask': array([[1, 1, 1]])}, None

核心错误

TypeError: run(): incompatible function arguments. The following argument types are supported:
    1. (self: onnxruntime.capi.onnxruntime_pybind11_state.InferenceSession, arg0: List[str], arg1: Dict[str, object], arg2: onnxruntime.capi.onnxruntime_pybind11_state.RunOptions) -> List[object]

解决方法

核对参数

arg0: List[str]
arg1: Dict[str, object]

对应的参数

output_names=['output'], input_feed=toks

arg0=[‘output’] 参数类型正确
arg1=toks 表面看参数也正常,打印看看toks的每个值的类型

type(toks[‘input_ids’]) 输出为 <class ‘torch.Tensor’>, 实际需要输入类型为 <class ‘numpy.ndarray’>

修改代码

    # text embedding
    toks = self.tokenizer([text])
    if self.debug:
        print('toks', toks)
    
    text_input = {}
    text_input['input_ids'] = toks['input_ids'].numpy()
    text_input['token_type_ids'] = toks['token_type_ids'].numpy()
    text_input['attention_mask'] = toks['attention_mask'].numpy()
    text_embed = self.text_model_session.run(output_names=['output'], input_feed=text_input)

再次执行代码,正常运行,无报错!!

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>好的,用户需要关于在C++中使用ONNXRuntime进行推理的教程或示例代码。首先,我应该回顾一下之前提供的引用内容,看看有哪些相关的资料可以整合。 引用[1]提到了VS环境下配置ONNXRuntime,以及模型输入的问题,这可能涉及到环境配置和内存管理的注意事项。引用[2]中的YOLOv8示例代码展示了如何加载模型并进行目标检测,这个代码结构可以作为参考。引用[3]和[4]讨论了TensorRT EP的配置和内存模式优化的问题,这些都是高级配置的要点。 用户可能需要的步骤包括环境配置、模型加载、输入输出处理、推理执行以及性能优化。需要确保示例代码正确使用ONNXRuntime的C++ API,并且涵盖常见问题,比如内存泄漏和提供者配置。 另外,用户可能关心如何转换模型到ONNX格式,但问题主要集中在C++推理部分。需要强调步骤的清晰性,比如包含必要的头文件、初始化环境、创建会话、准备输入输出张量等。 还需要注意代码中的错误处理,比如检查状态返回值,以及资源释放,避免内存泄漏。同时,引用[4]提到的DisableMemPattern可能在特定情况下需要设置,特别是在使用DirectML等执行提供程序时,需要提及这一点作为最佳实践。 最后,生成相关问题时要覆盖用户可能进一步的需求,比如性能优化、多线程处理、不同执行提供者的比较,以及实际应用案例。确保回答结构清晰,分步骤说明,并引用相关的资料来增强可信度。</think>以下是为您整理的ONNXRuntime C++推理开发完整指南,包含关键步骤和代码示例: ### 一、环境配置(Windows示例) 1. 下载预编译包:访问[ONNXRuntime GitHub Release](https://github.com/microsoft/onnxruntime/releases) 2. 选择与CUDA版本匹配的包(如onnxruntime-win-gpu-x64-1.15.1.zip) 3. VS项目配置: ```cpp // 包含目录添加 $(ONNXRUNTIME_ROOT)/include // 库目录添加 $(ONNXRUNTIME_ROOT)/lib // 附加依赖项 onnxruntime.lib ``` ### 二、基础推理流程代码 ```cpp #include <onnxruntime_cxx_api.h> int main() { // 1. 初始化环境 Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test"); Ort::SessionOptions session_options; // 启用CUDA执行提供者(需安装CUDA) Ort::ThrowOnError(OrtSessionOptionsAppendExecutionProvider_CUDA(session_options, 0)); // 2. 加载模型 Ort::Session session(env, L"model.onnx", session_options); // 3. 准备输入 std::vector<int64_t> input_shape = {1, 3, 224, 224}; std::vector<float> input_data(1*3*224*224, 0.5f); // 示例数据 Ort::MemoryInfo memory_info = Ort::MemoryInfo::CreateCpu( OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault); Ort::Value input_tensor = Ort::Value::CreateTensor<float>( memory_info, input_data.data(), input_data.size(), input_shape.data(), input_shape.size()); // 4. 执行推理 const char* input_names[] = {"input"}; const char* output_names[] = {"output"}; auto outputs = session.Run(Ort::RunOptions{nullptr}, input_names, &input_tensor, 1, output_names, 1); // 5. 处理输出 float* output_ptr = outputs[0].GetTensorMutableData<float>(); // 解析输出数据... } ``` ### 三、关键问题解决方案 1. **内存泄漏预防**: ```cpp // 使用Ort::Allocator进行内存管理 Ort::AllocatorWithDefaultOptions allocator; char* input_name = session.GetInputName(0, allocator); // 使用后需要释放 allocator.Free(input_name); ``` 2. **多线程优化**: ```cpp session_options.SetIntraOpNumThreads(4); // 设置运算线程数 session_options.SetInterOpNumThreads(2); // 设置并行操作数 ``` 3. **动态输入处理**: ```cpp // 获取输入维度信息 auto input_dims = session.GetInputTypeInfo(0).GetTensorTypeAndShapeInfo().GetShape(); // 处理动态维度(-1) if (input_dims[0] == -1) { input_dims[0] = 1; // 设置batch size为1 } ``` ### 四、性能优化技巧 1. **启用TensorRT加速**: ```cpp OrtTensorRTProviderOptionsV2* trt_options = nullptr; Ort::ThrowOnError(OrtSessionOptionsAppendExecutionProvider_TensorRT_V2( session_options, trt_options)); ``` 2. **内存模式优化**: ```cpp session_options.DisableMemPattern(); // 适用于DirectML等特殊EP[^4] session_options.EnableCpuMemArena(); // 启用CPU内存池 ``` ### 五、典型应用场景 1. **图像分类**:使用ResNet等分类模型 2. **目标检测**:YOLO系列模型部署(参考示例代码[^2]) 3. **自然语言处理**:BERT等Transformer模型推理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

szZack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值