ONE - On-device Neural Engine
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
onert::exec::SingleModelExecutors Class Reference

Class to gather executor set for single model NN package. More...

#include <SingleModelExecutors.h>

Collaboration diagram for onert::exec::SingleModelExecutors:

Public Member Functions

 SingleModelExecutors (void)=default
 Construct a new SingleModelExecutors object.
 
 SingleModelExecutors (const SingleModelExecutors &)=delete
 
 SingleModelExecutors (SingleModelExecutors &&)=default
 
 ~SingleModelExecutors ()=default
 Destroy the SingleModelExecutors object.
 
void emplace (const ir::ModelIndex &model_index, const ir::SubgraphIndex &subg_index, std::unique_ptr< IExecutor > exec) override
 Insert executor in executor set.
 
IExecutorat (const ir::ModelIndex &model_index, const ir::SubgraphIndex &subg_index) const override
 Return executor of index.
 
uint32_t inputSize () const override
 Return executor set's number of input.
 
uint32_t outputSize () const override
 Return executor set's number of output.
 
const ir::OperandInfoinputInfo (const ir::IOIndex &index) const override
 Return NN package input tensor info.
 
const ir::OperandInfooutputInfo (const ir::IOIndex &index) const override
 Return NN package output tensor info.
 
void execute (const ExecutionContext &ctx) override
 Execute NN package executor set.
 
- Public Member Functions inherited from onert::exec::IExecutors
virtual ~IExecutors ()=default
 Virtual IExecutors destructor.
 
IExecutorentryExecutor () const
 

Detailed Description

Class to gather executor set for single model NN package.

Definition at line 29 of file SingleModelExecutors.h.

Constructor & Destructor Documentation

◆ SingleModelExecutors() [1/3]

onert::exec::SingleModelExecutors::SingleModelExecutors ( void  )
default

Construct a new SingleModelExecutors object.

◆ SingleModelExecutors() [2/3]

onert::exec::SingleModelExecutors::SingleModelExecutors ( const SingleModelExecutors )
delete

◆ SingleModelExecutors() [3/3]

onert::exec::SingleModelExecutors::SingleModelExecutors ( SingleModelExecutors &&  )
default

◆ ~SingleModelExecutors()

onert::exec::SingleModelExecutors::~SingleModelExecutors ( )
default

Destroy the SingleModelExecutors object.

Member Function Documentation

◆ at()

IExecutor * onert::exec::SingleModelExecutors::at ( const ir::ModelIndex model_index,
const ir::SubgraphIndex subg_index 
) const
overridevirtual

Return executor of index.

Parameters
[in]model_indexModel index
[in]subg_indexSubgraph index
Returns
Executor

Implements onert::exec::IExecutors.

Definition at line 32 of file SingleModelExecutors.cc.

34{
35 return _executors.at(subg_index).get();
36}

◆ emplace()

void onert::exec::SingleModelExecutors::emplace ( const ir::ModelIndex model_index,
const ir::SubgraphIndex subg_index,
std::unique_ptr< IExecutor exec 
)
overridevirtual

Insert executor in executor set.

Parameters
[in]model_indexModel index
[in]subg_indexSubgraph index
[in]execExecutor to insert

Implements onert::exec::IExecutors.

Definition at line 26 of file SingleModelExecutors.cc.

28{
29 _executors.emplace(subg_index, std::move(exec));
30}

◆ execute()

void onert::exec::SingleModelExecutors::execute ( const ExecutionContext ctx)
overridevirtual

Execute NN package executor set.

Parameters
[in]ctxExecution context

Implements onert::exec::IExecutors.

Definition at line 52 of file SingleModelExecutors.cc.

