推荐集成ONNX Runtime而非手写推理框架,因其专为高效推理设计,支持多硬件后端、量化、图优化及原生C++ API,只需加载ONNX模型并执行推理即可。
用 C++ 实现一个“从零开始”的完整神经网络推理框架工程量大、易出错,不推荐;实际项目中更高效可靠的做法是集成成熟推理引擎——ONNX Runtime 是目前最主流、跨平台、高性能且对 C++ 友好的选择。
它不是模型训练框架,而是专为**高效推理**设计的运行时:支持 CPU/GPU(CUDA / DirectML / Vulkan)、量化、图优化、多线程、内存复用,并原生提供稳定 C++ API。你只需加载 ONNX 模型(由 PyTorch/TensorFlow 导出),喂入数据,拿到输出,无需管理张量内存、算子实现或调度逻辑。
前提:已有一个导出好的 .onnx 模型(例如 resnet18.onnx)
以下是最小可运行片段(省略错误检查,实际需加 try/catch 和 status 判空):
// 1. 创建环境(全局一次)
Ort::Env env{ORT_LOGGING_LEVEL_WARNING, "test"};
// 2. 配置会话选项(可启用 graph optimization / intra-op thread pool)
Ort::SessionOptions session_options;
session_options.SetIntraOpNumThreads(4);
session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL);
// 3. 创建会话(加载模型)
Ort::Session session{env, L"resnet18.onnx", session_options};
// 4. 获取输入输出信息(用于分配内存和校验 shape)
auto input_node_names = session.GetInputNames();
auto output_node_names = session.GetOutputNames();
auto input_shape = session.GetInputTypeInfo(0).GetTensorTypeAndShapeInfo().GetShape();
// 5. 准备输入张量(例如 float32 的 1x3x224x224 图像)
std::vector input_tensor_values(1 3 224 * 224, 0.5f); // dummy data
std::vector input_tensor_shape{1, 3, 224, 224};
auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
Ort::Value input_tensor = Ort::Value::CreateTensor(
memory_info, input_tensor_values.data(), input_tensor_values.size(),
input_tensor_shape.data(), input_tensor_shape.size());
// 6. 推理执行
auto output_tensors = session.Run(Ort::RunOptions{nullptr},
input_node_names.data(), &input_tensor, 1,
output_node_names.data(), 1);
// 7. 读取输出(例如分类 logits)
float* output_data = output_tensors[0].GetTensorMutableData();
int64_t output_count = output_tensors[0].GetTensorTypeAndS
hapeInfo().GetElementCount();
基本上就这些。不需要造轮子,用好 ONNX Runtime 就是当前 C++ AI 推理最务实的选择。