ArmNN
 22.08
IOptimizedNetwork Class Reference

#include <INetwork.hpp>

Public Member Functions

Status PrintGraph ()
 
Status SerializeToDot (std::ostream &stream) const
 
arm::pipe::ProfilingGuid GetGuid () const
 
size_t GetNumInputs () const
 
size_t GetNumOutputs () const
 
void ExecuteStrategy (IStrategy &strategy) const
 
 IOptimizedNetwork (const IOptimizedNetwork &other, const ModelOptions &modelOptions)
 
 IOptimizedNetwork (std::unique_ptr< Graph > graph)
 
 IOptimizedNetwork (std::unique_ptr< OptimizedNetworkImpl > impl)
 
 ~IOptimizedNetwork ()
 
const std::shared_ptr< IProfiler > & GetProfiler () const
 

Static Public Member Functions

static void Destroy (IOptimizedNetwork *network)
 

Protected Member Functions

 IOptimizedNetwork (std::unique_ptr< Graph > graph, const ModelOptions &modelOptions)
 

Protected Attributes

std::unique_ptr< OptimizedNetworkImplpOptimizedNetworkImpl
 

Friends

class LoadedNetwork
 
class experimental::AsyncNetworkImpl
 
class experimental::WorkingMemHandle
 
GraphGetGraphForTesting (IOptimizedNetwork *optNetPtr)
 
ModelOptionsGetModelOptionsForTesting (IOptimizedNetwork *optNetPtr)
 
IOptimizedNetworkPtr Optimize (const INetwork &inNetwork, const std::vector< BackendId > &backendPreferences, const IDeviceSpec &deviceSpec, const OptimizerOptions &options, Optional< std::vector< std::string > &> messages)
 Create an optimized version of the network. More...
 
IOptimizedNetworkPtr Optimize (const Graph &inGraph, const std::vector< BackendId > &backendPreferences, const IDeviceSpec &deviceSpec, const OptimizerOptions &options, Optional< std::vector< std::string > &> messages)
 Create an optimized version of the network. More...
 

Detailed Description

Definition at line 791 of file INetwork.hpp.

Constructor & Destructor Documentation

◆ IOptimizedNetwork() [1/4]

IOptimizedNetwork ( const IOptimizedNetwork other,
const ModelOptions modelOptions 
)

Definition at line 485 of file Network.cpp.

Referenced by armnn::Optimize().

486  : pOptimizedNetworkImpl(new OptimizedNetworkImpl(*other.pOptimizedNetworkImpl.get(), modelOptions)) {}
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:836

◆ IOptimizedNetwork() [2/4]

IOptimizedNetwork ( std::unique_ptr< Graph graph)

Definition at line 488 of file Network.cpp.

489  : pOptimizedNetworkImpl(new OptimizedNetworkImpl(std::move(graph))) {}
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:836

◆ IOptimizedNetwork() [3/4]

IOptimizedNetwork ( std::unique_ptr< OptimizedNetworkImpl impl)

Definition at line 491 of file Network.cpp.

492  : pOptimizedNetworkImpl(std::move(impl)) {}
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:836

◆ ~IOptimizedNetwork()

◆ IOptimizedNetwork() [4/4]

IOptimizedNetwork ( std::unique_ptr< Graph graph,
const ModelOptions modelOptions 
)
protected

Definition at line 494 of file Network.cpp.

References IOptimizedNetwork::~IOptimizedNetwork().

495  : pOptimizedNetworkImpl(new OptimizedNetworkImpl(std::move(graph), modelOptions)) {}
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:836

Member Function Documentation

◆ Destroy()

void Destroy ( IOptimizedNetwork network)
static

Definition at line 499 of file Network.cpp.

Referenced by armnn::Optimize(), and TEST_SUITE().

500 {
501  delete network;
502 }

◆ ExecuteStrategy()

void ExecuteStrategy ( IStrategy strategy) const

Definition at line 2956 of file Network.cpp.

Referenced by ArmNNExecutor::PrintNetworkInfo().

