为何OnnxRuntime在C++中运行速度比Python慢2-3倍?
ONNX Runtime C++版本Windows真机性能异常问题
现象描述
- 一段依次运行3个推理会话的代码,在Mac及Mac上的Windows虚拟机(VMWare)中性能最佳,测试集运行耗时58-68秒。
- 但在硬件规格相似的Windows真机(Intel i7 6-8核)上测试时,C++版本耗时150秒;而等效Python脚本的速度快2-3倍,性能与Mac相当。
相关代码片段
#include "onnxruntime-osx-universal2-1.13.1/include/onnxruntime_cxx_api.h" // ... Ort::Env OrtEnv; Ort::Session objectNet{OrtEnv, objectModelBuffer.constData(), (size_t) objectModelBuffer.size(), Ort::SessionOptions{}}; // 共3个实例,对应每个模型 std::vector<uint16_t> inputTensorValues; normalize(img, {aiPanoWidth, aiPanoHeight}, inputTensorValues); // 将cv::Mat图像转换为std::vector<uint16_t> std::array<int64_t, 4> input_shape_{ 1, 3, aiPanoHeight, aiPanoWidth }; auto allocator_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault); Ort::Value input_tensor_ = Ort::Value::CreateTensor(allocator_info, inputTensorValues.data(), sizeof(uint16_t) * inputTensorValues.size(), input_shape_.data(), input_shape_.size(), ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT16); const char* input_names[] = { "images" }; const char* output_names[] = { "output" }; std::vector<Ort::Value> ort_outputs = objectNet.Run(Ort::RunOptions{ nullptr }, input_names, &input_tensor_, 1, output_names, 1); //... 后续读取输出,但上述Run步骤的速度已经比Python慢2-3倍
补充细节
- 代码在后台工作线程运行(主线程用于GUI)
- 使用float16格式以减少AI模型占用空间
- 使用微软提供的原生onnxruntime dlls(v1.13.1)
- 分别用Mingw Gcc和VC2022编译,结果相近,VC编译版本略有性能优势
- 不希望使用GPU运行推理
- 编译参数为
/arch:AVX /openmp -O2及-lonnxruntime
内容的提问来源于stack exchange,提问作者Adriel Jr
相关产品推荐
相关产品推荐

