首页 > 后端开发 > C++ > 正文

c++如何实现一个简单的神经网络推理框架_c++ ONNX Runtime集成【AI】

尼克
发布: 2025-12-15 14:25:39
原创
491人浏览过
推荐集成ONNX Runtime而非手写推理框架,因其专为高效推理设计,支持多硬件后端、量化、图优化及原生C++ API,只需加载ONNX模型并执行推理即可。

c++如何实现一个简单的神经网络推理框架_c++ onnx runtime集成【ai】

用 C++ 实现一个“从零开始”的完整神经网络推理框架工程量大、易出错,不推荐;实际项目中更高效可靠的做法是集成成熟推理引擎——ONNX Runtime 是目前最主流、跨平台、高性能且对 C++ 友好的选择。

为什么选 ONNX Runtime 而不是手写?

它不是模型训练框架,而是专为**高效推理**设计的运行时:支持 CPU/GPU(CUDA / DirectML / Vulkan)、量化、图优化、多线程、内存复用,并原生提供稳定 C++ API。你只需加载 ONNX 模型(由 PyTorch/TensorFlow 导出),喂入数据,拿到输出,无需管理张量内存、算子实现或调度逻辑。

快速集成步骤(Windows/Linux/macOS 通用)

前提:已有一个导出好的 .onnx 模型(例如 resnet18.onnx)

  • 下载预编译库:访问 ONNX Runtime 官方 Release 页面,选对应系统和硬件后端(如 onnxruntime-win-x64-gpu-1.18.0.zip)
  • 解压后,将 include/ 头文件目录和 lib/onnxruntime.lib(Windows)或 lib/libonnxruntime.so(Linux)加入你的 C++ 工程
  • 链接时添加 onnxruntime 库,启用 C++17(必需)
  • 代码结构精简清晰:环境 → 会话 → 输入/输出绑定 → 运行

C++ 核心调用示例(无 OpenCV 依赖,纯推理)

以下是最小可运行片段(省略错误检查,实际需加 try/catch 和 status 判空):

Docky AI
Docky AI

多合一AI浏览器助手,解答问题、绘制图片、阅读文档、强化搜索结果、辅助创作

Docky AI 100
查看详情 Docky AI

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

// 1. 创建环境(全局一次)
Ort::Env env{ORT_LOGGING_LEVEL_WARNING, "test"};
<p>// 2. 配置会话选项(可启用 graph optimization / intra-op thread pool)
Ort::SessionOptions session_options;
session_options.SetIntraOpNumThreads(4);
session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL);</p><p>// 3. 创建会话(加载模型)
Ort::Session session{env, L"resnet18.onnx", session_options};</p><p>// 4. 获取输入输出信息(用于分配内存和校验 shape)
auto input_node_names = session.GetInputNames();
auto output_node_names = session.GetOutputNames();
auto input_shape = session.GetInputTypeInfo(0).GetTensorTypeAndShapeInfo().GetShape();</p><p>// 5. 准备输入张量(例如 float32 的 1x3x224x224 图像)
std::vector<float> input_tensor_values(1 <em> 3 </em> 224 * 224, 0.5f); // dummy data
std::vector<int64_t> input_tensor_shape{1, 3, 224, 224};
auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
Ort::Value input_tensor = Ort::Value::CreateTensor<float>(
memory_info, input_tensor_values.data(), input_tensor_values.size(),
input_tensor_shape.data(), input_tensor_shape.size());</p><p>// 6. 推理执行
auto output_tensors = session.Run(Ort::RunOptions{nullptr},
input_node_names.data(), &input_tensor, 1,
output_node_names.data(), 1);</p><p>// 7. 读取输出(例如分类 logits)
float* output_data = output_tensors[0].GetTensorMutableData<float>();
int64_t output_count = output_tensors[0].GetTensorTypeAndShapeInfo().GetElementCount();
登录后复制

常见问题与建议

  • 模型输入预处理必须和训练时完全一致:归一化(如 ImageNet 的 mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225])、通道顺序(CHW vs HWC)、插值方式等,建议用 OpenCV 或 stb_image + 手动排列
  • GPU 推理需安装 CUDA/cuDNN 并使用 onnxruntime-gpu 包;CPU 版默认开启 AVX2/SSE 优化,无需额外配置
  • 若需动态 batch 或 shape(如 -1 in shape),确保模型导出时已设 dynamic_axes,且 ONNX Runtime 版本 ≥1.14
  • 性能瓶颈常在数据搬运(host ↔ device)和预处理,而非推理本身;可用 Ort::IoBinding 绑定 GPU 内存减少拷贝

基本上就这些。不需要造轮子,用好 ONNX Runtime 就是当前 C++ AI 推理最务实的选择。

以上就是c++++如何实现一个简单的神经网络推理框架_c++ ONNX Runtime集成【AI】的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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