ArmNN
 21.05
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;
105 
106 
108  : m_ComputeDevices{}
109  , m_SubgraphId(0)
110  , m_IsModelBinary(true)
112  , m_EnableFp16TurboMode(false)
113  , m_EnableBf16TurboMode(false)
115  , m_ParseUnsupported(false)
116  , m_InferOutputShape(false)
117  , m_EnableFastMath(false)
118  , m_SaveCachedNetwork(false)
120  , m_NumberOfThreads(0)
122  , m_AsyncEnabled(false)
123  {}
124 };
125 
126 } // namespace InferenceModelInternal
127 
128 template <typename IParser>
130 {
131 public:
133 
134  static armnn::INetworkPtr Create(const Params& params,
135  std::vector<armnn::BindingPointInfo>& inputBindings,
136  std::vector<armnn::BindingPointInfo>& outputBindings)
137  {
138  const std::string& modelPath = params.m_ModelPath;
139 
140  // Create a network from a file on disk
141  auto parser(IParser::Create());
142 
143  std::map<std::string, armnn::TensorShape> inputShapes;
144  if (!params.m_InputShapes.empty())
145  {
146  const size_t numInputShapes = params.m_InputShapes.size();
147  const size_t numInputBindings = params.m_InputBindings.size();
148  if (numInputShapes < numInputBindings)
149  {
150  throw armnn::Exception(fmt::format(
151  "Not every input has its tensor shape specified: expected={0}, got={1}",
152  numInputBindings, numInputShapes));
153  }
154 
155  for (size_t i = 0; i < numInputShapes; i++)
156  {
157  inputShapes[params.m_InputBindings[i]] = params.m_InputShapes[i];
158  }
159  }
160 
161  std::vector<std::string> requestedOutputs = params.m_OutputBindings;
162  armnn::INetworkPtr network{nullptr, [](armnn::INetwork *){}};
163 
164  {
165  ARMNN_SCOPED_HEAP_PROFILING("Parsing");
166  // Handle text and binary input differently by calling the corresponding parser function
167  network = (params.m_IsModelBinary ?
168  parser->CreateNetworkFromBinaryFile(modelPath.c_str(), inputShapes, requestedOutputs) :
169  parser->CreateNetworkFromTextFile(modelPath.c_str(), inputShapes, requestedOutputs));
170  }
171 
172  for (const std::string& inputLayerName : params.m_InputBindings)
173  {
174  inputBindings.push_back(parser->GetNetworkInputBindingInfo(inputLayerName));
175  }
176 
177  for (const std::string& outputLayerName : params.m_OutputBindings)
178  {
179  outputBindings.push_back(parser->GetNetworkOutputBindingInfo(outputLayerName));
180  }
181 
182  return network;
183  }
184 };
185 
186 #if defined(ARMNN_SERIALIZER)
187 template <>
188 struct CreateNetworkImpl<armnnDeserializer::IDeserializer>
189 {
190 public:
191  using IParser = armnnDeserializer::IDeserializer;
193 
194  static armnn::INetworkPtr Create(const Params& params,
195  std::vector<armnn::BindingPointInfo>& inputBindings,
196  std::vector<armnn::BindingPointInfo>& outputBindings)
197  {
198  auto parser(IParser::Create());
199  ARMNN_ASSERT(parser);
200 
201  armnn::INetworkPtr network{nullptr, [](armnn::INetwork *){}};
202 
203  {
204  ARMNN_SCOPED_HEAP_PROFILING("Parsing");
205 
206  std::error_code errorCode;
207  fs::path pathToFile(params.m_ModelPath);
208  if (!fs::exists(pathToFile, errorCode))
209  {
210  throw armnn::FileNotFoundException(fmt::format("Cannot find the file ({0}) errorCode: {1} {2}",
211  params.m_ModelPath,
212  errorCode.message(),
213  CHECK_LOCATION().AsString()));
214  }
215  std::ifstream file(params.m_ModelPath, std::ios::binary);
216 
217  network = parser->CreateNetworkFromBinary(file);
218  }
219 
220  unsigned int subgraphId = armnn::numeric_cast<unsigned int>(params.m_SubgraphId);
221 
222  for (const std::string& inputLayerName : params.m_InputBindings)
223  {
225  parser->GetNetworkInputBindingInfo(subgraphId, inputLayerName);
226  inputBindings.push_back(std::make_pair(inputBinding.m_BindingId, inputBinding.m_TensorInfo));
227  }
228 
229  for (const std::string& outputLayerName : params.m_OutputBindings)
230  {
232  parser->GetNetworkOutputBindingInfo(subgraphId, outputLayerName);
233  outputBindings.push_back(std::make_pair(outputBinding.m_BindingId, outputBinding.m_TensorInfo));
234  }
235 
236  return network;
237  }
238 };
239 #endif
240 
241 #if defined(ARMNN_TF_LITE_PARSER)
242 template <>
243 struct CreateNetworkImpl<armnnTfLiteParser::ITfLiteParser>
244 {
245 public:
246  using IParser = armnnTfLiteParser::ITfLiteParser;
248 
249  static armnn::INetworkPtr Create(const Params& params,
250  std::vector<armnn::BindingPointInfo>& inputBindings,
251  std::vector<armnn::BindingPointInfo>& outputBindings)
252  {
253  const std::string& modelPath = params.m_ModelPath;
254 
255  // Create a network from a file on disk
256  IParser::TfLiteParserOptions options;
257  options.m_StandInLayerForUnsupported = params.m_ParseUnsupported;
258  options.m_InferAndValidate = params.m_InferOutputShape;
259  auto parser(IParser::Create(options));
260 
261  armnn::INetworkPtr network{nullptr, [](armnn::INetwork *){}};
262 
263  {
264  ARMNN_SCOPED_HEAP_PROFILING("Parsing");
265  network = parser->CreateNetworkFromBinaryFile(modelPath.c_str());
266  }
267 
268  for (const std::string& inputLayerName : params.m_InputBindings)
269  {
270  armnn::BindingPointInfo inputBinding =
271  parser->GetNetworkInputBindingInfo(params.m_SubgraphId, inputLayerName);
272  inputBindings.push_back(inputBinding);
273  }
274 
275  for (const std::string& outputLayerName : params.m_OutputBindings)
276  {
277  armnn::BindingPointInfo outputBinding =
278  parser->GetNetworkOutputBindingInfo(params.m_SubgraphId, outputLayerName);
279  outputBindings.push_back(outputBinding);
280  }
281 
282  return network;
283  }
284 };
285 #endif
286 
287 #if defined(ARMNN_ONNX_PARSER)
288 template <>
289 struct CreateNetworkImpl<armnnOnnxParser::IOnnxParser>
290 {
291 public:
292  using IParser = armnnOnnxParser::IOnnxParser;
295 
296  static armnn::INetworkPtr Create(const Params& params,
297  std::vector<BindingPointInfo>& inputBindings,
298  std::vector<BindingPointInfo>& outputBindings)
299  {
300  const std::string& modelPath = params.m_ModelPath;
301 
302  // Create a network from a file on disk
303  auto parser(IParser::Create());
304 
305  armnn::INetworkPtr network{nullptr, [](armnn::INetwork *){}};
306 
307  {
308  ARMNN_SCOPED_HEAP_PROFILING("Parsing");
309  network = (params.m_IsModelBinary ?
310  parser->CreateNetworkFromBinaryFile(modelPath.c_str()) :
311  parser->CreateNetworkFromTextFile(modelPath.c_str()));
312  }
313 
314  for (const std::string& inputLayerName : params.m_InputBindings)
315  {
316  BindingPointInfo inputBinding = parser->GetNetworkInputBindingInfo(inputLayerName);
317  inputBindings.push_back(inputBinding);
318  }
319 
320  for (const std::string& outputLayerName : params.m_OutputBindings)
321  {
322  BindingPointInfo outputBinding = parser->GetNetworkOutputBindingInfo(outputLayerName);
323  outputBindings.push_back(outputBinding);
324  }
325 
326  return network;
327  }
328 };
329 #endif
330 
331 
332 
333 template <typename IParser, typename TDataType>
335 {
336 public:
337  using DataType = TDataType;
340  using TContainer
341  = mapbox::util::variant<std::vector<float>, std::vector<int>, std::vector<unsigned char>, std::vector<int8_t>>;
342 
344  {
345  std::string m_ModelDir;
346  std::vector<std::string> m_ComputeDevices;
351  std::string m_Labels;
352 
353  std::vector<armnn::BackendId> GetComputeDevicesAsBackendIds()
354  {
355  std::vector<armnn::BackendId> backendIds;
356  std::copy(m_ComputeDevices.begin(), m_ComputeDevices.end(), std::back_inserter(backendIds));
357  return backendIds;
358  }
359  };
360 
361  static void AddCommandLineOptions(cxxopts::Options& options,
362  CommandLineOptions& cLineOptions, std::vector<std::string>& required)
363  {
364  const std::vector<std::string> defaultComputes = { "CpuAcc", "CpuRef" };
365 
366  const std::string backendsMessage = "Which device to run layers on by default. Possible choices: "
368 
369  options
370  .allow_unrecognised_options()
371  .add_options()
372  ("m,model-dir", "Path to directory containing model files (.prototxt/.tflite)",
373  cxxopts::value<std::string>(cLineOptions.m_ModelDir))
374  ("c,compute", backendsMessage.c_str(),
375  cxxopts::value<std::vector<std::string>>(cLineOptions.m_ComputeDevices)->default_value("CpuRef"))
376  ("b,dynamic-backends-path",
377  "Path where to load any available dynamic backend from. "
378  "If left empty (the default), dynamic backends will not be used.",
379  cxxopts::value(cLineOptions.m_DynamicBackendsPath))
380  ("l,labels",
381  "Text file containing one image filename - correct label pair per line, "
382  "used to test the accuracy of the network.", cxxopts::value<std::string>(cLineOptions.m_Labels))
383  ("v,visualize-optimized-model",
384  "Produce a dot file useful for visualizing the graph post optimization."
385  "The file will have the same name as the model with the .dot extention.",
386  cxxopts::value<bool>(cLineOptions.m_VisualizePostOptimizationModel)->default_value("false"))
387  ("fp16-turbo-mode",
388  "If this option is enabled FP32 layers, weights and biases will be converted "
389  "to FP16 where the backend supports it.",
390  cxxopts::value<bool>(cLineOptions.m_EnableFp16TurboMode)->default_value("false"))
391  ("bf16-turbo-mode",
392  "If this option is enabled FP32 layers, weights and biases will be converted "
393  "to BF16 where the backend supports it.",
394  cxxopts::value<bool>(cLineOptions.m_EnableBf16TurboMode)->default_value("false"));
395 
396  required.emplace_back("model-dir");
397  }
398 
399  InferenceModel(const Params& params,
400  bool enableProfiling,
401  const std::string& dynamicBackendsPath,
402  const std::shared_ptr<armnn::IRuntime>& runtime = nullptr)
403  : m_EnableProfiling(enableProfiling)
404  , m_DynamicBackendsPath(dynamicBackendsPath)
405  {
406  if (runtime)
407  {
408  m_Runtime = runtime;
409  }
410  else
411  {
413  options.m_EnableGpuProfiling = m_EnableProfiling;
415  m_Runtime = std::move(armnn::IRuntime::Create(options));
416  }
417 
418  std::string invalidBackends;
419  if (!CheckRequestedBackendsAreValid(params.m_ComputeDevices, armnn::Optional<std::string&>(invalidBackends)))
420  {
421  throw armnn::Exception("Some backend IDs are invalid: " + invalidBackends);
422  }
423 
425  {
426  const auto parsing_start_time = armnn::GetTimeNow();
428 
429  ARMNN_LOG(info) << "Network parsing time: " << std::setprecision(2)
430  << std::fixed << armnn::GetTimeDuration(parsing_start_time).count() << " ms\n";
431 
432  ARMNN_SCOPED_HEAP_PROFILING("Optimizing");
433 
434  armnn::OptimizerOptions options;
435  options.m_ReduceFp32ToFp16 = params.m_EnableFp16TurboMode;
436  options.m_ReduceFp32ToBf16 = params.m_EnableBf16TurboMode;
437  options.m_Debug = params.m_PrintIntermediateLayers;
438 
439  armnn::BackendOptions gpuAcc("GpuAcc",
440  {
441  { "FastMathEnabled", params.m_EnableFastMath },
442  { "SaveCachedNetwork", params.m_SaveCachedNetwork },
443  { "CachedNetworkFilePath", params.m_CachedNetworkFilePath },
444  { "MLGOTuningFilePath", params.m_MLGOTuningFilePath }
445  });
446 
447  armnn::BackendOptions cpuAcc("CpuAcc",
448  {
449  { "FastMathEnabled", params.m_EnableFastMath },
450  { "NumberOfThreads", params.m_NumberOfThreads }
451  });
452  options.m_ModelOptions.push_back(gpuAcc);
453  options.m_ModelOptions.push_back(cpuAcc);
454 
455  const auto optimization_start_time = armnn::GetTimeNow();
456  optNet = armnn::Optimize(*network, params.m_ComputeDevices, m_Runtime->GetDeviceSpec(), options);
457 
458  ARMNN_LOG(info) << "Optimization time: " << std::setprecision(2)
459  << std::fixed << armnn::GetTimeDuration(optimization_start_time).count() << " ms\n";
460 
461  if (!optNet)
462  {
463  throw armnn::Exception("Optimize returned nullptr");
464  }
465 
466 
467  }
468 
470  {
471  fs::path filename = params.m_ModelPath;
472  filename.replace_extension("dot");
473  std::fstream file(filename.c_str(), std::ios_base::out);
474  optNet->SerializeToDot(file);
475  }
476 
477  armnn::Status ret;
478  {
479  ARMNN_SCOPED_HEAP_PROFILING("LoadNetwork");
480 
481  const auto loading_start_time = armnn::GetTimeNow();
482  armnn::INetworkProperties networkProperties(params.m_AsyncEnabled,
485  std::string errorMessage;
486  ret = m_Runtime->LoadNetwork(m_NetworkIdentifier, std::move(optNet), errorMessage, networkProperties);
487 
488  ARMNN_LOG(info) << "Network loading time: " << std::setprecision(2)
489  << std::fixed << armnn::GetTimeDuration(loading_start_time).count() << " ms\n";
490  }
491 
492  if (ret == armnn::Status::Failure)
493  {
494  throw armnn::Exception("IRuntime::LoadNetwork failed");
495  }
496  }
497 
498  void CheckInputIndexIsValid(unsigned int inputIndex) const
499  {
500  if (m_InputBindings.size() < inputIndex + 1)
501  {
502  throw armnn::Exception(fmt::format("Input index out of range: {}", inputIndex));
503  }
504  }
505 
506  void CheckOutputIndexIsValid(unsigned int outputIndex) const
507  {
508  if (m_OutputBindings.size() < outputIndex + 1)
509  {
510  throw armnn::Exception(fmt::format("Output index out of range: {}", outputIndex));
511  }
512  }
513 
514  unsigned int GetInputSize(unsigned int inputIndex = 0u) const
515  {
516  CheckInputIndexIsValid(inputIndex);
517  return m_InputBindings[inputIndex].second.GetNumElements();
518  }
519 
520  unsigned int GetOutputSize(unsigned int outputIndex = 0u) const
521  {
522  CheckOutputIndexIsValid(outputIndex);
523  return m_OutputBindings[outputIndex].second.GetNumElements();
524  }
525 
526  std::chrono::duration<double, std::milli> Run(
527  const std::vector<TContainer>& inputContainers,
528  std::vector<TContainer>& outputContainers)
529  {
530  for (unsigned int i = 0; i < outputContainers.size(); ++i)
531  {
532  const unsigned int expectedOutputDataSize = GetOutputSize(i);
533 
534  mapbox::util::apply_visitor([expectedOutputDataSize, i](auto&& value)
535  {
536  const unsigned int actualOutputDataSize = armnn::numeric_cast<unsigned int>(value.size());
537  if (actualOutputDataSize < expectedOutputDataSize)
538  {
539  unsigned int outputIndex = i;
540  throw armnn::Exception(
541  fmt::format("Not enough data for output #{0}: expected "
542  "{1} elements, got {2}", outputIndex, expectedOutputDataSize, actualOutputDataSize));
543  }
544  },
545  outputContainers[i]);
546  }
547 
548  std::shared_ptr<armnn::IProfiler> profiler = m_Runtime->GetProfiler(m_NetworkIdentifier);
549  if (profiler)
550  {
551  profiler->EnableProfiling(m_EnableProfiling);
552  }
553 
554  // Start timer to record inference time in EnqueueWorkload (in milliseconds)
555  const auto start_time = armnn::GetTimeNow();
556 
557  armnn::Status ret = m_Runtime->EnqueueWorkload(m_NetworkIdentifier,
558  MakeInputTensors(inputContainers),
559  MakeOutputTensors(outputContainers));
560  const auto duration = armnn::GetTimeDuration(start_time);
561 
562  // if profiling is enabled print out the results
563  if (profiler && profiler->IsProfilingEnabled())
564  {
565  profiler->Print(std::cout);
566  }
567 
568  if (ret == armnn::Status::Failure)
569  {
570  throw armnn::Exception("IRuntime::EnqueueWorkload failed");
571  }
572  else
573  {
574  return duration;
575  }
576  }
577 
578  std::tuple<armnn::profiling::ProfilingGuid, std::chrono::duration<double, std::milli>> RunAsync(
579  armnn::experimental::IWorkingMemHandle& workingMemHandleRef,
580  const std::vector<TContainer>& inputContainers,
581  std::vector<TContainer>& outputContainers)
582  {
583  for (unsigned int i = 0; i < outputContainers.size(); ++i)
584  {
585  const unsigned int expectedOutputDataSize = GetOutputSize(i);
586 
587  mapbox::util::apply_visitor([expectedOutputDataSize, i](auto&& value)
588  {
589  const unsigned int actualOutputDataSize = armnn::numeric_cast<unsigned int>(value.size());
590  if (actualOutputDataSize < expectedOutputDataSize)
591  {
592  unsigned int outputIndex = i;
593  throw armnn::Exception(
594  fmt::format("Not enough data for output #{0}: expected "
595  "{1} elements, got {2}", outputIndex, expectedOutputDataSize, actualOutputDataSize));
596  }
597  },
598  outputContainers[i]);
599  }
600 
601  std::shared_ptr<armnn::IProfiler> profiler = m_Runtime->GetProfiler(m_NetworkIdentifier);
602  if (profiler)
603  {
604  profiler->EnableProfiling(m_EnableProfiling);
605  }
606 
607  // Start timer to record inference time in EnqueueWorkload (in milliseconds)
608  const auto start_time = armnn::GetTimeNow();
609 
610  armnn::Status ret = m_Runtime->Execute(workingMemHandleRef,
611  MakeInputTensors(inputContainers),
612  MakeOutputTensors(outputContainers));
613  auto inferenceID = workingMemHandleRef.GetInferenceId();
614 
615  const auto duration = armnn::GetTimeDuration(start_time);
616 
617  // if profiling is enabled print out the results
618  if (profiler && profiler->IsProfilingEnabled())
619  {
620  profiler->Print(std::cout);
621  }
622 
623  if (ret == armnn::Status::Failure)
624  {
625  throw armnn::Exception(
626  fmt::format("IRuntime::Execute asynchronously failed for network #{0} on inference #{1}",
627  m_NetworkIdentifier, inferenceID));
628  }
629  else
630  {
631  return std::make_tuple(inferenceID, duration);
632  }
633  }
634 
635  const armnn::BindingPointInfo& GetInputBindingInfo(unsigned int inputIndex = 0u) const
636  {
637  CheckInputIndexIsValid(inputIndex);
638  return m_InputBindings[inputIndex];
639  }
640 
641  const std::vector<armnn::BindingPointInfo>& GetInputBindingInfos() const
642  {
643  return m_InputBindings;
644  }
645 
646  const armnn::BindingPointInfo& GetOutputBindingInfo(unsigned int outputIndex = 0u) const
647  {
648  CheckOutputIndexIsValid(outputIndex);
649  return m_OutputBindings[outputIndex];
650  }
651 
652  const std::vector<armnn::BindingPointInfo>& GetOutputBindingInfos() const
653  {
654  return m_OutputBindings;
655  }
656 
657  QuantizationParams GetQuantizationParams(unsigned int outputIndex = 0u) const
658  {
659  CheckOutputIndexIsValid(outputIndex);
660  return std::make_pair(m_OutputBindings[outputIndex].second.GetQuantizationScale(),
661  m_OutputBindings[outputIndex].second.GetQuantizationOffset());
662  }
663 
664  QuantizationParams GetInputQuantizationParams(unsigned int inputIndex = 0u) const
665  {
666  CheckInputIndexIsValid(inputIndex);
667  return std::make_pair(m_InputBindings[inputIndex].second.GetQuantizationScale(),
668  m_InputBindings[inputIndex].second.GetQuantizationOffset());
669  }
670 
671  std::vector<QuantizationParams> GetAllQuantizationParams() const
672  {
673  std::vector<QuantizationParams> quantizationParams;
674  for (unsigned int i = 0u; i < m_OutputBindings.size(); i++)
675  {
676  quantizationParams.push_back(GetQuantizationParams(i));
677  }
678  return quantizationParams;
679  }
680 
681  std::unique_ptr<armnn::experimental::IWorkingMemHandle> CreateWorkingMemHandle()
682  {
683  return m_Runtime->CreateWorkingMemHandle(m_NetworkIdentifier);
684  }
685 
686 private:
687  armnn::NetworkId m_NetworkIdentifier;
688  std::shared_ptr<armnn::IRuntime> m_Runtime;
689 
690  std::vector<armnn::BindingPointInfo> m_InputBindings;
691  std::vector<armnn::BindingPointInfo> m_OutputBindings;
692  bool m_EnableProfiling;
693  std::string m_DynamicBackendsPath;
694 
695  template<typename TContainer>
696  armnn::InputTensors MakeInputTensors(const std::vector<TContainer>& inputDataContainers)
697  {
698  return armnnUtils::MakeInputTensors(m_InputBindings, inputDataContainers);
699  }
700 
701  template<typename TContainer>
702  armnn::OutputTensors MakeOutputTensors(std::vector<TContainer>& outputDataContainers)
703  {
704  return armnnUtils::MakeOutputTensors(m_OutputBindings, outputDataContainers);
705  }
706 };
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)
mapbox::util::variant< std::vector< float >, std::vector< int >, std::vector< unsigned char >, std::vector< int8_t > > TContainer
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
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
std::tuple< armnn::profiling::ProfilingGuid, std::chrono::duration< double, std::milli > > RunAsync(armnn::experimental::IWorkingMemHandle &workingMemHandleRef, const std::vector< TContainer > &inputContainers, std::vector< TContainer > &outputContainers)
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:1568
std::vector< std::string > m_OutputBindings
std::vector< armnn::BackendId > m_ComputeDevices
#define ARMNN_SCOPED_HEAP_PROFILING(TAG)
int NetworkId
Definition: IRuntime.hpp:22
std::vector< std::pair< LayerBindingId, class Tensor > > OutputTensors
Definition: Tensor.hpp:341
Status
enumeration
Definition: Types.hpp:30
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
#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:93
bool m_EnableGpuProfiling
Setting this flag will allow the user to obtain GPU profiling information from the runtime...
Definition: IRuntime.hpp:89
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::unique_ptr< armnn::experimental::IWorkingMemHandle > CreateWorkingMemHandle()
virtual profiling::ProfilingGuid GetInferenceId()=0
Returns the InferenceId of the Inference that this IWorkingMemHandle works with.
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