53{
54 // UserTensor for Input/Output
55 std::vector<std::unique_ptr<backend::builtin::UserTensor>> tensorpool;
56
57 // EdgeTensor for Input Quantization / Output Dequantization
58 std::vector<std::unique_ptr<EdgeTensor>> qtensorpool;
59
60 // Input/Output Tensor vector for executor
61 std::vector<backend::IPortableTensor *> inputs(ctx.desc.inputs.size());
62 std::vector<backend::IPortableTensor *> outputs(ctx.desc.outputs.size());
63
64 // Vector for input quantization I/O
65 std::vector<backend::ITensor *> input_tensors;
66 std::vector<backend::ITensor *> input_qtensors;
67 std::vector<ir::PermuteType> input_permute_types;
68
69 // Vector for output dequantization I/O
70 std::vector<backend::ITensor *> output_qtensors;
71 std::vector<backend::ITensor *> output_tensors;
72 std::vector<ir::PermuteType> output_permute_types;
73
74 // Prepare UserTensor and EdgeTensor for input quantization
75 for (uint32_t i = 0; i < inputs.size(); i++)
76 {
77 auto &desc = ctx.desc.inputs[i];
78
79 // Input is optional if buffer is nullptr, and optional input's size is 0
80 if (desc->buffer == nullptr && (desc->size != 0 || desc->info.total_size() != 0))
81 throw std::runtime_error{"Input " + std::to_string(i) + "'s buffer is not set."};
82
83 tensorpool.emplace_back(std::make_unique<backend::builtin::UserTensor>(
84 desc->info, desc->layout, const_cast<uint8_t *>(static_cast<const uint8_t *>(desc->buffer)),
85 desc->size));
86
87 auto user_type = desc->info.typeInfo().type();
88 auto &model_info = entryExecutor()->inputInfo(i).typeInfo();
89 auto model_type = model_info.type();
90 if ((user_type != model_type && user_type == ir::DataType::FLOAT32) ||
91 (desc->layout == ir::Layout::NCHW))
92 {
93 auto quantized_info = desc->info;
94 quantized_info.typeInfo(model_info);
95 qtensorpool.emplace_back(
96 std::make_unique<EdgeTensor>(quantized_info, entryExecutor()->inputLayout(i)));
97 qtensorpool.back()->allocate_buffer();
98
99 input_tensors.push_back(tensorpool.back().get());
100 input_qtensors.push_back(qtensorpool.back().get());
101 inputs[i] = qtensorpool.back().get();
102 if (desc->layout == ir::Layout::NCHW)
103 input_permute_types.push_back(ir::PermuteType::NCHW_TO_NHWC);
104 else
105 input_permute_types.push_back(ir::PermuteType::COPY);
106 }
107 else
108 inputs[i] = tensorpool.back().get();
109 }
110
111 // Prepare UserTensor and EdgeTensor for output dequantization
112 for (uint32_t i = 0; i < outputs.size(); i++)
113 {
114 auto &desc = ctx.desc.outputs[i];
115
116 // Output is optional if buffer is nullptr, and optional output's size is 0
117 if (desc->buffer == nullptr && (desc->size != 0 || desc->info.total_size() != 0))
118 throw std::runtime_error{"Output " + std::to_string(i) + "'s buffer is not set."};
119
120 tensorpool.emplace_back(std::make_unique<backend::builtin::UserTensor>(
121 desc->info, desc->layout, static_cast<uint8_t *>(desc->buffer), desc->size));
122
123 auto user_type = desc->info.typeInfo().type();
124 auto &model_info = entryExecutor()->outputInfo(i).typeInfo();
125 auto model_type = model_info.type();
126 if ((user_type != model_type && user_type == ir::DataType::FLOAT32) ||
127 (desc->layout == ir::Layout::NCHW))
128 {
129 auto quantized_info = desc->info;
130 quantized_info.typeInfo(model_info);
131 qtensorpool.emplace_back(
132 std::make_unique<EdgeTensor>(quantized_info, entryExecutor()->outputLayout(i)));
133 qtensorpool.back()->allocate_buffer();
134
135 output_qtensors.push_back(qtensorpool.back().get());
136 output_tensors.push_back(tensorpool.back().get());
137 outputs[i] = qtensorpool.back().get();
138 if (desc->layout == ir::Layout::NCHW)
139 output_permute_types.push_back(ir::PermuteType::NHWC_TO_NCHW);
140 else
141 output_permute_types.push_back(ir::PermuteType::COPY);
142 }
143 else
144 outputs[i] = tensorpool.back().get();
145 }
146
147 // Run quantization
148 if (input_tensors.size() > 0)
149 {
150 auto input_quantize_layer = PermuteLayer(input_tensors, input_qtensors, input_permute_types);
151 input_quantize_layer.prepare();
152 input_quantize_layer.run();
153 }
154
155 // Executor
156 entryExecutor()->execute(inputs, outputs, ctx.options);
157
158 // Run dequantization
159 if (output_tensors.size() != 0)
160 {
161 auto output_dequantize_layer =
162 PermuteLayer(output_qtensors, output_tensors, output_permute_types);
163 output_dequantize_layer.prepare();
164 output_dequantize_layer.run();
165 }
166
167 // Get dynamic shape inference result
168 for (uint32_t i = 0; i < outputs.size(); i++)
169 {
170 if (ctx.desc.outputs[i]->buffer == nullptr)
171 {
172 // Output is optional if buffer is nullptr
173 continue;
174 }
175
176 ctx.desc.outputs[i]->info.shape(outputs[i]->getShape());
177 }
178}
IExecutor * entryExecutor() const
Definition IExecutors.h:58
const TypeInfo & typeInfo() const
Return tensor data type info.
DataType type() const
Definition TypeInfo.h:50
nnfw::cker::Shape getShape(const IPortableTensor *tensor)
virtual void execute(const std::vector< backend::IPortableTensor * > &inputs, const std::vector< backend::IPortableTensor * > &outputs, const ExecutionOptions &options)=0
Execute with given input/output tensors.
virtual const ir::OperandInfo & inputInfo(uint32_t index) const =0
Get input info at index.
virtual const ir::OperandInfo & outputInfo(uint32_t index) const =0
Get output info at index.

