ATLAS Offline Software
Loading...
Searching...
No Matches
OnnxRuntimeBase Class Reference

#include <OnnxRuntimeBase.h>

Inheritance diagram for OnnxRuntimeBase:
Collaboration diagram for OnnxRuntimeBase:

Public Member Functions

 OnnxRuntimeBase (TString fileName)
 OnnxRuntimeBase ()
 ~OnnxRuntimeBase ()
void initialize (TString)
std::vector< float > runONNXInference (std::vector< float > &inputTensorValues) const
std::vector< std::vector< float > > runONNXInference (std::vector< std::vector< float > > &inputTensorValues) const
std::vector< std::vector< float > > runONNXInference (NetworkBatchInput &inputTensorValues) const
std::map< int, Eigen::MatrixXf > runONNXInferenceMultilayerOutput (NetworkBatchInput &inputTensorValues) const
const std::vector< int64_t > & getInputNodesDims ()
const std::vector< int64_t > & getOutputNodesDims ()

Public Attributes

TString m_fileName

Private Attributes

std::unique_ptr< Ort::Session > m_session
 ONNX runtime session / model properties.
std::vector< const char * > m_inputNodeNames
std::vector< int64_t > m_inputNodeDims
std::vector< const char * > m_outputNodeNames
std::vector< int64_t > m_outputNodeDims
std::unique_ptr< Ort::Env > m_env

Detailed Description

Definition at line 13 of file OnnxRuntimeBase.h.

Constructor & Destructor Documentation

◆ OnnxRuntimeBase() [1/2]

OnnxRuntimeBase::OnnxRuntimeBase ( TString fileName)

Definition at line 9 of file OnnxRuntimeBase.cxx.

10{
11 initialize(std::move(fileName));
12}
void initialize()

◆ OnnxRuntimeBase() [2/2]

OnnxRuntimeBase::OnnxRuntimeBase ( )

Definition at line 14 of file OnnxRuntimeBase.cxx.

14{}

◆ ~OnnxRuntimeBase()

OnnxRuntimeBase::~OnnxRuntimeBase ( )
inline

Definition at line 25 of file OnnxRuntimeBase.h.

25{}

Member Function Documentation

◆ getInputNodesDims()

const std::vector< int64_t > & OnnxRuntimeBase::getInputNodesDims ( )
inline

Definition at line 33 of file OnnxRuntimeBase.h.

33{return m_inputNodeDims;};
std::vector< int64_t > m_inputNodeDims

◆ getOutputNodesDims()

const std::vector< int64_t > & OnnxRuntimeBase::getOutputNodesDims ( )
inline

Definition at line 34 of file OnnxRuntimeBase.h.

34{return m_outputNodeDims;};
std::vector< int64_t > m_outputNodeDims

◆ initialize()

void OnnxRuntimeBase::initialize ( TString fileName)

Definition at line 16 of file OnnxRuntimeBase.cxx.

