ArmNN
 22.08
InferenceModel< IParser, TDataType > Class Template Reference

#include <InferenceModel.hpp>

Classes

struct  CommandLineOptions
 

Public Types

using DataType = TDataType
 
using Params = InferenceModelInternal::Params
 
using QuantizationParams = InferenceModelInternal::QuantizationParams
 

Public Member Functions

 InferenceModel (const Params &params, bool enableProfiling, const std::string &dynamicBackendsPath, const std::shared_ptr< armnn::IRuntime > &runtime=nullptr)
 
void CheckInputIndexIsValid (unsigned int inputIndex) const
 
void CheckOutputIndexIsValid (unsigned int outputIndex) const
 
unsigned int GetInputSize (unsigned int inputIndex=0u) const
 
unsigned int GetOutputSize (unsigned int outputIndex=0u) const
 
std::chrono::duration< double, std::milli > Run (const std::vector< armnnUtils::TContainer > &inputContainers, std::vector< armnnUtils::TContainer > &outputContainers)
 
std::tuple< unsigned int, std::chrono::duration< double, std::milli > > RunAsync (armnn::experimental::IWorkingMemHandle &workingMemHandleRef, const std::vector< armnnUtils::TContainer > &inputContainers, std::vector< armnnUtils::TContainer > &outputContainers, unsigned int inferenceID)
 
void RunAsync (const std::vector< armnnUtils::TContainer > &inputContainers, std::vector< armnnUtils::TContainer > &outputContainers, std::shared_ptr< armnn::IAsyncExecutionCallback > cb)
 
const armnn::BindingPointInfoGetInputBindingInfo (unsigned int inputIndex=0u) const
 
const std::vector< armnn::BindingPointInfo > & GetInputBindingInfos () const
 
const armnn::BindingPointInfoGetOutputBindingInfo (unsigned int outputIndex=0u) const
 
const std::vector< armnn::BindingPointInfo > & GetOutputBindingInfos () const
 
QuantizationParams GetQuantizationParams (unsigned int outputIndex=0u) const
 
QuantizationParams GetInputQuantizationParams (unsigned int inputIndex=0u) const
 
std::vector< QuantizationParamsGetAllQuantizationParams () const
 
std::unique_ptr< armnn::experimental::IWorkingMemHandleCreateWorkingMemHandle ()
 

Static Public Member Functions

static void AddCommandLineOptions (cxxopts::Options &options, CommandLineOptions &cLineOptions, std::vector< std::string > &required)
 

Detailed Description

template<typename IParser, typename TDataType>
class InferenceModel< IParser, TDataType >

Definition at line 344 of file InferenceModel.hpp.

Member Typedef Documentation

◆ DataType

using DataType = TDataType

Definition at line 347 of file InferenceModel.hpp.

◆ Params

Definition at line 348 of file InferenceModel.hpp.

◆ QuantizationParams

Constructor & Destructor Documentation

◆ InferenceModel()

InferenceModel ( const Params params,
bool  enableProfiling,
const std::string &  dynamicBackendsPath,
const std::shared_ptr< armnn::IRuntime > &  runtime = nullptr 
)
inline

Definition at line 408 of file InferenceModel.hpp.

References ARMNN_LOG, ARMNN_SCOPED_HEAP_PROFILING, CheckRequestedBackendsAreValid(), CreateNetworkImpl< IParser >::Create(), IRuntime::Create(), armnn::DetailsOnly, armnn::DetailsWithEvents, armnn::Failure, armnn::GetTimeDuration(), armnn::GetTimeNow(), armnn::InferAndValidate, Params::m_AsyncEnabled, Params::m_CachedNetworkFilePath, Params::m_ComputeDevices, OptimizerOptions::m_Debug, Params::m_DynamicBackendsPath, IRuntime::CreationOptions::m_DynamicBackendsPath, Params::m_EnableBf16TurboMode, Params::m_EnableFastMath, Params::m_EnableFp16TurboMode, IRuntime::CreationOptions::m_EnableGpuProfiling, Params::m_InferOutputShape, Params::m_InputBindings, Params::m_MLGOTuningFilePath, OptimizerOptions::m_ModelOptions, Params::m_ModelPath, Params::m_NumberOfThreads, Params::m_OutputBindings, Params::m_OutputDetailsOnlyToStdOut, Params::m_OutputDetailsToStdOut, Params::m_PrintIntermediateLayers, OptimizerOptions::m_ProfilingEnabled, OptimizerOptions::m_ReduceFp32ToBf16, OptimizerOptions::m_ReduceFp32ToFp16, Params::m_SaveCachedNetwork, OptimizerOptions::m_shapeInferenceMethod, Params::m_ThreadPoolSize, Params::m_VisualizePostOptimizationModel, armnn::Optimize(), armnn::Undefined, and armnn::ValidateOnly.