References onert::ir::COPY, onert::exec::ExecutionContext::desc, onert::exec::IExecutors::entryExecutor(), onert::exec::IExecutor::execute(), onert::exec::IExecutor::inputInfo(), onert::exec::IODescription::inputs, onert::ir::NCHW, onert::ir::NCHW_TO_NHWC, onert::ir::NHWC_TO_NCHW, onert::exec::ExecutionContext::options, onert::exec::IExecutor::outputInfo(), onert::exec::IODescription::outputs, onert::ir::TypeInfo::type(), and onert::ir::OperandInfo::typeInfo().

◆ inputInfo()

const ir::OperandInfo & onert::exec::SingleModelExecutors::inputInfo ( const ir::IOIndex index) const
overridevirtual

Return NN package input tensor info.

Parameters
[in]indexInput index
Returns
Tensor info

Implements onert::exec::IExecutors.

Definition at line 42 of file SingleModelExecutors.cc.

43{
44 return entryExecutor()->inputInfo(index.value());
45}
loco::GraphInputIndex index(const TFPlaceholder *node)
Definition TFNode.cpp:54

References onert::exec::IExecutors::entryExecutor(), and onert::exec::IExecutor::inputInfo().

◆ inputSize()

uint32_t onert::exec::SingleModelExecutors::inputSize ( ) const
overridevirtual

Return executor set's number of input.

Returns
Number of input

Implements onert::exec::IExecutors.

Definition at line 38 of file SingleModelExecutors.cc.

38{ return entryExecutor()->inputSize(); }
virtual uint32_t inputSize() const =0
Get input size.

References onert::exec::IExecutors::entryExecutor(), and onert::exec::IExecutor::inputSize().

◆ outputInfo()

const ir::OperandInfo & onert::exec::SingleModelExecutors::outputInfo ( const ir::IOIndex index) const
overridevirtual

Return NN package output tensor info.

Parameters
[in]indexOutput index
Returns
Tensor info

Implements onert::exec::IExecutors.

Definition at line 47 of file SingleModelExecutors.cc.

48{
49 return entryExecutor()->outputInfo(index.value());
50}

References onert::exec::IExecutors::entryExecutor(), and onert::exec::IExecutor::outputInfo().

◆ outputSize()

uint32_t onert::exec::SingleModelExecutors::outputSize ( ) const
overridevirtual

Return executor set's number of output.

Returns
Number of output

Implements onert::exec::IExecutors.

Definition at line 40 of file SingleModelExecutors.cc.

40{ return entryExecutor()->outputSize(); }
virtual uint32_t outputSize() const =0
Get output size.

References onert::exec::IExecutors::entryExecutor(), and onert::exec::IExecutor::outputSize().


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