首页 > 编程语言 >onnxruntime c++ 推理例子

onnxruntime c++ 推理例子

时间:2024-09-25 11:19:14浏览次数:3  
标签:onnxruntime Ort c++ int session 内存 output input 推理

资源释放的问题。onnxruntime的对象release是无效的,从接口源码上只是将指针赋空。并未实际释放。要实现释放,需要以指针形式实现。

一个例子如下:

#include <onnxruntime_cxx_api.h>
void testimage()
{
Mat image = imread("ae14.jpg", IMREAD_UNCHANGED);
	// 创建会话选项
	Ort::SessionOptions session_options;
	Ort::Env * env = new Ort::Env(ORT_LOGGING_LEVEL_WARNING, "segment");
	
	//session_options.SetIntraOpNumThreads(1);
	// 
	// 设定单个操作(op)内部并行执行的最大线程数,可以提升速度
	session_options.DisableCpuMemArena();
	session_options.SetIntraOpNumThreads(1);
	session_options.SetGraphOptimizationLevel(ORT_ENABLE_EXTENDED);
	// 是否使用GPU
	OrtSessionOptionsAppendExecutionProvider_CUDA(session_options, 0);
	// 加载模型
	Ort::Session * session = new Ort::Session(*env, _T("seg.onnx"), session_options);

	// 获取输入节点信息
	int input_nodes_num = session->GetInputCount();
	int output_nodes_num = session->GetOutputCount();
	std::vector<std::string> input_node_names;
	std::vector<std::string> output_node_names;
	Ort::AllocatorWithDefaultOptions allocator;

	int input_h = 0;
	int input_w = 0;

	// 获得输入信息
	for (int i = 0; i < input_nodes_num; i++) {
		auto input_name = session->GetInputNameAllocated(i, allocator);
		input_node_names.push_back(input_name.get());
		auto inputShapeInfo = session->GetInputTypeInfo(i).GetTensorTypeAndShapeInfo().GetShape();
		int ch = inputShapeInfo[1];
		input_h = inputShapeInfo[2];
		input_w = inputShapeInfo[3];
	}

	// 获得输出信息 多输出
	for (int i = 0; i < output_nodes_num; i++) {
		auto output_name = session->GetOutputNameAllocated(i, allocator);
		output_node_names.push_back(output_name.get());
		auto outShapeInfo = session->GetOutputTypeInfo(i).GetTensorTypeAndShapeInfo().GetShape();
		int ch = outShapeInfo[1];
		int output_h = outShapeInfo[2];
		int output_w = outShapeInfo[3];
		
	}
	
	// 填充数据输入
	Mat input0;
	cv::cvtColor(image, image, cv::COLOR_GRAY2RGB);
	image.convertTo(input0, CV_32F, 1.0 / 255, 0);
	cv::Mat blob = cv::dnn::blobFromImage(input0);

	std::vector<float> input_tensor_values(input_w * input_h * 3);

	size_t tpixels = input_w * input_h * 3;
	std::vector<int64_t> input_tensor_dims = { 1, 3, input_h, input_w }; // 批次大小, 通道数, 高度, 宽度
	auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
	Ort::Value input_tensor = Ort::Value::CreateTensor<float>(memory_info, blob.ptr<float>(), tpixels, input_tensor_dims.data(), input_tensor_dims.size());


	// 输入一个数据
	const std::array<const char*, 1> inputNames = { input_node_names[0].c_str() };
	// 输出多个数据
	const std::array<const char*, 1> outNames = { output_node_names[0].c_str() };
	// 运行模型
	std::vector<Ort::Value> ort_outputs; 
	ort_outputs = session->Run(Ort::RunOptions{ nullptr }, inputNames.data(), &input_tensor, inputNames.size(), outNames.data(), outNames.size());

	// 获取输出数据
	// 选择最后一个输出作为最终的mask
	const int32_t* mask_data = ort_outputs[0].GetTensorMutableData<int32_t>();
	auto outShape = ort_outputs[0].GetTensorTypeAndShapeInfo().GetShape();
	int num_cn = outShape[1];
	int out_w = 1500;
	int out_h = 2000;
	LOG(WARNING) << out_w << " " << out_h<<" ";
	cv::Mat segmentation_result(input_h, input_w, CV_8UC1);
	for (int row = 0; row < out_h; row++) {
		for (int col = 0; col < out_w; col++) {
		//	int c1 = mask_data[row * out_w + col];
			segmentation_result.at<uchar>(row, col) = static_cast<uchar>(mask_data[row * out_w + col]);
		}
	}
	cv::Mat out_eq_img;
	cv::equalizeHist(segmentation_result, out_eq_img);
	
	
	// 释放资源
	delete session;
	delete env;
}

Ort::SessionOptions。

DisableProfiling 是一个会话选项,用于控制是否在模型推理过程中收集性能分析数据。当启用性能分析时,ONNX Runtime 会记录执行期间的各种性能指标,如操作符的执行时间、内存使用情况等。这些数据对于调试和优化模型推理性能非常有用。