412  : m_EnableProfiling(enableProfiling),
413  m_ProfilingDetailsMethod(armnn::ProfilingDetailsMethod::Undefined),
414  m_DynamicBackendsPath(dynamicBackendsPath),
415  m_ImportInputsIfAligned(params.m_ImportInputsIfAligned)
416  {
417  if (runtime)
418  {
419  m_Runtime = runtime;
420  }
421  else
422  {
424  options.m_EnableGpuProfiling = m_EnableProfiling;
425  options.m_DynamicBackendsPath = m_DynamicBackendsPath;
426  m_Runtime = armnn::IRuntime::Create(options);
427  }
428 
429  // Configure the Profiler if the the profiling details are opted for
430  if (params.m_OutputDetailsOnlyToStdOut)
431  m_ProfilingDetailsMethod = armnn::ProfilingDetailsMethod::DetailsOnly;
432  else if (params.m_OutputDetailsToStdOut)
433  m_ProfilingDetailsMethod = armnn::ProfilingDetailsMethod::DetailsWithEvents;
434 
435  std::string invalidBackends;
436  if (!CheckRequestedBackendsAreValid(params.m_ComputeDevices, armnn::Optional<std::string&>(invalidBackends)))
437  {
438  throw armnn::Exception("Some backend IDs are invalid: " + invalidBackends);
439  }
440 
442  {
443  const auto parsing_start_time = armnn::GetTimeNow();
444  armnn::INetworkPtr network = CreateNetworkImpl<IParser>::Create(params, m_InputBindings, m_OutputBindings);
445 
446  ARMNN_LOG(info) << "Network parsing time: " << std::setprecision(2)
447  << std::fixed << armnn::GetTimeDuration(parsing_start_time).count() << " ms.";
448 
449  ARMNN_SCOPED_HEAP_PROFILING("Optimizing");
450 
451  armnn::OptimizerOptions options;
452  options.m_ReduceFp32ToFp16 = params.m_EnableFp16TurboMode;
453  options.m_ReduceFp32ToBf16 = params.m_EnableBf16TurboMode;
454  options.m_Debug = params.m_PrintIntermediateLayers;
455  options.m_shapeInferenceMethod = params.m_InferOutputShape ?
457  options.m_ProfilingEnabled = m_EnableProfiling;
458 
459  armnn::BackendOptions gpuAcc("GpuAcc",
460  {
461  { "FastMathEnabled", params.m_EnableFastMath },
462  { "SaveCachedNetwork", params.m_SaveCachedNetwork },
463  { "CachedNetworkFilePath", params.m_CachedNetworkFilePath },
464  { "MLGOTuningFilePath", params.m_MLGOTuningFilePath }
465  });
466 
467  armnn::BackendOptions cpuAcc("CpuAcc",
468  {
469  { "FastMathEnabled", params.m_EnableFastMath },
470  { "NumberOfThreads", params.m_NumberOfThreads }
471  });
472  options.m_ModelOptions.push_back(gpuAcc);
473  options.m_ModelOptions.push_back(cpuAcc);
474 
475  const auto optimization_start_time = armnn::GetTimeNow();
476  optNet = armnn::Optimize(*network, params.m_ComputeDevices, m_Runtime->GetDeviceSpec(), options);
477 
478  ARMNN_LOG(info) << "Optimization time: " << std::setprecision(2)
479  << std::fixed << armnn::GetTimeDuration(optimization_start_time).count() << " ms.";
480 
481  if (!optNet)
482  {
483  throw armnn::Exception("Optimize returned nullptr");
484  }
485 
486 
487  }
488 
489  if (params.m_VisualizePostOptimizationModel)
490  {
491  fs::path filename = params.m_ModelPath;
492  filename.replace_extension("dot");
493  std::fstream file(filename.c_str(), std::ios_base::out);
494  optNet->SerializeToDot(file);
495  }
496 
497  armnn::Status ret;
498  {
499  ARMNN_SCOPED_HEAP_PROFILING("LoadNetwork");
500 
501  const auto loading_start_time = armnn::GetTimeNow();
502  armnn::INetworkProperties networkProperties(params.m_AsyncEnabled,
505  enableProfiling,
506  m_ProfilingDetailsMethod);
507  std::string errorMessage;
508  ret = m_Runtime->LoadNetwork(m_NetworkIdentifier, std::move(optNet), errorMessage, networkProperties);
509 
510  ARMNN_LOG(info) << "Network loading time: " << std::setprecision(2)
511  << std::fixed << armnn::GetTimeDuration(loading_start_time).count() << " ms.";
512 
513  if (params.m_AsyncEnabled && params.m_ThreadPoolSize > 0)
514  {
515  std::vector<std::shared_ptr<armnn::IWorkingMemHandle>> memHandles;
516  for (size_t i = 0; i < params.m_ThreadPoolSize; ++i)
517  {
518  memHandles.emplace_back(m_Runtime->CreateWorkingMemHandle(m_NetworkIdentifier));
519  }
520 
521  m_Threadpool = std::make_unique<armnn::Threadpool>(params.m_ThreadPoolSize,
522  m_Runtime.get(),
523  memHandles);
524  }
525  }
526 
527  if (ret == armnn::Status::Failure)
528  {
529  throw armnn::Exception("IRuntime::LoadNetwork failed");
530  }
531  }
ModelOptions m_ModelOptions
Definition: INetwork.hpp:227
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:49
std::chrono::duration< double, std::milli > GetTimeDuration(std::chrono::high_resolution_clock::time_point start_time)
Definition: Timer.hpp:19
ShapeInferenceMethod m_shapeInferenceMethod
Definition: INetwork.hpp:221
#define ARMNN_LOG(severity)
Definition: Logging.hpp:205
bool m_ReduceFp32ToBf16
Reduces all Fp32 operators in the model to Bf16 for faster processing.
Definition: INetwork.hpp:218
std::chrono::high_resolution_clock::time_point GetTimeNow()
Definition: Timer.hpp:14
bool m_ReduceFp32ToFp16
Reduces all Fp32 operators in the model to Fp16 for faster processing.
Definition: INetwork.hpp:208
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:1864
#define ARMNN_SCOPED_HEAP_PROFILING(TAG)
bool CheckRequestedBackendsAreValid(const std::vector< armnn::BackendId > &backendIds, armnn::Optional< std::string &> invalidBackendIds=armnn::EmptyOptional())
Validate all output shapes.
Status
enumeration
Definition: Types.hpp:42
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
Definition: INetwork.hpp:239
ArmNN performs an optimization on each model/network before it gets loaded for execution.
Definition: INetwork.hpp:127
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:98
bool m_EnableGpuProfiling
Setting this flag will allow the user to obtain GPU profiling information from the runtime...
Definition: IRuntime.hpp:93
static armnn::INetworkPtr Create(const Params &params, std::vector< armnn::BindingPointInfo > &inputBindings, std::vector< armnn::BindingPointInfo > &outputBindings)
Base class for all ArmNN exceptions so that users can filter to just those.
Definition: Exceptions.hpp:46
Infer missing output shapes and validate all output shapes.
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
Definition: INetwork.hpp:238

