ATLAS Offline Software
Public Member Functions | Public Attributes | Private Attributes | List of all members
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. More...
 
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 }

◆ 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;};

◆ getOutputNodesDims()

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

Definition at line 34 of file OnnxRuntimeBase.h.

34 {return 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 }

◆ 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 }

◆ 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 }

◆ 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 }

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:
OnnxRuntimeBase::runONNXInference
std::vector< float > runONNXInference(std::vector< float > &inputTensorValues) const
Definition: OnnxRuntimeBase.cxx:84
OnnxRuntimeBase::m_env
std::unique_ptr< Ort::Env > m_env
Definition: OnnxRuntimeBase.h:45
OnnxRuntimeBase::initialize
void initialize(TString)
Definition: OnnxRuntimeBase.cxx:16
OnnxRuntimeBase::m_outputNodeDims
std::vector< int64_t > m_outputNodeDims
Definition: OnnxRuntimeBase.h:43
OnnxRuntimeBase::m_inputNodeDims
std::vector< int64_t > m_inputNodeDims
Definition: OnnxRuntimeBase.h:41
OnnxRuntimeBase::m_session
std::unique_ptr< Ort::Session > m_session
ONNX runtime session / model properties.
Definition: OnnxRuntimeBase.h:34
CxxUtils::vec
typename vecDetail::vec_typedef< T, N >::type vec
Define a nice alias for the vectorized type.
Definition: vec.h:207
OnnxRuntimeBase::m_inputNodeNames
std::vector< const char * > m_inputNodeNames
Definition: OnnxRuntimeBase.h:40
lumiFormat.i
int i
Definition: lumiFormat.py:85
OnnxRuntimeBase::m_fileName
TString m_fileName
Definition: OnnxRuntimeBase.h:17
merge.output
output
Definition: merge.py:16
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
OnnxRuntimeBase::m_outputNodeNames
std::vector< const char * > m_outputNodeNames
Definition: OnnxRuntimeBase.h:42
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
jobOptions.fileName
fileName
Definition: jobOptions.SuperChic_ALP2.py:39
NetworkBatchInput
Eigen::Matrix< float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > NetworkBatchInput
Definition: OnnxRuntimeBase.h:9
fitman.k
k
Definition: fitman.py:528