如果你在代码中设置 DisableProfiling,那么你可能是想关闭性能分析功能。

DisableCpuMemArena 是 ONNX Runtime 中的一个会话选项,用于控制是否在 CPU 上启用内存竞技场(memory arena)。内存竞技场是一块预先分配的内存区域,用于存储模型推理过程中的所有中间数据。这种机制可以减少频繁的内存分配和释放操作,从而提高性能,尤其是在处理多个推理请求时。

然而,在某些情况下,如多线程环境中,内存竞技场可能会导致内存使用不断增加,因为分配的内存不会立即释放回操作系统。这可能会导致内存泄漏的假象,因为即使推理完成,内存也不会释放。

通过设置 DisableCpuMemArena,ONNX Runtime 将改为使用标准的 mallocfree 操作来管理内存,而不是使用内存竞技场。这样可以在每次推理后释放内存,从而减少内存占用。这对于内存使用非常敏感的应用或在多线程环境中运行多个推理任务时特别有用。

DisableMemPattern 是 ONNX Runtime 中的一个会话选项,用于控制是否在模型推理过程中使用内存模式优化。内存模式优化是指 ONNX Runtime 会根据模型的内存访问模式来分配和重用内存,以减少内存分配和释放的开销,从而提高推理性能。

当你设置 DisableMemPattern 时,你实际上是在告诉 ONNX Runtime 不要使用这种优化策略。这通常在某些特定的执行提供程序中是必需的,比如 DirectML 执行提供程序,它不支持内存模式优化或并行执行。在这种情况下,如果你不禁用内存模式优化,可能会导致错误或性能问题。

标签:onnxruntime,Ort,c++,int,session,内存,output,input,推理
From: https://blog.csdn.net/weixin_43632469/article/details/142389172

相关文章

  • C++: unordered系列关联式容器
    目录1.unordered系列关联式容器1.1unordered_map1.2unordered_set2.哈希概念3.哈希冲突4.闭散列5.开散列博客主页:酷酷学感谢关注!!!正文开始1.unordered系列关联式容器在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到......
  • C++ Practical-1 day6
    系列文章目录点击直达——文章总目录文章目录系列文章目录C++Practical-1day6Overview1.abstract_class抽象类1.1.抽象类的特点1.2.示例:抽象类1.3.注意事项2.virtual_function虚函数2.1.示例:动物叫声的多态性2.2.示例:计算图形的面积2.3.注意事项关于作者C+......
  • 自梳理C++八股
    1.左右值引用的理解回答:“左右值引用是C++11引入的一项重要特性,用于优化资源管理和提升性能。具体来说:左值引用(LvalueReference):左值引用可以类比为对象的别名,它允许多个引用共享一个实体对象,常用于函数参数传递以避免对象拷贝。左值引用只能绑定到一个命名的持久对象,适合用......
  • 【C++】STL详解之string类
    本次内容大纲:什么是STLSTL(standardtemplatelibaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL的版本原始版本AlexanderStepanov、MengLee在惠普实验室完成的原始版本,本着开源精神,他们声明允许任......
  • C++ IO 类
    IO库:istream(输入流)类型,提供输入操作。ostream(输出流)类型,提供输出操作。cin,一个istream对象,从标准输入读取数据。cout,一个ostream对象,向标准输出写入数据。cerr,一个ostream对象,通常用于输出程序错误消息,写入到标准错误。>>运算符,用来从一个istream对象读取输入数据。<......
  • C++语言的词汇
    关键字关键字:也称保留字,它是由C++语言本身预先定义好的一类单词基本数据类型和布尔类型int、float、double、char、bool:用于声明整型、浮点型、字符型和布尔型变量。true、false:布尔类型的两个字面量值。复杂数据类型与类class:用于声明类,是C++面向对象编程的基础。str......
  • 【C++基础知识——迭代器 引入】
    问题引入#include<iostream>#include<map>#include<string>intmain(){//定义一个std::map容器std::map<std::string,int>ageMap;ageMap["Alice"]=30;ageMap["Bob"]=25;ageMap["Charlie&q......
  • C++基础
    1.第一个C++程序#include<iostream>//固定格式usingnamespacestd;intmain(){inta=10//定义变量;cout<<a<<endl;//打印变量system("pause");return0;}2.常量与变量的类型只要变量前加const与#define(宏常量)3.关键字3......
  • C++中的类型推断机制
    1.decltype的作用decltype是C++11引入的一个关键字,用来推断表达式的类型。它返回的是表达式的精确类型,包括引用和const限定符等。例子:intx=5;decltype(x)y=x;//y的类型是int在这个例子中,decltype(x)返回int,因为x是一个int类型的变量,所以y的类型也被推......
  • 【C++】类和对象——下
    一.类和对象(下)1.再探构造函数•之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后⾯跟⼀个放在括号......