Member Function Documentation

◆ AddCommandLineOptions()

static void AddCommandLineOptions ( cxxopts::Options &  options,
CommandLineOptions cLineOptions,
std::vector< std::string > &  required 
)
inlinestatic

Definition at line 370 of file InferenceModel.hpp.

References armnn::BackendRegistryInstance(), BackendRegistry::GetBackendIdsAsString(), InferenceModel< IParser, TDataType >::CommandLineOptions::m_ComputeDevices, InferenceModel< IParser, TDataType >::CommandLineOptions::m_DynamicBackendsPath, InferenceModel< IParser, TDataType >::CommandLineOptions::m_EnableBf16TurboMode, InferenceModel< IParser, TDataType >::CommandLineOptions::m_EnableFp16TurboMode, InferenceModel< IParser, TDataType >::CommandLineOptions::m_Labels, InferenceModel< IParser, TDataType >::CommandLineOptions::m_ModelDir, and InferenceModel< IParser, TDataType >::CommandLineOptions::m_VisualizePostOptimizationModel.

Referenced by ClassifierTestCaseProvider< TDatabase, InferenceModel >::AddCommandLineOptions().

372  {
373  const std::vector<std::string> defaultComputes = { "CpuAcc", "CpuRef" };
374 
375  const std::string backendsMessage = "Which device to run layers on by default. Possible choices: "
377 
378  options
379  .allow_unrecognised_options()
380  .add_options()
381  ("m,model-dir", "Path to directory containing model files (.prototxt/.tflite)",
382  cxxopts::value<std::string>(cLineOptions.m_ModelDir))
383  ("c,compute", backendsMessage.c_str(),
384  cxxopts::value<std::vector<std::string>>(cLineOptions.m_ComputeDevices)->default_value("CpuRef"))
385  ("b,dynamic-backends-path",
386  "Path where to load any available dynamic backend from. "
387  "If left empty (the default), dynamic backends will not be used.",
388  cxxopts::value(cLineOptions.m_DynamicBackendsPath))
389  ("l,labels",
390  "Text file containing one image filename - correct label pair per line, "
391  "used to test the accuracy of the network.", cxxopts::value<std::string>(cLineOptions.m_Labels))
392  ("v,visualize-optimized-model",
393  "Produce a dot file useful for visualizing the graph post optimization."
394  "The file will have the same name as the model with the .dot extention.",
395  cxxopts::value<bool>(cLineOptions.m_VisualizePostOptimizationModel)->default_value("false"))
396  ("fp16-turbo-mode",
397  "If this option is enabled FP32 layers, weights and biases will be converted "
398  "to FP16 where the backend supports it.",
399  cxxopts::value<bool>(cLineOptions.m_EnableFp16TurboMode)->default_value("false"))
400  ("bf16-turbo-mode",
401  "If this option is enabled FP32 layers, weights and biases will be converted "
402  "to BF16 where the backend supports it.",
403  cxxopts::value<bool>(cLineOptions.m_EnableBf16TurboMode)->default_value("false"));
404 
405  required.emplace_back("model-dir");
406  }
BackendRegistry & BackendRegistryInstance()
std::string GetBackendIdsAsString() const