17{
18 m_fileName = std::move(fileName);
19 //load the onnx model to memory using the path m_path_to_onnx
20 m_env = std::make_unique< Ort::Env >(ORT_LOGGING_LEVEL_WARNING, "");
21
22 // Set the ONNX runtime session options
23 Ort::SessionOptions session_options;
24 // Set graph optimization level
25 session_options.SetIntraOpNumThreads(1);
26 session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED);
27 // Create the Ort session
28 m_session = std::make_unique< Ort::Session >(*m_env, m_fileName.Data(), session_options);
29 // Default allocator
30 Ort::AllocatorWithDefaultOptions allocator;
31 // Get the names of the input nodes of the model
32 size_t numInputNodes = m_session->GetInputCount();
33 // Iterate over all input nodes and get the name
34 for (size_t i = 0; i < numInputNodes; i++)
35 {
36 auto name = m_session->GetInputNameAllocated(i, allocator);
37 char* input_name = new char[strlen(name.get()) + 1];
38 strcpy(input_name, name.get());
39
40 m_inputNodeNames.push_back(input_name);
41 // Get the dimensions of the input nodes,
42 // here we assume that all input nodes have the same dimensions
43 Ort::TypeInfo inputTypeInfo = m_session->GetInputTypeInfo(i);
44 auto tensorInfo = inputTypeInfo.GetTensorTypeAndShapeInfo();
45
46 m_inputNodeDims = tensorInfo.GetShape();
47 }
48 // Get the names of the output nodes
49 size_t numOutputNodes = m_session->GetOutputCount();
50 // Iterate over all output nodes and get the name
51 for (size_t i = 0; i < numOutputNodes; i++)
52 {
53 auto name = m_session->GetOutputNameAllocated(i, allocator);
54 char* output_name = new char[strlen(name.get()) + 1];
55 strcpy(output_name, name.get());
56 m_outputNodeNames.push_back(output_name);
57 // Get the dimensions of the output nodes
58 // here we assume that all output nodes have the dimensions
59 Ort::TypeInfo outputTypeInfo = m_session->GetOutputTypeInfo(i);
60 auto tensorInfo = outputTypeInfo.GetTensorTypeAndShapeInfo();
61 m_outputNodeDims = tensorInfo.GetShape();
62 }
63}
std::unique_ptr< Ort::Env > m_env
std::vector< const char * > m_inputNodeNames
std::vector< const char * > m_outputNodeNames
std::unique_ptr< Ort::Session > m_session
ONNX runtime session / model properties.

◆ runONNXInference() [1/3]

std::vector< std::vector< float > > OnnxRuntimeBase::runONNXInference ( NetworkBatchInput & inputTensorValues) const

Definition at line 96 of file OnnxRuntimeBase.cxx.

97{
98 int batchSize = inputTensorValues.rows();
99 std::vector<int64_t> inputNodeDims = m_inputNodeDims;
100 std::vector<int64_t> outputNodeDims = m_outputNodeDims; //bad. Assumes they all have the same number of nodes.
101
102 // The first dim node should correspond to the batch size
103 // If it is -1, it is dynamic and should be set to the input size
104 if (inputNodeDims[0] == -1)
105 {
106 inputNodeDims[0] = batchSize;
107 }
108 if (outputNodeDims[0] == -1)
109 {
110 outputNodeDims[0] = batchSize;
111 }
112
113 if(inputNodeDims[1]*inputNodeDims[2] != inputTensorValues.cols() && inputNodeDims[1] != inputTensorValues.cols())
114 {
115 throw std::runtime_error("runONNXInference: feature size doesn't match the input size: inputSize required: " + std::to_string(inputNodeDims[1]*inputNodeDims[2]) + " inputSize provided: " + std::to_string(inputTensorValues.cols()));
116 }
117
118 if (batchSize != 1 && (inputNodeDims[0] != batchSize || outputNodeDims[0] != batchSize))
119 {
120 throw std::runtime_error("runONNXInference: batch size doesn't match the input or output node size");
121 }
122
123 // Create input tensor object from data values
124 // note: this assumes the model has only 1 input node
125 Ort::MemoryInfo memoryInfo = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
126 Ort::Value inputTensor = Ort::Value::CreateTensor<float>(memoryInfo, inputTensorValues.data(), inputTensorValues.size(),inputNodeDims.data(), inputNodeDims.size());
127 // Double-check that inputTensor is a Tensor
128 if (!inputTensor.IsTensor())
129 {
130 throw std::runtime_error("runONNXInference: conversion of input to Tensor failed. ");
131 }
132 // Score model on input tensors, get back output tensors
133 Ort::RunOptions run_options;
134 std::vector<Ort::Value> outputTensors =
135 m_session->Run(run_options, m_inputNodeNames.data(), &inputTensor,
136 m_inputNodeNames.size(), m_outputNodeNames.data(),
137 m_outputNodeNames.size());
138 // Double-check that outputTensors contains Tensors and that the count matches
139 // that of output nodes
140 if (!outputTensors[0].IsTensor() || (outputTensors.size() != m_outputNodeNames.size())) {
141 throw std::runtime_error("runONNXInference: calculation of output failed. ");
142 }
143 // Get pointer to output tensor float values
144 // note: this assumes the model has only 1 output value
145 float* outputTensor = outputTensors.front().GetTensorMutableData<float>();
146 // Get the output values
147 std::vector<std::vector<float>> outputTensorValues(batchSize, std::vector<float>(outputNodeDims[1], -1));
148 for (int i = 0; i < outputNodeDims[0]; i++)
149 {
150 for (int j = 0; j < ((outputNodeDims.size() > 1) ? outputNodeDims[1] : 1); j++)
151 {
152 outputTensorValues[i][j] = outputTensor[i * outputNodeDims[1] + j];
153 }
154 }
155
156 return outputTensorValues;
157}

