ArmNN
 21.02
InferenceModel.hpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #pragma once
7 
8 #include <armnn/ArmNN.hpp>
9 #include <armnn/Logging.hpp>
10 #include <armnn/utility/Timer.hpp>
12 #include <armnn/utility/Assert.hpp>
14 
15 #if defined(ARMNN_SERIALIZER)
17 #endif
18 #if defined(ARMNN_TF_LITE_PARSER)
20 #endif
21 #if defined(ARMNN_ONNX_PARSER)
23 #endif
24 
25 #include <Filesystem.hpp>
26 #include <HeapProfiling.hpp>
27 #include <TensorIOUtils.hpp>
28 
30 #include <cxxopts/cxxopts.hpp>
31 #include "CxxoptsUtils.hpp"
32 #include <fmt/format.h>
33 #include <mapbox/variant.hpp>
34 
35 #include <algorithm>
36 #include <iterator>
37 #include <fstream>
38 #include <map>
39 #include <string>
40 #include <vector>
41 #include <type_traits>
42 
43 namespace
44 {
45 
46 inline bool CheckRequestedBackendsAreValid(const std::vector<armnn::BackendId>& backendIds,
48 {
49  if (backendIds.empty())
50  {
51  return false;
52  }
53 
55 
56  bool allValid = true;
57  for (const auto& backendId : backendIds)
58  {
59  if (std::find(validBackendIds.begin(), validBackendIds.end(), backendId) == validBackendIds.end())
60  {
61  allValid = false;
62  if (invalidBackendIds)
63  {
64  if (!invalidBackendIds.value().empty())
65  {
66  invalidBackendIds.value() += ", ";
67  }
68  invalidBackendIds.value() += backendId;
69  }
70  }
71  }
72  return allValid;
73 }
74 
75 } // anonymous namespace
76 
78 {
80 
81 using QuantizationParams = std::pair<float,int32_t>;
82 
83 struct Params
84 {
85  std::string m_ModelPath;
86  std::vector<std::string> m_InputBindings;
87  std::vector<armnn::TensorShape> m_InputShapes;
88  std::vector<std::string> m_OutputBindings;
89  std::vector<armnn::BackendId> m_ComputeDevices;
90  std::string m_DynamicBackendsPath;
91  size_t m_SubgraphId;
102  unsigned int m_NumberOfThreads;
103  std::string m_MLGOTuningFilePath;
104 
105 
107  : m_ComputeDevices{}
108  , m_SubgraphId(0)
109  , m_IsModelBinary(true)
111  , m_EnableFp16TurboMode(false)
112  , m_EnableBf16TurboMode(false)
114  , m_ParseUnsupported(false)
115  , m_InferOutputShape(false)
116  , m_EnableFastMath(false)
117  , m_SaveCachedNetwork(false)
119  , m_NumberOfThreads(0)
121  {}
122 };
123 
124 } // namespace InferenceModelInternal
125 
126 template <typename IParser>
128 {
129 public:
131 
132  static armnn::INetworkPtr Create(const Params& params,
133  std::vector<armnn::BindingPointInfo>& inputBindings,
134  std::vector<armnn::BindingPointInfo>& outputBindings)
135  {
136  const std::string& modelPath = params.m_ModelPath;
137 
138  // Create a network from a file on disk
139  auto parser(IParser::Create());
140 
141  std::map<std::string, armnn::TensorShape> inputShapes;
142  if (!params.m_InputShapes.empty())
143  {
144  const size_t numInputShapes = params.m_InputShapes.size();
145  const size_t numInputBindings = params.m_InputBindings.size();
146  if (numInputShapes < numInputBindings)
147  {
148  throw armnn::Exception(fmt::format(
149  "Not every input has its tensor shape specified: expected={0}, got={1}",
150  numInputBindings, numInputShapes));
151  }
152 
153  for (size_t i = 0; i < numInputShapes; i++)
154  {
155  inputShapes[params.m_InputBindings[i]] = params.m_InputShapes[i];
156  }
157  }
158 
159  std::vector<std::string> requestedOutputs = params.m_OutputBindings;
160  armnn::INetworkPtr network{nullptr, [](armnn::INetwork *){}};
161 
162  {
163  ARMNN_SCOPED_HEAP_PROFILING("Parsing");
164  // Handle text and binary input differently by calling the corresponding parser function
165  network = (params.m_IsModelBinary ?
166  parser->CreateNetworkFromBinaryFile(modelPath.c_str(), inputShapes, requestedOutputs) :
167  parser->CreateNetworkFromTextFile(modelPath.c_str(), inputShapes, requestedOutputs));
168  }
169 
170  for (const std::string& inputLayerName : params.m_InputBindings)
171  {
172  inputBindings.push_back(parser->GetNetworkInputBindingInfo(inputLayerName));
173  }
174 
175  for (const std::string& outputLayerName : params.m_OutputBindings)
176  {
177  outputBindings.push_back(parser->GetNetworkOutputBindingInfo(outputLayerName));
178  }
179 
180  return network;
181  }
182 };
183 
184 #if defined(ARMNN_SERIALIZER)
185 template <>
186 struct CreateNetworkImpl<armnnDeserializer::IDeserializer>
187 {
188 public:
189  using IParser = armnnDeserializer::IDeserializer;
191 
192  static armnn::INetworkPtr Create(const Params& params,
193  std::vector<armnn::BindingPointInfo>& inputBindings,
194  std::vector<armnn::BindingPointInfo>& outputBindings)
195  {
196  auto parser(IParser::Create());
197  ARMNN_ASSERT(parser);
198 
199  armnn::INetworkPtr network{nullptr, [](armnn::INetwork *){}};
200 
201  {
202  ARMNN_SCOPED_HEAP_PROFILING("Parsing");
203 
204  std::error_code errorCode;
205  fs::path pathToFile(params.m_ModelPath);
206  if (!fs::exists(pathToFile, errorCode))
207  {
208  throw armnn::FileNotFoundException(fmt::format("Cannot find the file ({0}) errorCode: {1} {2}",
209  params.m_ModelPath,
210  errorCode.message(),
211  CHECK_LOCATION().AsString()));
212  }
213  std::ifstream file(params.m_ModelPath, std::ios::binary);
214 
215  network = parser->CreateNetworkFromBinary(file);
216  }
217 
218  unsigned int subgraphId = armnn::numeric_cast<unsigned int>(params.m_SubgraphId);
219 
220  for (const std::string& inputLayerName : params.m_InputBindings)
221  {
223  parser->GetNetworkInputBindingInfo(subgraphId, inputLayerName);
224  inputBindings.push_back(std::make_pair(inputBinding.m_BindingId, inputBinding.m_TensorInfo));
225  }
226 
227  for (const std::string& outputLayerName : params.m_OutputBindings)
228  {
230  parser->GetNetworkOutputBindingInfo(subgraphId, outputLayerName);
231  outputBindings.push_back(std::make_pair(outputBinding.m_BindingId, outputBinding.m_TensorInfo));
232  }
233 
234  return network;
235  }
236 };
237 #endif
238 
239 #if defined(ARMNN_TF_LITE_PARSER)
240 template <>
241 struct CreateNetworkImpl<armnnTfLiteParser::ITfLiteParser>
242 {
243 public:
244  using IParser = armnnTfLiteParser::ITfLiteParser;
246 
247  static armnn::INetworkPtr Create(const Params& params,
248  std::vector<armnn::BindingPointInfo>& inputBindings,
249  std::vector<armnn::BindingPointInfo>& outputBindings)
250  {
251  const std::string& modelPath = params.m_ModelPath;
252 
253  // Create a network from a file on disk
254  IParser::TfLiteParserOptions options;
255  options.m_StandInLayerForUnsupported = params.m_ParseUnsupported;
256  options.m_InferAndValidate = params.m_InferOutputShape;
257  auto parser(IParser::Create(options));
258 
259  armnn::INetworkPtr network{nullptr, [](armnn::INetwork *){}};
260 
261  {
262  ARMNN_SCOPED_HEAP_PROFILING("Parsing");
263  network = parser->CreateNetworkFromBinaryFile(modelPath.c_str());
264  }
265 
266  for (const std::string& inputLayerName : params.m_InputBindings)
267  {
268  armnn::BindingPointInfo inputBinding =
269  parser->GetNetworkInputBindingInfo(params.m_SubgraphId, inputLayerName);
270  inputBindings.push_back(inputBinding);
271  }
272 
273  for (const std::string& outputLayerName : params.m_OutputBindings)
274  {
275  armnn::BindingPointInfo outputBinding =
276  parser->GetNetworkOutputBindingInfo(params.m_SubgraphId, outputLayerName);
277  outputBindings.push_back(outputBinding);
278  }
279 
280  return network;
281  }
282 };
283 #endif
284 
285 #if defined(ARMNN_ONNX_PARSER)
286 template <>
287 struct CreateNetworkImpl<armnnOnnxParser::IOnnxParser>
288 {
289 public:
290  using IParser = armnnOnnxParser::IOnnxParser;
293 
294  static armnn::INetworkPtr Create(const Params& params,
295  std::vector<BindingPointInfo>& inputBindings,
296  std::vector<BindingPointInfo>& outputBindings)
297  {
298  const std::string& modelPath = params.m_ModelPath;
299 
300  // Create a network from a file on disk
301  auto parser(IParser::Create());
302 
303  armnn::INetworkPtr network{nullptr, [](armnn::INetwork *){}};
304 
305  {
306  ARMNN_SCOPED_HEAP_PROFILING("Parsing");
307  network = (params.m_IsModelBinary ?
308  parser->CreateNetworkFromBinaryFile(modelPath.c_str()) :
309  parser->CreateNetworkFromTextFile(modelPath.c_str()));
310  }
311 
312  for (const std::string& inputLayerName : params.m_InputBindings)
313  {
314  BindingPointInfo inputBinding = parser->GetNetworkInputBindingInfo(inputLayerName);
315  inputBindings.push_back(inputBinding);
316  }
317 
318  for (const std::string& outputLayerName : params.m_OutputBindings)
319  {
320  BindingPointInfo outputBinding = parser->GetNetworkOutputBindingInfo(outputLayerName);
321  outputBindings.push_back(outputBinding);
322  }
323 
324  return network;
325  }
326 };
327 #endif
328 
329 
330 
331 template <typename IParser, typename TDataType>
333 {
334 public:
335  using DataType = TDataType;
338  using TContainer = mapbox::util::variant<std::vector<float>, std::vector<int>, std::vector<unsigned char>>;
339 
341  {
342  std::string m_ModelDir;
343  std::vector<std::string> m_ComputeDevices;
348  std::string m_Labels;
349 
350  std::vector<armnn::BackendId> GetComputeDevicesAsBackendIds()
351  {
352  std::vector<armnn::BackendId> backendIds;
353  std::copy(m_ComputeDevices.begin(), m_ComputeDevices.end(), std::back_inserter(backendIds));
354  return backendIds;
355  }
356  };
357 
358  static void AddCommandLineOptions(cxxopts::Options& options,
359  CommandLineOptions& cLineOptions, std::vector<std::string>& required)
360  {
361  const std::vector<std::string> defaultComputes = { "CpuAcc", "CpuRef" };
362 
363  const std::string backendsMessage = "Which device to run layers on by default. Possible choices: "
365 
366  options
367  .allow_unrecognised_options()
368  .add_options()
369  ("m,model-dir", "Path to directory containing model files (.caffemodel/.prototxt/.tflite)",
370  cxxopts::value<std::string>(cLineOptions.m_ModelDir))
371  ("c,compute", backendsMessage.c_str(),
372  cxxopts::value<std::vector<std::string>>(cLineOptions.m_ComputeDevices)->default_value("CpuRef"))
373  ("b,dynamic-backends-path",
374  "Path where to load any available dynamic backend from. "
375  "If left empty (the default), dynamic backends will not be used.",
376  cxxopts::value(cLineOptions.m_DynamicBackendsPath))
377  ("l,labels",
378  "Text file containing one image filename - correct label pair per line, "
379  "used to test the accuracy of the network.", cxxopts::value<std::string>(cLineOptions.m_Labels))
380  ("v,visualize-optimized-model",
381  "Produce a dot file useful for visualizing the graph post optimization."
382  "The file will have the same name as the model with the .dot extention.",
383  cxxopts::value<bool>(cLineOptions.m_VisualizePostOptimizationModel)->default_value("false"))
384  ("fp16-turbo-mode",
385  "If this option is enabled FP32 layers, weights and biases will be converted "
386  "to FP16 where the backend supports it.",
387  cxxopts::value<bool>(cLineOptions.m_EnableFp16TurboMode)->default_value("false"))
388  ("bf16-turbo-mode",
389  "If this option is enabled FP32 layers, weights and biases will be converted "
390  "to BF16 where the backend supports it.",
391  cxxopts::value<bool>(cLineOptions.m_EnableBf16TurboMode)->default_value("false"));
392 
393  required.emplace_back("model-dir");
394  }
395 
396  InferenceModel(const Params& params,
397  bool enableProfiling,
398  const std::string& dynamicBackendsPath,
399  const std::shared_ptr<armnn::IRuntime>& runtime = nullptr)
400  : m_EnableProfiling(enableProfiling)
401  , m_DynamicBackendsPath(dynamicBackendsPath)
402  {
403  if (runtime)
404  {
405  m_Runtime = runtime;
406  }
407  else
408  {
410  options.m_EnableGpuProfiling = m_EnableProfiling;
412  m_Runtime = std::move(armnn::IRuntime::Create(options));
413  }
414 
415  std::string invalidBackends;
416  if (!CheckRequestedBackendsAreValid(params.m_ComputeDevices, armnn::Optional<std::string&>(invalidBackends)))
417  {
418  throw armnn::Exception("Some backend IDs are invalid: " + invalidBackends);
419  }
420 
421  const auto parsing_start_time = armnn::GetTimeNow();
423 
424  ARMNN_LOG(info) << "Network parsing time: " << std::setprecision(2)
425  << std::fixed << armnn::GetTimeDuration(parsing_start_time).count() << " ms\n";
426 
428  {
429  ARMNN_SCOPED_HEAP_PROFILING("Optimizing");
430 
431  armnn::OptimizerOptions options;
432  options.m_ReduceFp32ToFp16 = params.m_EnableFp16TurboMode;
433  options.m_ReduceFp32ToBf16 = params.m_EnableBf16TurboMode;
434  options.m_Debug = params.m_PrintIntermediateLayers;
435 
436  armnn::BackendOptions gpuAcc("GpuAcc",
437  {
438  { "FastMathEnabled", params.m_EnableFastMath },
439  { "SaveCachedNetwork", params.m_SaveCachedNetwork },
440  { "CachedNetworkFilePath", params.m_CachedNetworkFilePath },
441  { "MLGOTuningFilePath", params.m_MLGOTuningFilePath }
442  });
443 
444  armnn::BackendOptions cpuAcc("CpuAcc",
445  {
446  { "FastMathEnabled", params.m_EnableFastMath },
447  { "NumberOfThreads", params.m_NumberOfThreads }
448  });
449  options.m_ModelOptions.push_back(gpuAcc);
450  options.m_ModelOptions.push_back(cpuAcc);
451 
452  const auto optimization_start_time = armnn::GetTimeNow();
453  optNet = armnn::Optimize(*network, params.m_ComputeDevices, m_Runtime->GetDeviceSpec(), options);
454 
455  ARMNN_LOG(info) << "Optimization time: " << std::setprecision(2)
456  << std::fixed << armnn::GetTimeDuration(optimization_start_time).count() << " ms\n";
457 
458  if (!optNet)
459  {
460  throw armnn::Exception("Optimize returned nullptr");
461  }
462  }
463 
465  {
466  fs::path filename = params.m_ModelPath;
467  filename.replace_extension("dot");
468  std::fstream file(filename.c_str(), std::ios_base::out);
469  optNet->SerializeToDot(file);
470  }
471 
472  armnn::Status ret;
473  {
474  ARMNN_SCOPED_HEAP_PROFILING("LoadNetwork");
475 
476  const auto loading_start_time = armnn::GetTimeNow();
477  ret = m_Runtime->LoadNetwork(m_NetworkIdentifier, std::move(optNet));
478 
479  ARMNN_LOG(info) << "Network loading time: " << std::setprecision(2)
480  << std::fixed << armnn::GetTimeDuration(loading_start_time).count() << " ms\n";
481  }
482 
483  if (ret == armnn::Status::Failure)
484  {
485  throw armnn::Exception("IRuntime::LoadNetwork failed");
486  }
487  }
488 
489  void CheckInputIndexIsValid(unsigned int inputIndex) const
490  {
491  if (m_InputBindings.size() < inputIndex + 1)
492  {
493  throw armnn::Exception(fmt::format("Input index out of range: {}", inputIndex));
494  }
495  }
496 
497  void CheckOutputIndexIsValid(unsigned int outputIndex) const
498  {
499  if (m_OutputBindings.size() < outputIndex + 1)
500  {
501  throw armnn::Exception(fmt::format("Output index out of range: {}", outputIndex));
502  }
503  }
504 
505  unsigned int GetInputSize(unsigned int inputIndex = 0u) const
506  {
507  CheckInputIndexIsValid(inputIndex);
508  return m_InputBindings[inputIndex].second.GetNumElements();
509  }
510 
511  unsigned int GetOutputSize(unsigned int outputIndex = 0u) const
512  {
513  CheckOutputIndexIsValid(outputIndex);
514  return m_OutputBindings[outputIndex].second.GetNumElements();
515  }
516 
517  std::chrono::duration<double, std::milli> Run(
518  const std::vector<TContainer>& inputContainers,
519  std::vector<TContainer>& outputContainers)
520  {
521  for (unsigned int i = 0; i < outputContainers.size(); ++i)
522  {
523  const unsigned int expectedOutputDataSize = GetOutputSize(i);
524 
525  mapbox::util::apply_visitor([expectedOutputDataSize, i](auto&& value)
526  {
527  const unsigned int actualOutputDataSize = armnn::numeric_cast<unsigned int>(value.size());
528  if (actualOutputDataSize < expectedOutputDataSize)
529  {
530  unsigned int outputIndex = i;
531  throw armnn::Exception(
532  fmt::format("Not enough data for output #{0}: expected "
533  "{1} elements, got {2}", outputIndex, expectedOutputDataSize, actualOutputDataSize));
534  }
535  },
536  outputContainers[i]);
537  }
538 
539  std::shared_ptr<armnn::IProfiler> profiler = m_Runtime->GetProfiler(m_NetworkIdentifier);
540  if (profiler)
541  {
542  profiler->EnableProfiling(m_EnableProfiling);
543  }
544 
545  // Start timer to record inference time in EnqueueWorkload (in milliseconds)
546  const auto start_time = armnn::GetTimeNow();
547 
548  armnn::Status ret = m_Runtime->EnqueueWorkload(m_NetworkIdentifier,
549  MakeInputTensors(inputContainers),
550  MakeOutputTensors(outputContainers));
551 
552  const auto duration = armnn::GetTimeDuration(start_time);
553 
554  // if profiling is enabled print out the results
555  if (profiler && profiler->IsProfilingEnabled())
556  {
557  profiler->Print(std::cout);
558  }
559 
560  if (ret == armnn::Status::Failure)
561  {
562  throw armnn::Exception("IRuntime::EnqueueWorkload failed");
563  }
564  else
565  {
566  return duration;
567  }
568  }
569 
570  const armnn::BindingPointInfo& GetInputBindingInfo(unsigned int inputIndex = 0u) const
571  {
572  CheckInputIndexIsValid(inputIndex);
573  return m_InputBindings[inputIndex];
574  }
575 
576  const std::vector<armnn::BindingPointInfo>& GetInputBindingInfos() const
577  {
578  return m_InputBindings;
579  }
580 
581  const armnn::BindingPointInfo& GetOutputBindingInfo(unsigned int outputIndex = 0u) const
582  {
583  CheckOutputIndexIsValid(outputIndex);
584  return m_OutputBindings[outputIndex];
585  }
586 
587  const std::vector<armnn::BindingPointInfo>& GetOutputBindingInfos() const
588  {
589  return m_OutputBindings;
590  }
591 
592  QuantizationParams GetQuantizationParams(unsigned int outputIndex = 0u) const
593  {
594  CheckOutputIndexIsValid(outputIndex);
595  return std::make_pair(m_OutputBindings[outputIndex].second.GetQuantizationScale(),
596  m_OutputBindings[outputIndex].second.GetQuantizationOffset());
597  }
598 
599  QuantizationParams GetInputQuantizationParams(unsigned int inputIndex = 0u) const
600  {
601  CheckInputIndexIsValid(inputIndex);
602  return std::make_pair(m_InputBindings[inputIndex].second.GetQuantizationScale(),
603  m_InputBindings[inputIndex].second.GetQuantizationOffset());
604  }
605 
606  std::vector<QuantizationParams> GetAllQuantizationParams() const
607  {
608  std::vector<QuantizationParams> quantizationParams;
609  for (unsigned int i = 0u; i < m_OutputBindings.size(); i++)
610  {
611  quantizationParams.push_back(GetQuantizationParams(i));
612  }
613  return quantizationParams;
614  }
615 
616 private:
617  armnn::NetworkId m_NetworkIdentifier;
618  std::shared_ptr<armnn::IRuntime> m_Runtime;
619 
620  std::vector<armnn::BindingPointInfo> m_InputBindings;
621  std::vector<armnn::BindingPointInfo> m_OutputBindings;
622  bool m_EnableProfiling;
623  std::string m_DynamicBackendsPath;
624 
625  template<typename TContainer>
626  armnn::InputTensors MakeInputTensors(const std::vector<TContainer>& inputDataContainers)
627  {
628  return armnnUtils::MakeInputTensors(m_InputBindings, inputDataContainers);
629  }
630 
631  template<typename TContainer>
632  armnn::OutputTensors MakeOutputTensors(std::vector<TContainer>& outputDataContainers)
633  {
634  return armnnUtils::MakeOutputTensors(m_OutputBindings, outputDataContainers);
635  }
636 };
ModelOptions m_ModelOptions
Definition: INetwork.hpp:168
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:37
BackendIdSet GetBackendIds() const
std::chrono::duration< double, std::milli > GetTimeDuration(std::chrono::high_resolution_clock::time_point start_time)
Definition: Timer.hpp:19
std::unordered_set< BackendId > BackendIdSet
Definition: BackendId.hpp:191
QuantizationParams GetInputQuantizationParams(unsigned int inputIndex=0u) const
const std::vector< armnn::BindingPointInfo > & GetOutputBindingInfos() const
armnn::InputTensors MakeInputTensors(const std::vector< armnn::BindingPointInfo > &inputBindings, const std::vector< std::reference_wrapper< TContainer >> &inputDataContainers)
static void AddCommandLineOptions(cxxopts::Options &options, CommandLineOptions &cLineOptions, std::vector< std::string > &required)
const armnn::BindingPointInfo & GetOutputBindingInfo(unsigned int outputIndex=0u) const
#define ARMNN_LOG(severity)
Definition: Logging.hpp:202
Main network class which provides the interface for building up a neural network. ...
Definition: INetwork.hpp:178
BackendRegistry & BackendRegistryInstance()
std::vector< std::pair< LayerBindingId, class ConstTensor > > InputTensors
Definition: Tensor.hpp:340
const armnn::BindingPointInfo & GetInputBindingInfo(unsigned int inputIndex=0u) const
armnn::BindingPointInfo BindingPointInfo
int NetworkId
Definition: IRuntime.hpp:20
std::chrono::high_resolution_clock::time_point GetTimeNow()
Definition: Timer.hpp:14
InferenceModelInternal::QuantizationParams QuantizationParams
std::string GetBackendIdsAsString() const
void CheckInputIndexIsValid(unsigned int inputIndex) const
unsigned int GetOutputSize(unsigned int outputIndex=0u) const
std::vector< std::string > m_InputBindings
InferenceModel(const Params &params, bool enableProfiling, const std::string &dynamicBackendsPath, const std::shared_ptr< armnn::IRuntime > &runtime=nullptr)
std::vector< armnn::TensorShape > m_InputShapes
armnn::InputTensors MakeInputTensors(const std::vector< armnn::BindingPointInfo > &inputBindings, const std::vector< TContainer > &inputDataContainers)
IOptimizedNetworkPtr Optimize(const INetwork &network, const std::vector< BackendId > &backendPreferences, const IDeviceSpec &deviceSpec, const OptimizerOptions &options=OptimizerOptions(), Optional< std::vector< std::string > &> messages=EmptyOptional())
Create an optimized version of the network.
Definition: Network.cpp:1502
std::vector< std::string > m_OutputBindings
std::vector< armnn::BackendId > m_ComputeDevices
#define ARMNN_SCOPED_HEAP_PROFILING(TAG)
std::vector< std::pair< LayerBindingId, class Tensor > > OutputTensors
Definition: Tensor.hpp:341
Status
enumeration
Definition: Types.hpp:26
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
Definition: INetwork.hpp:174
QuantizationParams GetQuantizationParams(unsigned int outputIndex=0u) const
#define ARMNN_ASSERT(COND)
Definition: Assert.hpp:14
std::vector< QuantizationParams > GetAllQuantizationParams() const
std::pair< float, int32_t > QuantizationParams
mapbox::util::variant< std::vector< float >, std::vector< int >, std::vector< unsigned char > > TContainer
#define CHECK_LOCATION()
Definition: Exceptions.hpp:197
armnn::OutputTensors MakeOutputTensors(const std::vector< armnn::BindingPointInfo > &outputBindings, std::vector< TContainer > &outputDataContainers)
Struct for the users to pass backend specific options.
std::string m_DynamicBackendsPath
Setting this value will override the paths set by the DYNAMIC_BACKEND_PATHS compiler directive Only a...
Definition: IRuntime.hpp:60
bool m_EnableGpuProfiling
Setting this flag will allow the user to obtain GPU profiling information from the runtime...
Definition: IRuntime.hpp:56
EmptyOptional is used to initialize the Optional class in case we want to have default value for an O...
Definition: Optional.hpp:32
std::pair< armnn::LayerBindingId, armnn::TensorInfo > BindingPointInfo
Definition: Tensor.hpp:261
static armnn::INetworkPtr Create(const Params &params, std::vector< armnn::BindingPointInfo > &inputBindings, std::vector< armnn::BindingPointInfo > &outputBindings)
std::chrono::duration< double, std::milli > Run(const std::vector< TContainer > &inputContainers, std::vector< TContainer > &outputContainers)
std::vector< armnn::BackendId > GetComputeDevicesAsBackendIds()
Base class for all ArmNN exceptions so that users can filter to just those.
Definition: Exceptions.hpp:46
std::vector< std::string > m_ComputeDevices
unsigned int GetInputSize(unsigned int inputIndex=0u) const
armnn::OutputTensors MakeOutputTensors(const std::vector< armnn::BindingPointInfo > &outputBindings, const std::vector< std::reference_wrapper< TContainer >> &outputDataContainers)
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
Definition: NumericCast.hpp:35
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
Definition: INetwork.hpp:173
void CheckOutputIndexIsValid(unsigned int outputIndex) const
const std::vector< armnn::BindingPointInfo > & GetInputBindingInfos() const