◆ CheckInputIndexIsValid()

void CheckInputIndexIsValid ( unsigned int  inputIndex) const
inline

Definition at line 533 of file InferenceModel.hpp.

References Params::m_InputBindings.

534  {
535  if (m_InputBindings.size() < inputIndex + 1)
536  {
537  throw armnn::Exception(fmt::format("Input index out of range: {}", inputIndex));
538  }
539  }
Base class for all ArmNN exceptions so that users can filter to just those.
Definition: Exceptions.hpp:46

◆ CheckOutputIndexIsValid()

void CheckOutputIndexIsValid ( unsigned int  outputIndex) const
inline

Definition at line 541 of file InferenceModel.hpp.

References Params::m_OutputBindings.

542  {
543  if (m_OutputBindings.size() < outputIndex + 1)
544  {
545  throw armnn::Exception(fmt::format("Output index out of range: {}", outputIndex));
546  }
547  }
Base class for all ArmNN exceptions so that users can filter to just those.
Definition: Exceptions.hpp:46

◆ CreateWorkingMemHandle()

std::unique_ptr<armnn::experimental::IWorkingMemHandle> CreateWorkingMemHandle ( )
inline

◆ GetAllQuantizationParams()

std::vector<QuantizationParams> GetAllQuantizationParams ( ) const
inline