◆ runONNXInference() [2/3]

std::vector< float > OnnxRuntimeBase::runONNXInference ( std::vector< float > & inputTensorValues) const

Definition at line 84 of file OnnxRuntimeBase.cxx.

85{
86 NetworkBatchInput vectorInput(1, inputTensorValues.size());
87 for (size_t i = 0; i < inputTensorValues.size(); i++) {
88 vectorInput(0, i) = inputTensorValues[i];
89 }
90 auto vectorOutput = runONNXInference(vectorInput);
91 return vectorOutput[0];
92}
Eigen::Matrix< float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > NetworkBatchInput
std::vector< float > runONNXInference(std::vector< float > &inputTensorValues) const

◆ runONNXInference() [3/3]

std::vector< std::vector< float > > OnnxRuntimeBase::runONNXInference ( std::vector< std::vector< float > > & inputTensorValues) const

Definition at line 66 of file OnnxRuntimeBase.cxx.

67{
68 std::vector<std::vector<float> > output;
69 if (inputTensorValues.size() == 0) return output;
70
71 NetworkBatchInput vectorInput(inputTensorValues.size(), inputTensorValues[0].size());
72 for (size_t i = 0; i < inputTensorValues.size(); i++) {
73 for (size_t j = 0; j < inputTensorValues[i].size(); j++) {
74 vectorInput(i,j) = inputTensorValues[i][j];
75 }
76 }
77 output = runONNXInference(vectorInput);
78 return output;
79}
output
Definition merge.py:16

◆ runONNXInferenceMultilayerOutput()

std::map< int, Eigen::MatrixXf > OnnxRuntimeBase::runONNXInferenceMultilayerOutput ( NetworkBatchInput & inputTensorValues) const

Definition at line 162 of file OnnxRuntimeBase.cxx.

