0

0

如何使用c++和ONNX Runtime部署深度学习模型? (AI推理)

冰火之心

冰火之心

发布时间:2026-01-22 12:23:02

|

951人浏览过

|

来源于php中文网

原创

C++可直接调用ONNX Runtime实现高性能轻量部署,需严格匹配模型输入输出名称、shape与dtype,正确管理内存并配置执行提供者与优化选项。

如何使用c++和onnx runtime部署深度学习模型? (ai推理)

可以直接用 C++ 调用 ONNX Runtime 进行模型推理,无需 Python 中转,性能高、部署轻量。关键在于正确加载模型、匹配输入输出张量形状与数据类型,并避免内存生命周期错误。

ONNX Runtime C++ API 初始化和会话创建

必须显式设置 Ort::EnvOrt::SessionOptions,否则默认行为可能触发调试日志或禁用优化。Windows 下若链接失败,大概率是没正确导入 onnxruntime.lib(不是 DLL)或 ABI 不匹配(如 /MD 与 /MT 混用)。

  • Ort::Env 建议用 ORT_LOGGING_LEVEL_WARNING 避免刷屏
  • 启用图优化:调用 session_options.SetGraphOptimizationLevel(ORT_ENABLE_ALL)
  • CUDA 执行提供者需手动注册:OrtSessionOptionsAppendExecutionProvider_CUDA(options, 0),且必须在 Ort::Session 构造前完成
  • Linux 下注意 LD_LIBRARY_PATH 包含 libonnxruntime.so 路径

输入张量构造与内存管理

ONNX Runtime 不接管用户分配的内存,Ort::Value::CreateTensor 的第 4 个参数(data pointer)必须保证在整个 Run() 调用期间有效。常见崩溃源于内存传入或提前 free()

  • 推荐用 std::vector 分配输入数据,再用 .data() 传指针
  • 输入 shape 必须与模型期望完全一致,包括 batch 维度 —— 即使只推一个样本也要是 {1, 3, 224, 224},不能是 {3, 224, 224}
  • 数据排布默认是 NCHW;若模型导出为 NHWC,需在预处理时重排,或用 Ort::Value::CreateTensor 指定 Ort::MemoryInfo::CreateCpu(..., OrtArenaAllocator) 并自行处理 layout
  • 图像归一化必须与训练时一致:例如 (pixel - [123.675, 116.28, 103.53]) / [58.395, 57.12, 57.375],顺序错会导致输出全零

运行推理并读取输出结果

session.Run() 返回的是 std::vector<:value>,每个元素对应一个输出节点。直接调用 .GetTensorData() 得到指针,但必须先确认输出 shape 和数据类型,否则越界读写。

如此AI员工
如此AI员工

国内首个全链路营销获客AI Agent

下载

立即学习C++免费学习笔记(深入)”;

  • output_values[0].GetTensorTypeAndShapeInfo().GetShape() 检查维度,比如分类模型常为 {1, 1000}
  • output_values[0].GetTensorTypeAndShapeInfo().GetElementType() 确认是否为 ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT
  • 不要假设输出名是 "output" —— 查看模型用 netrononnx.shape_inference.infer_shapes() 确认实际 output name
  • 若输出是 int64(如 token ids),需用 .GetTensorData(),混用类型会读出垃圾值
Ort::Session session(env, L"model.onnx", session_options);
std::vector input_names = {"input"};
std::vector output_names = {"output"};

std::vector input_shape = {1, 3, 224, 224}; std::vector input_tensor_values(1 3 224 * 224, 0.0f); // ... 填充 input_tensor_values

auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault); auto input_tensor = Ort::Value::CreateTensor( memory_info, input_tensor_values.data(), input_tensor_values.size(), input_shape.data(), input_shape.size());

auto output_tensors = session.Run( Ort::RunOptions{nullptr}, input_names.data(), &input_tensor, 1, output_names.data(), 1 );

float* output_data = output_tensors[0].GetTensorData(); std::vector output_shape = output_tensors[0].GetTensorTypeAndShapeInfo().GetShape();

最易被忽略的是:模型输入/输出名称、shape、dtype 三者必须与 ONNX 文件定义严格一致,任何一项不匹配都会导致静默错误(如输出全零)或段错误。建议首次部署时用 Python 的 onnxruntime.InferenceSession 同样输入跑一遍,比对输出数值和 shape,再迁移到 C++。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

769

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

661

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

764

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

659

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1345

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

730

2023.08.11

html编辑相关教程合集
html编辑相关教程合集

本专题整合了html编辑相关教程合集,阅读专题下面的文章了解更多详细内容。

38

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.6万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号