Definition at line 753 of file InferenceModel.hpp.

References Params::m_OutputBindings.

754  {
755  std::vector<QuantizationParams> quantizationParams;
756  for (unsigned int i = 0u; i < m_OutputBindings.size(); i++)
757  {
758  quantizationParams.push_back(GetQuantizationParams(i));
759  }
760  return quantizationParams;
761  }
QuantizationParams GetQuantizationParams(unsigned int outputIndex=0u) const

◆ GetInputBindingInfo()

const armnn::BindingPointInfo& GetInputBindingInfo ( unsigned int  inputIndex = 0u) const
inline

Definition at line 717 of file InferenceModel.hpp.

References Params::m_InputBindings.

Referenced by main().

718  {
719  CheckInputIndexIsValid(inputIndex);
720  return m_InputBindings[inputIndex];
721  }
void CheckInputIndexIsValid(unsigned int inputIndex) const

◆ GetInputBindingInfos()

const std::vector<armnn::BindingPointInfo>& GetInputBindingInfos ( ) const
inline

Definition at line 723 of file InferenceModel.hpp.

References Params::m_InputBindings.

724  {
725  return m_InputBindings;
726  }

◆ GetInputQuantizationParams()

QuantizationParams GetInputQuantizationParams ( unsigned int  inputIndex = 0u) const
inline

Definition at line 746 of file InferenceModel.hpp.

References Params::m_InputBindings.

747  {
748  CheckInputIndexIsValid(inputIndex);
749  return std::make_pair(m_InputBindings[inputIndex].second.GetQuantizationScale(),
750  m_InputBindings[inputIndex].second.GetQuantizationOffset());
751  }
void CheckInputIndexIsValid(unsigned int inputIndex) const

◆ GetInputSize()

unsigned int GetInputSize ( unsigned int  inputIndex = 0u) const
inline

Definition at line 549 of file InferenceModel.hpp.

References Params::m_InputBindings.

550  {
551  CheckInputIndexIsValid(inputIndex);
552  return m_InputBindings[inputIndex].second.GetNumElements();
553  }
void CheckInputIndexIsValid(unsigned int inputIndex) const

◆ GetOutputBindingInfo()

const armnn::BindingPointInfo& GetOutputBindingInfo ( unsigned int  outputIndex = 0u) const
inline

Definition at line 728 of file InferenceModel.hpp.

References Params::m_OutputBindings.

729  {
730  CheckOutputIndexIsValid(outputIndex);
731  return m_OutputBindings[outputIndex];
732  }
void CheckOutputIndexIsValid(unsigned int outputIndex) const

◆ GetOutputBindingInfos()

const std::vector<armnn::BindingPointInfo>& GetOutputBindingInfos ( ) const
inline

Definition at line 734 of file InferenceModel.hpp.

References Params::m_OutputBindings.

735  {
736  return m_OutputBindings;
737  }

◆ GetOutputSize()

unsigned int GetOutputSize ( unsigned int  outputIndex = 0u) const
inline

Definition at line 555 of file InferenceModel.hpp.

References Params::m_OutputBindings.

Referenced by main().

556  {
557  CheckOutputIndexIsValid(outputIndex);
558  return m_OutputBindings[outputIndex].second.GetNumElements();
559  }
void CheckOutputIndexIsValid(unsigned int outputIndex) const

◆ GetQuantizationParams()

QuantizationParams GetQuantizationParams ( unsigned int  outputIndex = 0u) const
inline

Definition at line 739 of file InferenceModel.hpp.

References Params::m_OutputBindings.

740  {
741  CheckOutputIndexIsValid(outputIndex);
742  return std::make_pair(m_OutputBindings[outputIndex].second.GetQuantizationScale(),
743  m_OutputBindings[outputIndex].second.GetQuantizationOffset());
744  }
void CheckOutputIndexIsValid(unsigned int outputIndex) const

◆ Run()

std::chrono::duration<double, std::milli> Run ( const std::vector< armnnUtils::TContainer > &  inputContainers,
std::vector< armnnUtils::TContainer > &  outputContainers 
)
inline