163{
164 const int batchSize = inputTensorValues.rows();
165 std::vector<int64_t> inputNodeDims = m_inputNodeDims;
166 std::vector<int64_t> outputNodeDims = m_outputNodeDims;
167
168 // The first dim node should correspond to the batch size
169 // If it is -1, it is dynamic and should be set to the input size
170 if (inputNodeDims[0] == -1)
171 {
172 inputNodeDims[0] = batchSize;
173 }
174 if (outputNodeDims[0] == -1)
175 {
176 outputNodeDims[0] = batchSize;
177 }
178
179 if(inputNodeDims[1] != inputTensorValues.cols())
180 {
181 throw std::runtime_error("runONNXInference: feature size doesn't match the input size: inputSize required: " + std::to_string(inputNodeDims[1]) + " inputSize provided: " + std::to_string(inputTensorValues.cols()));
182 }
183
184 if (batchSize != 1 &&(inputNodeDims[0] != batchSize || outputNodeDims[0] != batchSize))
185 {
186 throw std::runtime_error("runONNXInference: batch size doesn't match the input or output node size");
187 }
188 // Create input tensor object from data values
189 // note: this assumes the model has only 1 input node
190 Ort::MemoryInfo memoryInfo = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
191 Ort::Value inputTensor = Ort::Value::CreateTensor<float>(memoryInfo, inputTensorValues.data(), inputTensorValues.size(), inputNodeDims.data(), inputNodeDims.size());
192 // Double-check that inputTensor is a Tensor
193 if (!inputTensor.IsTensor())
194 {
195 throw std::runtime_error("runONNXInference: conversion of input to Tensor failed. ");
196 }
197 // Score model on input tensors, get back output tensors
198 Ort::RunOptions run_options;
199 std::vector<Ort::Value> outputTensors =
200 m_session->Run(run_options, m_inputNodeNames.data(), &inputTensor,
201 m_inputNodeNames.size(), m_outputNodeNames.data(),
202 m_outputNodeNames.size());
203 // Double-check that outputTensors contains Tensors and that the count matches
204 // that of output nodes
205 if (!outputTensors[0].IsTensor() || (outputTensors.size() != m_outputNodeNames.size())) {
206 throw std::runtime_error("runONNXInference: calculation of output failed. ");
207 }
208 // Get pointers to output tensor float values
209 // note: this assumes the model has multiple output layers
210 std::map<int, Eigen::MatrixXf> outputTensorMap;
211 size_t numOutputNodes = m_session->GetOutputCount();
212 for (size_t i=0; i<numOutputNodes; i++){ // two output layers
213
214 // retrieve pointer to output float tenor
215 float* output = outputTensors.at(i).GetTensorMutableData<float>();
216 Ort::TypeInfo outputTypeInfo = m_session->GetOutputTypeInfo(i);
217 auto outputTensorInfo = outputTypeInfo.GetTensorTypeAndShapeInfo();
218 // Not all outputNodes have the same shape. Get the new shape.
219 // First dimension should be batch size
220 outputNodeDims = outputTensorInfo.GetShape();
221
222 int nNodes = outputNodeDims.size() > 1 ? outputNodeDims[1] : 1;
223 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> batchMatrix(batchSize, nNodes);
224 for (int j = 0; j < batchSize; j++)
225 {
226 Eigen::VectorXf vec(nNodes);
227 for (int k = 0; k<nNodes; k++)
228 {
229 float val = output[j * outputNodeDims[1] + k];
230 vec(k) = val;
231 }
232 batchMatrix.row(j) = vec;
233 } // batch
234 outputTensorMap[i] = std::move(batchMatrix);
235 } // output layers
236 return outputTensorMap;
237}
std::vector< size_t > vec

Member Data Documentation

◆ m_env

std::unique_ptr< Ort::Env > OnnxRuntimeBase::m_env
private

Definition at line 45 of file OnnxRuntimeBase.h.

◆ m_fileName

TString OnnxRuntimeBase::m_fileName

Definition at line 17 of file OnnxRuntimeBase.h.

◆ m_inputNodeDims

std::vector<int64_t> OnnxRuntimeBase::m_inputNodeDims
private

Definition at line 41 of file OnnxRuntimeBase.h.

◆ m_inputNodeNames

std::vector<const char*> OnnxRuntimeBase::m_inputNodeNames
private

Definition at line 40 of file OnnxRuntimeBase.h.

◆ m_outputNodeDims

std::vector<int64_t> OnnxRuntimeBase::m_outputNodeDims
private

Definition at line 43 of file OnnxRuntimeBase.h.

◆ m_outputNodeNames

std::vector<const char*> OnnxRuntimeBase::m_outputNodeNames
private

Definition at line 42 of file OnnxRuntimeBase.h.

◆ m_session

std::unique_ptr<Ort::Session> OnnxRuntimeBase::m_session
private

ONNX runtime session / model properties.

Definition at line 38 of file OnnxRuntimeBase.h.


The documentation for this class was generated from the following files: