Project
Loading...
Searching...
No Matches
OrtInterface.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
15
16#ifndef O2_ML_ORTINTERFACE_H
17#define O2_ML_ORTINTERFACE_H
18
19// C++ and system includes
20#include <vector>
21#include <string>
22#include <memory>
23#include <map>
24#include <thread>
25#include <unordered_map>
26
27// O2 includes
28#include "GPUCommonLogger.h"
29
30namespace Ort
31{
32struct SessionOptions;
33struct MemoryInfo;
34struct Env;
35} // namespace Ort
36
37namespace o2::ml
38{
39
41{
42
43 public:
44 // Constructors & destructors
46 OrtModel(std::unordered_map<std::string, std::string> optionsMap);
47 void init(std::unordered_map<std::string, std::string> optionsMap);
48 virtual ~OrtModel();
49
50 // General purpose
51 void initOptions(std::unordered_map<std::string, std::string> optionsMap);
52 void initEnvironment();
53 void initSession();
54 void initSessionFromBuffer(const char* buffer, size_t bufferSize);
55 void memoryOnDevice(int32_t = 0);
56 bool isInitialized() { return mInitialized; }
57 void resetSession();
58
59 // Getters
60 std::vector<std::vector<int64_t>> getNumInputNodes() const { return mInputShapes; }
61 std::vector<std::vector<int64_t>> getNumOutputNodes() const { return mOutputShapes; }
62 std::vector<std::string> getInputNames() const { return mInputNames; }
63 std::vector<std::string> getOutputNames() const { return mOutputNames; }
64 Ort::SessionOptions* getSessionOptions();
65 Ort::MemoryInfo* getMemoryInfo();
66 Ort::Env* getEnv();
67 int32_t getIntraOpNumThreads() const { return mIntraOpNumThreads; }
68 int32_t getInterOpNumThreads() const { return mInterOpNumThreads; }
69
70 // Setters
71 void setDeviceId(int32_t id) { mDeviceId = id; }
72 void setIO();
73 void setActiveThreads(int threads) { mIntraOpNumThreads = threads; }
74 void setIntraOpNumThreads(int threads)
75 {
76 if (mDeviceType == "CPU") {
77 mIntraOpNumThreads = threads;
78 }
79 }
80 void setInterOpNumThreads(int threads)
81 {
82 if (mDeviceType == "CPU") {
83 mInterOpNumThreads = threads;
84 }
85 }
86 void setEnv(Ort::Env*);
87
88 // Conversion
89 template <class I, class O>
90 std::vector<O> v2v(std::vector<I>&, bool = true);
91
92 // Inferencing
93 template <class I, class O> // class I is the input data type, e.g. float, class O is the output data type, e.g. OrtDataType::Float16_t from O2/Common/ML/include/ML/GPUORTFloat16.h
94 std::vector<O> inference(std::vector<I>&);
95
96 template <class I, class O>
97 std::vector<O> inference(std::vector<std::vector<I>>&);
98
99 template <class I, class O>
100 void inference(I*, int64_t, O*);
101
102 template <class I, class O>
103 void inference(I**, int64_t, O*);
104
105 void release(bool = false);
106
107 private:
108 // ORT variables -> need to be hidden as pImpl
109 struct OrtVariables;
110 std::unique_ptr<OrtVariables> mPImplOrt;
111
112 // Input & Output specifications of the loaded network
113 std::vector<const char*> mInputNamesChar, mOutputNamesChar;
114 std::vector<std::string> mInputNames, mOutputNames;
115 std::vector<std::vector<int64_t>> mInputShapes, mOutputShapes, mInputShapesCopy, mOutputShapesCopy; // Input shapes
116 std::vector<int64_t> mInputSizePerNode, mOutputSizePerNode; // Output shapes
117 int32_t mInputsTotal = 0, mOutputsTotal = 0; // Total number of inputs and outputs
118
119 // Environment settings
120 bool mInitialized = false, mDeterministicMode = false;
121 std::string mModelPath, mEnvName = "", mDeviceType = "CPU", mThreadAffinity = ""; // device options should be cpu, rocm, migraphx, cuda
122 int32_t mIntraOpNumThreads = 1, mInterOpNumThreads = 1, mDeviceId = -1, mEnableProfiling = 0, mLoggingLevel = 0, mAllocateDeviceMemory = 0, mEnableOptimizations = 0;
123
124 std::string printShape(const std::vector<int64_t>&);
125 std::string printShape(const std::vector<std::vector<int64_t>>&, std::vector<std::string>&);
126};
127
128} // namespace o2::ml
129
130#endif // O2_ML_ORTINTERFACE_H
std::vector< std::vector< int64_t > > getNumInputNodes() const
void initOptions(std::unordered_map< std::string, std::string > optionsMap)
void memoryOnDevice(int32_t=0)
void setActiveThreads(int threads)
Ort::Env * getEnv()
void release(bool=false)
void setEnv(Ort::Env *)
int32_t getInterOpNumThreads() const
std::vector< O > v2v(std::vector< I > &, bool=true)
void setInterOpNumThreads(int threads)
void setIntraOpNumThreads(int threads)
std::vector< std::string > getOutputNames() const
void initSessionFromBuffer(const char *buffer, size_t bufferSize)
std::vector< std::vector< int64_t > > getNumOutputNodes() const
Ort::MemoryInfo * getMemoryInfo()
void setDeviceId(int32_t id)
std::vector< std::string > getInputNames() const
std::vector< O > inference(std::vector< I > &)
int32_t getIntraOpNumThreads() const
virtual ~OrtModel()
void init(std::unordered_map< std::string, std::string > optionsMap)
Ort::SessionOptions * getSessionOptions()
GLuint buffer
Definition glcorearb.h:655
GLuint id
Definition glcorearb.h:650