Definition at line 561 of file InferenceModel.hpp.

References armnn::Failure, armnn::GetTimeDuration(), armnn::GetTimeNow(), Params::m_ImportInputsIfAligned, MakeInputTensors(), MakeOutputTensors(), armnn::Malloc, and armnn::numeric_cast().

564  {
565  for (unsigned int i = 0; i < outputContainers.size(); ++i)
566  {
567  const unsigned int expectedOutputDataSize = GetOutputSize(i);
568 
569  mapbox::util::apply_visitor([expectedOutputDataSize, i](auto&& value)
570  {
571  const unsigned int actualOutputDataSize = armnn::numeric_cast<unsigned int>(value.size());
572  if (actualOutputDataSize < expectedOutputDataSize)
573  {
574  unsigned int outputIndex = i;
575  throw armnn::Exception(
576  fmt::format("Not enough data for output #{0}: expected "
577  "{1} elements, got {2}", outputIndex, expectedOutputDataSize, actualOutputDataSize));
578  }
579  },
580  outputContainers[i]);
581  }
582 
583  std::shared_ptr<armnn::IProfiler> profiler = m_Runtime->GetProfiler(m_NetworkIdentifier);
584 
585  // Start timer to record inference time in EnqueueWorkload (in milliseconds)
586  const auto start_time = armnn::GetTimeNow();
587 
588  armnn::Status ret;
589  if (m_ImportInputsIfAligned)
590  {
591  std::vector<armnn::ImportedInputId> importedInputIds = m_Runtime->ImportInputs(
592  m_NetworkIdentifier, MakeInputTensors(inputContainers), armnn::MemorySource::Malloc);
593 
594  std::vector<armnn::ImportedOutputId> importedOutputIds = m_Runtime->ImportOutputs(
595  m_NetworkIdentifier, MakeOutputTensors(outputContainers), armnn::MemorySource::Malloc);
596 
597  ret = m_Runtime->EnqueueWorkload(m_NetworkIdentifier,
598  MakeInputTensors(inputContainers),
599  MakeOutputTensors(outputContainers),
600  importedInputIds,
601  importedOutputIds);
602  }
603  else
604  {
605  ret = m_Runtime->EnqueueWorkload(m_NetworkIdentifier,
606  MakeInputTensors(inputContainers),
607  MakeOutputTensors(outputContainers));
608  }
609  const auto duration = armnn::GetTimeDuration(start_time);
610 
611  // if profiling is enabled print out the results
612  if (profiler && profiler->IsProfilingEnabled())
613  {
614  profiler->Print(std::cout);
615  }
616 
617  if (ret == armnn::Status::Failure)
618  {
619  throw armnn::Exception("IRuntime::EnqueueWorkload failed");
620  }
621  else
622  {
623  return duration;
624  }
625  }
std::chrono::duration< double, std::milli > GetTimeDuration(std::chrono::high_resolution_clock::time_point start_time)
Definition: Timer.hpp:19
std::chrono::high_resolution_clock::time_point GetTimeNow()
Definition: Timer.hpp:14
unsigned int GetOutputSize(unsigned int outputIndex=0u) const
Status
enumeration
Definition: Types.hpp:42
Base class for all ArmNN exceptions so that users can filter to just those.
Definition: Exceptions.hpp:46
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
Definition: NumericCast.hpp:35

◆ RunAsync() [1/2]

std::tuple<unsigned int, std::chrono::duration<double, std::milli> > RunAsync ( armnn::experimental::IWorkingMemHandle workingMemHandleRef,
const std::vector< armnnUtils::TContainer > &  inputContainers,
std::vector< armnnUtils::TContainer > &  outputContainers,
unsigned int  inferenceID 
)
inline

Definition at line 627 of file InferenceModel.hpp.

References armnn::Failure, armnn::GetTimeDuration(), armnn::GetTimeNow(), MakeInputTensors(), MakeOutputTensors(), and armnn::numeric_cast().