2957 {
2958  pOptimizedNetworkImpl->ExecuteStrategy(strategy);
2959 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:836

◆ GetGuid()

arm::pipe::ProfilingGuid GetGuid ( ) const

Definition at line 519 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

520 {
521  return pOptimizedNetworkImpl->GetGuid();
522 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:836

◆ GetNumInputs()

size_t GetNumInputs ( ) const

Definition at line 524 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

525 {
526  return pOptimizedNetworkImpl->GetNumInputs();
527 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:836

◆ GetNumOutputs()

size_t GetNumOutputs ( ) const

Definition at line 529 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

530 {
531  return pOptimizedNetworkImpl->GetNumOutputs();
532 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:836

◆ GetProfiler()

const std::shared_ptr< IProfiler > & GetProfiler ( ) const

Definition at line 514 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

515 {
516  return pOptimizedNetworkImpl->GetGraph().GetProfiler();
517 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:836

◆ PrintGraph()

Status PrintGraph ( )

Definition at line 504 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

505 {
506  return pOptimizedNetworkImpl->PrintGraph();
507 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:836

◆ SerializeToDot()

Status SerializeToDot ( std::ostream &  stream) const

Definition at line 509 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

Referenced by ArmNNExecutor::PrintNetworkInfo().

510 {
511  return pOptimizedNetworkImpl->SerializeToDot(stream);
512 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:836

Friends And Related Function Documentation

◆ experimental::AsyncNetworkImpl

friend class experimental::AsyncNetworkImpl
friend

Definition at line 818 of file INetwork.hpp.

◆ experimental::WorkingMemHandle

friend class experimental::WorkingMemHandle
friend

Definition at line 819 of file INetwork.hpp.

◆ GetGraphForTesting

Graph& GetGraphForTesting ( IOptimizedNetwork optNetPtr)
friend

Definition at line 49 of file TestUtils.cpp.

50 {
51  return optNet->pOptimizedNetworkImpl->GetGraph();
52 }

◆ GetModelOptionsForTesting

ModelOptions& GetModelOptionsForTesting ( IOptimizedNetwork optNetPtr)
friend

Definition at line 54 of file TestUtils.cpp.

55 {
56  return optNet->pOptimizedNetworkImpl->GetModelOptions();
57 }

◆ LoadedNetwork

friend class LoadedNetwork
friend

Definition at line 816 of file INetwork.hpp.

◆ Optimize [1/2]

IOptimizedNetworkPtr Optimize ( const INetwork inNetwork,
const std::vector< BackendId > &  backendPreferences,
const IDeviceSpec deviceSpec,
const OptimizerOptions options = OptimizerOptions(),
Optional< std::vector< std::string > &>  messages = EmptyOptional() 
)
friend

Create an optimized version of the network.

Parameters
networkINetwork description of the network to be optimized.
backendPreferencesThe choice of the backend ordered by user preferences.
deviceSpecDeviceSpec object as queried from the runtime. See IRuntime::GetDeviceSpec()
messagesIf there are failures or warnings a string describing same will be added to the vector
optionsOptimizerOptions object with optimizer configuration options
Returns
An IOptimizedNetworkPtr interface to the optimized network, throws an exception derived from armnn::Exception if process fails.

Definition at line 1864 of file Network.cpp.

Referenced by armnn::Optimize().

1869 {
1870  return Optimize(inNetwork.pNetworkImpl->GetGraph(),
1871  backendPreferences,
1872  deviceSpec,
1873  options,
1874  messages);
1875 }
friend IOptimizedNetworkPtr Optimize(const INetwork &inNetwork, const std::vector< BackendId > &backendPreferences, const IDeviceSpec &deviceSpec, const OptimizerOptions &options, Optional< std::vector< std::string > &> messages)
Create an optimized version of the network.
Definition: Network.cpp:1864

◆ Optimize [2/2]

IOptimizedNetworkPtr Optimize ( const Graph inGraph,
const std::vector< BackendId > &  backendPreferences,
const IDeviceSpec deviceSpec,
const OptimizerOptions options,
Optional< std::vector< std::string > &>  messages = EmptyOptional() 
)
friend

Create an optimized version of the network.

Parameters
inGraphGraph to be optimized.
backendPreferencesThe choice of the backend ordered by user preferences.
deviceSpecDeviceSpec object as queried from the runtime. See IRuntime::GetDeviceSpec()
messagesIf there are failures or warnings a string describing same will be added to the vector
optionsOptimizerOptions object with optimizer configuration options
Returns
An IOptimizedNetworkPtr interface to the optimized network, throws an exception derived from armnn::Exception if process fails.

Definition at line 1675 of file Network.cpp.

1680 {
1681  ARMNN_LOG(debug) << options.ToString();
1682 
1683  // Enable profiling
1684  auto profiler = inGraph.GetProfiler();
1686  profiler->EnableProfiling(options.m_ProfilingEnabled);
1687 
1689  if (backendPreferences.empty())
1690  {
1691  throw InvalidArgumentException("Invoked Optimize with no backends specified");
1692  }
1693 
1694  if (options.m_ReduceFp32ToFp16 && options.m_ReduceFp32ToBf16)
1695  {
1696  throw InvalidArgumentException("BFloat16 and Float16 optimization cannot be enabled at the same time.");
1697  }
1698 
1699  // Ensure TensorInfo is set on all output slots of ConstantLayers in the graph
1700  inGraph.VerifyConstantLayerSetTensorInfo();
1701 
1702  std::unique_ptr<Graph> graph = std::make_unique<Graph>(inGraph);
1703 
1704  // We need to pass on the information about whether import and export is enabled to the LoadNetwork phase.
1705  // The mechanism to do that is to add model options to the optimized network.
1706  armnn::BackendOptions importExport("Global",
1707  {{"ImportEnabled", options.m_ImportEnabled},
1708  {"ExportEnabled", options.m_ExportEnabled}});
1709  ModelOptions optimizedOptions(options.m_ModelOptions);
1710  optimizedOptions.push_back(importExport);
1711 
1712  auto optNet = IOptimizedNetworkPtr(new IOptimizedNetwork(std::move(graph), optimizedOptions),
1714 
1715  IOptimizedNetwork* optNetObjPtr = optNet.get();
1716 
1717  // Get the optimized graph
1718  Graph& optGraph = optNetObjPtr->pOptimizedNetworkImpl->GetGraph();
1719 
1720  if(options.m_shapeInferenceMethod == ShapeInferenceMethod::InferAndValidate)
1721  {
1722  // Infer the tensor infos for all output slots. Throws an exception on failure
1723  optGraph.InferTensorInfos();
1724  }
1725 
1726  // Perform AddBroadcastReshapeLayer optimisation
1727  using namespace optimizations;
1729 
1730  if(options.m_shapeInferenceMethod == ShapeInferenceMethod::ValidateOnly)
1731  {
1732  // Validate the tensor infos for all output slots. Throws an exception on failure
1733  optGraph.InferTensorInfos();
1734  }
1735 
1736  // Need to FusePermuteIntoConstantLayer before FoldPadIntoDepthwiseConvolution2d or
1737  // FuseBatchNormIntoDepthwiseConvolution2D optimizations are called.
1739 
1740  // Perform optimisation passes
1746  MovePermuteUp(),
1747  MoveTransposeUp(),
1748  PermuteAsReshape(),
1761 
1762  // If Fp32 to Fp16 optimization is set convert Fp32 network to Fp16
1763  if (options.m_ReduceFp32ToFp16)
1764  {
1765  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ReduceFp32ToFp16");
1768  }
1769 
1770  // If Fp32 to Bf16 optimization is set convert Fp32 network to Bf16
1771  // Convert input of Convolution2d and FullyConnected from Fp32 to Bf16
1772  // Only Constant weight of Convolution2d and FullyConnected are converted from Fp32 to Bf16
1773  // Constant and Fp32ToBf16 layers will also be fused so conversion is no longer needed at inference time
1774  if (options.m_ReduceFp32ToBf16)
1775  {
1776  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ReduceFp32ToBf16");
1779  }
1780 
1781  // Initialize backend settings
1782  BackendSettings backendSettings(backendPreferences, deviceSpec);
1783  if (backendSettings.GetAvailablePreferredBackends().empty())
1784  {
1785  std::stringstream failureMsg;
1786  failureMsg << "None of the preferred backends " << backendPreferences
1787  << " are supported. Current platform provides " << backendSettings.m_SupportedBackends;
1788  ReportError(failureMsg.str(), messages);
1789  throw InvalidArgumentException(failureMsg.str());
1790  }
1791 
1792  // Create a map to temporarily hold initialized backend objects
1793  TensorHandleFactoryRegistry tensorHandleFactoryRegistry;
1794  BackendsMap backends = CreateSupportedBackends(tensorHandleFactoryRegistry, backendSettings);
1795 
1796  // Assign an available backend to each layer
1797  Graph::Iterator firstLayer = optGraph.begin();
1798  Graph::Iterator lastLayer = optGraph.end();
1799  OptimizationResult assignBackendsResult = AssignBackends(optNetObjPtr->pOptimizedNetworkImpl.get(),
1800  backendSettings,
1801  firstLayer,
1802  lastLayer,
1803  messages);
1804  if (assignBackendsResult.m_Error)
1805  {
1806  // Failed to assign a backend to each layer
1807  throw InvalidArgumentException("Failed to assign a backend to each layer");
1808  }
1809 
1812 
1813  // Apply the backend-specific optimizations
1814  OptimizationResult backendOptimizationResult = ApplyBackendOptimizations(optNetObjPtr->pOptimizedNetworkImpl.get(),
1815  backendSettings,
1816  backends,
1817  options.m_ModelOptions,
1818  messages);
1819  if (backendOptimizationResult.m_Error)
1820  {
1821  // Failed to apply the backend-specific optimizations
1822  throw InvalidArgumentException("Failed to apply the backend-specific optimizations");
1823  }
1824 
1825  // If the debug flag is set, then insert a DebugLayer after each layer
1826  // Doing this after applying the backend optimizations as they might have changed some layers
1827  if (options.m_Debug)
1828  {
1830  }
1831 
1832  // Calculate the compatibility strategies for tensor handles
1833  OptimizationResult strategyResult = SelectTensorHandleStrategy(optGraph,
1834  backends,
1835  tensorHandleFactoryRegistry,
1836  options.m_ImportEnabled,
1837  options.m_ExportEnabled,
1838  messages);
1839 
1840  if (strategyResult.m_Error)
1841  {
1842  // Failed to apply the backend-specific optimizations
1844  }
1845 
1846  // Based on the tensor handle strategy determined above, insert copy layers where required.
1847  {
1848  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_AddCompatibilityLayers");
1849  optGraph.AddCompatibilityLayers(backends, tensorHandleFactoryRegistry);
1850  }
1851 
1852  // Convert constants
1853  {
1854  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ConvertConstants");
1857 
1858  // Once the constants are converted we can now safely call RedirectMembersToConstantInputs
1860  }
1861  return optNet;
1862 }
OptimizeForConnection< Layer, PermuteLayer, SquashEqualSiblingsImpl< PermuteLayer > > SquashEqualPermuteSiblings
void ReportError(const std::string &errorMessage, Optional< std::vector< std::string > &> errorMessages)
Definition: Network.cpp:555
OptimizationResult AssignBackends(OptimizedNetworkImpl *optNetObjPtr, BackendSettings &backendSettings, Graph::Iterator &firstLayer, Graph::Iterator &lastLayer, Optional< std::vector< std::string > &> errMessages)
Definition: Network.cpp:1022
OptimizeForConnection< PermuteLayer, PermuteLayer, OptimizeInversePermutesImpl< PermuteLayer > > OptimizeInversePermutes
OptimizeForExclusiveConnection< PadLayer, Convolution2dLayer, pad_fold::FoldPadIntoConvolution2dImpl > FoldPadIntoConvolution2d
Optimizer::Optimizations MakeOptimizations(Args &&... args)
Definition: Optimizer.hpp:43
OptimizeForConnection< TransposeLayer, TransposeLayer, OptimizeInversePermutesImpl< TransposeLayer > > OptimizeInverseTransposes
OptimizeForExclusiveConnection< PadLayer, DepthwiseConvolution2dLayer, pad_fold::FoldPadIntoDepthwiseConvolution2dImpl > FoldPadIntoDepthwiseConvolution2d
static ProfilerManager & GetInstance()
Definition: Profiling.cpp:572
OptimizeForConnection< TransposeLayer, BatchToSpaceNdLayer, PermuteAndBatchToSpaceAsDepthToSpaceImpl< TransposeLayer > > TransposeAndBatchToSpaceAsDepthToSpace
OptimizeForExclusiveConnection< DepthwiseConvolution2dLayer, BatchNormalizationLayer, FuseBatchNorm< DepthwiseConvolution2dLayer, armnn::DataType::Float32 > > FuseBatchNormIntoDepthwiseConvolution2DFloat32
std::vector< BackendOptions > ModelOptions
static void Pass(Graph &graph, const Optimizations &optimizations)
Definition: Optimizer.cpp:16
OptimizeForExclusiveConnection< DepthwiseConvolution2dLayer, BatchNormalizationLayer, FuseBatchNorm< DepthwiseConvolution2dLayer, armnn::DataType::Float16 > > FuseBatchNormIntoDepthwiseConvolution2DFloat16
OptimizeForType< Layer, RedirectMembersToConstantInputsImpl > RedirectMembersToConstantInputs
OptimizeForExclusiveConnection< Convolution2dLayer, BatchNormalizationLayer, FuseBatchNorm< Convolution2dLayer, armnn::DataType::Float16 > > FuseBatchNormIntoConvolution2DFloat16
OptimizeForExclusiveConnection< Convolution2dLayer, BatchNormalizationLayer, FuseBatchNorm< Convolution2dLayer, armnn::DataType::Float32 > > FuseBatchNormIntoConvolution2DFloat32
#define ARMNN_LOG(severity)
Definition: Logging.hpp:205
OptimizeForConnection< Layer, ReshapeLayer, SquashEqualSiblingsImpl< ReshapeLayer > > SquashEqualReshapeSiblings
OptimizeForConnection< Layer, TransposeLayer, MoveTransposeUpImpl > MoveTransposeUp
LayerList::const_iterator Iterator
Definition: Graph.hpp:53
OptimizeForType< Layer, AddDebugImpl > InsertDebugLayer
Definition: AddDebug.hpp:34
OptimizeForConnection< ReshapeLayer, ReshapeLayer, OptimizeConsecutiveReshapesImpl > OptimizeConsecutiveReshapes
#define ARMNN_SCOPED_PROFILING_EVENT(backendId, name)
Definition: Profiling.hpp:220
OptimizeForConnection< ConvertFp16ToFp32Layer, ConvertFp32ToFp16Layer, OptimizeInverseConversionsImpl > OptimizeInverseConversionsFp16
OptimizeForConnection< ConstantLayer, PermuteLayer, ConvertConstPermuteLayersToConstLayers > FusePermuteIntoConstLayer
OptimizeForConnection< PermuteLayer, BatchToSpaceNdLayer, PermuteAndBatchToSpaceAsDepthToSpaceImpl< PermuteLayer > > PermuteAndBatchToSpaceAsDepthToSpace
OptimizeForConnection< Layer, PermuteLayer, MovePermuteUpImpl > MovePermuteUp
ConvertConstants< Float32ToFloat16, IsFloat16Layer > ConvertConstantsFloatToHalf
OptimizeForType< TransposeLayer, TransposeAsReshapeImpl > TransposeAsReshape
OptimizationResult ApplyBackendOptimizations(OptimizedNetworkImpl *optNetObjPtr, BackendSettings &backendSettings, BackendsMap &backends, const ModelOptions &modelOptions, Optional< std::vector< std::string > &> errMessages)
Definition: Network.cpp:1143
OptimizationResult SelectTensorHandleStrategy(Graph &optGraph, BackendsMap &backends, TensorHandleFactoryRegistry &registry, bool importEnabled, bool exportEnabled, Optional< std::vector< std::string > &> errMessages)
Definition: Network.cpp:1605
Validate all output shapes.
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
Definition: INetwork.hpp:239
OptimizeForType< PermuteLayer, PermuteAsReshapeImpl > PermuteAsReshape
OptimizeForConnection< Layer, TransposeLayer, SquashEqualSiblingsImpl< TransposeLayer > > SquashEqualTransposeSiblings
Struct for the users to pass backend specific options.
void RegisterProfiler(IProfiler *profiler)
Definition: Profiling.cpp:579
ConvertConstants< Float16ToFloat32, IsFloat32Layer > ConvertConstantsHalfToFloat
BackendsMap CreateSupportedBackends(TensorHandleFactoryRegistry &handleFactoryRegistry, BackendSettings &backendSettings)
Definition: Network.cpp:1124
OptimizeForConnection< ConvertFp32ToFp16Layer, ConvertFp16ToFp32Layer, OptimizeInverseConversionsImpl > OptimizeInverseConversionsFp32
OptimizeForExclusiveConnection< PadLayer, Pooling2dLayer, pad_fold::FoldPadIntoPooling2dImpl > FoldPadIntoPooling2d
Infer missing output shapes and validate all output shapes.
OptimizeForType< Layer, ConvertFp32NetworkToFp16Impl > Fp32NetworkToFp16Converter
IOptimizedNetwork(const IOptimizedNetwork &other, const ModelOptions &modelOptions)
Definition: Network.cpp:485
OptimizeForType< Layer, AddBroadcastReshapeLayerImpl > AddBroadcastReshapeLayer
OptimizeForConnection< ConstantLayer, DequantizeLayer, ConvertConstDequantisationLayersToConstLayersImpl > ConvertConstDequantisationLayersToConstLayers
static void Destroy(IOptimizedNetwork *network)
Definition: Network.cpp:499
OptimizeForType< Layer, ConvertFp32NetworkToBf16Impl > Fp32NetworkToBf16Converter
OptimizeForConnection< ConstantLayer, ConvertFp32ToBf16Layer, FuseConvertFp32ToBf16IntoConstLayers > FuseConversionLayersIntoConstLayers
std::map< BackendId, std::unique_ptr< class IBackendInternal > > BackendsMap
Definition: Network.hpp:293

Member Data Documentation

◆ pOptimizedNetworkImpl


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