21xrx.com
2024-06-03 00:01:08 Monday
登录
文章检索 我的文章 写文章
如何使用C++调用ONNX模型
2023-07-07 05:43:17 深夜i     --     --
C++ ONNX模型 调用 程序设计 机器学习

随着深度学习技术不断发展,AI 模型的应用范围也在不断扩展,ONNX (Open Neural Network Exchange) 框架便是其中一种格式。在使用 ONNX 进行推理时,我们可以使用多种编程语言来调用模型,其中 C++ 是较为常见的一种。本文将介绍如何使用 C++ 调用 ONNX 模型。

1. 安装必要的软件

首先,我们需要在本地电脑上安装 C++ 编辑器和 ONNX 运行时程序。为了更方便的使用 ONNX,我们可以使用 ONNX Runtime。具体来讲,我们可以在官网下载 ONNX Runtime 的离线包(.zip 或 .tar.gz 格式),然后使用 cmake 进行安装。在 Linux 系统中,我们可以使用下面的命令安装 ONNX Runtime:


$ mkdir build && cd build

$ cmake ..

$ make

$ sudo make install

如果是 Windows 系统,我们可以使用下面的命令:


$ cmake .. -DCMAKE_PREFIX_PATH=D:\onnxruntime\windows\cuda\10.1

这里的 `D:\onnxruntime\windows\cuda\10.1` 是 ONNX Runtime 的安装路径,可根据实际情况进行修改。

2. 加载 ONNX 模型

在调用 ONNX 模型之前,我们需要先将模型加载到内存中。一般来说,ONNX 模型都是 `.onnx` 文件格式,我们可以使用 `InferenceSession` 类加载模型文件。下面是一个 C++ 代码片段,用于加载一个 ONNX 模型:


#include <onnxruntime_cxx_api.h>

using namespace std;

int main(int argc, char* argv[]) {

 Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test");

 Ort::Session session(env, "model.onnx", Ort::SessionOptions());

 return 0;

}

在上面的代码中,我们首先创建了一个 `Ort::Env` 对象,用于实例化 ONNX Runtime 的环境。然后,我们在 `Ort::Session` 类中加载模型文件,第一个参数是 ONNX 模型的文件路径,第二个参数是 `Ort::SessionOptions` 对象,用来设置会话的一些选项,比如推理时使用的 CPU 或 GPU 设备、允许的内存大小等。最后,我们调用 `return 0;` 结束程序。到这里为止,我们已经成功加载了 ONNX 模型,接下来就可以进行推理了。

3. 进行 ONNX 推理

要进行 ONNX 推理,我们需要先将输入数据转化为 ONNX 格式。一般来说,ONNX 模型有不同的输入属性(如张量维度、数据类型等),我们需要了解模型的输入属性,以便正确转换输入数据。下面是一个 C++ 代码片段,用于进行 ONNX 推理:


#include <vector>

#include <iostream>

#include <onnxruntime_cxx_api.h>

using namespace std;

int main(int argc, char* argv[]) {

  Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test");

  // Load model

  Ort::Session session(env, "model.onnx", Ort::SessionOptions());

  // Prepare input tensor

  Ort::MemoryInfo memory_info = Ort::MemoryInfo::CreateCpu(OrtDeviceAllocator, OrtMemTypeCPU);

  vector<float> input_data = -4.56;

  vector<int64_t> input_shape = 5;

  Ort::Value input_tensor = Ort::Value::CreateTensor<float>(memory_info, input_data.data(), input_data.size(), input_shape.data(), input_shape.size());

  // Prepare output tensor

  vector<int64_t> output_shape = 1;

  Ort::Value output_tensor = Ort::Value::CreateTensor<float>(memory_info, output_shape.data(), output_shape.size());

  // Run inference

  const char* input_names[] = {"input_1"};

  const char* output_names[] = {"output_1"};

  session.Run(Ort::RunOptions{nullptr}, input_names, &input_tensor, 1, output_names, 1, &output_tensor);

  // Retrieve output tensor

  float* result = output_tensor.GetTensorMutableData<float>();

  cout << "Result: " << *result << endl;

  return 0;

}

在上面的代码中,我们首先准备了一个输入数据,它是一个包含 5 个元素的向量。然后,我们使用 ONNX Runtime 的 `Ort::Value::CreateTensor ` 方法将输入数据转化为 ONNX 张量。接着,我们创建了一个输出张量,用于存储推理的结果。这里的输出张量是一个标量(1x1 张量),我们将其大小设为 ` 1`。最后,我们调用 `session.Run()` 方法进行推理。在这个方法中,我们需要指定输入张量的名称和指向输入张量的指针、输出张量的名称和指向输出张量的指针。当推理结束时,我们可以使用 `Ort::Value::GetTensorMutableData ` 方法获取输出张量的数据。

至此,我们已经成功使用 C++ 调用了 ONNX 模型,并获得了推理结果。当然,在实际应用中,我们也可能会遇到其他诸如优化模型、并行执行、加速推理等问题。读者可以进一步查阅相关文献,加深对 ONNX 和 C++ 调用 ONNX 模型的理解。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复