632  {
633  for (unsigned int i = 0; i < outputContainers.size(); ++i)
634  {
635  const unsigned int expectedOutputDataSize = GetOutputSize(i);
636 
637  mapbox::util::apply_visitor([expectedOutputDataSize, i](auto&& value)
638  {
639  const unsigned int actualOutputDataSize = armnn::numeric_cast<unsigned int>(value.size());
640  if (actualOutputDataSize < expectedOutputDataSize)
641  {
642  unsigned int outputIndex = i;
643  throw armnn::Exception(
644  fmt::format("Not enough data for output #{0}: expected "
645  "{1} elements, got {2}", outputIndex, expectedOutputDataSize, actualOutputDataSize));
646  }
647  },
648  outputContainers[i]);
649  }
650 
651  std::shared_ptr<armnn::IProfiler> profiler = m_Runtime->GetProfiler(m_NetworkIdentifier);
652 
653  // Start timer to record inference time in EnqueueWorkload (in milliseconds)
654  const auto start_time = armnn::GetTimeNow();
655 
656  armnn::Status ret = m_Runtime->Execute(workingMemHandleRef,
657  MakeInputTensors(inputContainers),
658  MakeOutputTensors(outputContainers));
659 
660  const auto duration = armnn::GetTimeDuration(start_time);
661 
662  // if profiling is enabled print out the results
663  if (profiler && profiler->IsProfilingEnabled())
664  {
665  profiler->Print(std::cout);
666  }
667 
668  if (ret == armnn::Status::Failure)
669  {
670  throw armnn::Exception(
671  fmt::format("IRuntime::Execute asynchronously failed for network #{0} on inference #{1}",
672  m_NetworkIdentifier, inferenceID));
673  }
674  else
675  {
676  return std::make_tuple(inferenceID, duration);
677  }
678  }
std::chrono::duration< double, std::milli > GetTimeDuration(std::chrono::high_resolution_clock::time_point start_time)
Definition: Timer.hpp:19
std::chrono::high_resolution_clock::time_point GetTimeNow()
Definition: Timer.hpp:14
unsigned int GetOutputSize(unsigned int outputIndex=0u) const
Status
enumeration
Definition: Types.hpp:42
Base class for all ArmNN exceptions so that users can filter to just those.
Definition: Exceptions.hpp:46
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
Definition: NumericCast.hpp:35

◆ RunAsync() [2/2]

void RunAsync ( const std::vector< armnnUtils::TContainer > &  inputContainers,
std::vector< armnnUtils::TContainer > &  outputContainers,
std::shared_ptr< armnn::IAsyncExecutionCallback cb 
)
inline

Definition at line 680 of file InferenceModel.hpp.

References MakeInputTensors(), MakeOutputTensors(), armnn::Medium, and armnn::numeric_cast().

683  {
684  for (unsigned int i = 0; i < outputContainers.size(); ++i)
685  {
686  const unsigned int expectedOutputDataSize = GetOutputSize(i);
687 
688  mapbox::util::apply_visitor([expectedOutputDataSize, i](auto&& value)
689  {
690  const unsigned int actualOutputDataSize = armnn::numeric_cast<unsigned int>(value.size());
691  if (actualOutputDataSize < expectedOutputDataSize)
692  {
693  unsigned int outputIndex = i;
694  throw armnn::Exception(
695  fmt::format("Not enough data for output #{0}: expected "
696  "{1} elements, got {2}", outputIndex, expectedOutputDataSize, actualOutputDataSize));
697  }
698  },
699  outputContainers[i]);
700  }
701 
702  std::shared_ptr<armnn::IProfiler> profiler = m_Runtime->GetProfiler(m_NetworkIdentifier);
703 
704  m_Threadpool->Schedule(m_NetworkIdentifier,
705  MakeInputTensors(inputContainers),
706  MakeOutputTensors(outputContainers),
708  cb);
709 
710  // if profiling is enabled print out the results
711  if (profiler && profiler->IsProfilingEnabled())
712  {
713  profiler->Print(std::cout);
714  }
715  }
unsigned int GetOutputSize(unsigned int outputIndex=0u) const
Base class for all ArmNN exceptions so that users can filter to just those.
Definition: Exceptions.hpp:46
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
Definition: NumericCast.hpp:35

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