ArmNN
 22.05.01
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
 
 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 799 of file INetwork.hpp.

Constructor & Destructor Documentation

◆ IOptimizedNetwork() [1/4]

IOptimizedNetwork ( const IOptimizedNetwork other,
const ModelOptions modelOptions 
)

Definition at line 486 of file Network.cpp.

Referenced by armnn::Optimize().

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

◆ IOptimizedNetwork() [2/4]

IOptimizedNetwork ( std::unique_ptr< Graph graph)

Definition at line 489 of file Network.cpp.

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

◆ IOptimizedNetwork() [3/4]

IOptimizedNetwork ( std::unique_ptr< OptimizedNetworkImpl impl)

Definition at line 492 of file Network.cpp.

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

◆ ~IOptimizedNetwork()

◆ IOptimizedNetwork() [4/4]

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

Definition at line 495 of file Network.cpp.

References IOptimizedNetwork::~IOptimizedNetwork().

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

Member Function Documentation

◆ Destroy()

void Destroy ( IOptimizedNetwork network)
static

Definition at line 500 of file Network.cpp.

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

501 {
502  delete network;
503 }

◆ GetGuid()

arm::pipe::ProfilingGuid GetGuid ( ) const

Definition at line 520 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

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

◆ GetNumInputs()

size_t GetNumInputs ( ) const

Definition at line 525 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

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

◆ GetNumOutputs()

size_t GetNumOutputs ( ) const

Definition at line 530 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

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

◆ GetProfiler()

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

Definition at line 515 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

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

◆ PrintGraph()

Status PrintGraph ( )

Definition at line 505 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

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

◆ SerializeToDot()

Status SerializeToDot ( std::ostream &  stream) const

Definition at line 510 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

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

Friends And Related Function Documentation

◆ experimental::AsyncNetworkImpl

friend class experimental::AsyncNetworkImpl
friend

Definition at line 824 of file INetwork.hpp.

◆ experimental::WorkingMemHandle

friend class experimental::WorkingMemHandle
friend

Definition at line 825 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 822 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 1847 of file Network.cpp.

Referenced by armnn::Optimize().

1852 {
1853  return Optimize(inNetwork.pNetworkImpl->GetGraph(),
1854  backendPreferences,
1855  deviceSpec,
1856  options,
1857  messages);
1858 }
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:1847

◆ 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 1670 of file Network.cpp.

1675 {
1676  ARMNN_LOG(debug) << options.ToString();
1677 
1678  // Enable profiling
1679  auto profiler = inGraph.GetProfiler();
1681  profiler->EnableProfiling(options.m_ProfilingEnabled);
1682 
1684  if (backendPreferences.empty())
1685  {
1686  throw InvalidArgumentException("Invoked Optimize with no backends specified");
1687  }
1688 
1689  if (options.m_ReduceFp32ToFp16 && options.m_ReduceFp32ToBf16)
1690  {
1691  throw InvalidArgumentException("BFloat16 and Float16 optimization cannot be enabled at the same time.");
1692  }
1693 
1694  // Ensure TensorInfo is set on all output slots of ConstantLayers in the graph
1695  inGraph.VerifyConstantLayerSetTensorInfo();
1696 
1697  std::unique_ptr<Graph> graph = std::make_unique<Graph>(inGraph);
1698 
1699  auto optNet = IOptimizedNetworkPtr(new IOptimizedNetwork(std::move(graph), options.m_ModelOptions),
1701 
1702  IOptimizedNetwork* optNetObjPtr = optNet.get();
1703 
1704  // Get the optimized graph
1705  Graph& optGraph = optNetObjPtr->pOptimizedNetworkImpl->GetGraph();
1706 
1707  if(options.m_shapeInferenceMethod == ShapeInferenceMethod::InferAndValidate)
1708  {
1709  // Infer the tensor infos for all output slots. Throws an exception on failure
1710  optGraph.InferTensorInfos();
1711  }
1712 
1713  // Perform AddBroadcastReshapeLayer optimisation
1714  using namespace optimizations;
1716 
1717  if(options.m_shapeInferenceMethod == ShapeInferenceMethod::ValidateOnly)
1718  {
1719  // Validate the tensor infos for all output slots. Throws an exception on failure
1720  optGraph.InferTensorInfos();
1721  }
1722 
1723  // Need to FusePermuteIntoConstantLayer before FoldPadIntoDepthwiseConvolution2d or
1724  // FuseBatchNormIntoDepthwiseConvolution2D optimizations are called.
1726 
1727  // Perform optimisation passes
1733  MovePermuteUp(),
1734  MoveTransposeUp(),
1735  PermuteAsReshape(),
1748 
1749  // If Fp32 to Fp16 optimization is set convert Fp32 network to Fp16
1750  if (options.m_ReduceFp32ToFp16)
1751  {
1752  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ReduceFp32ToFp16");
1755  }
1756 
1757  // If Fp32 to Bf16 optimization is set convert Fp32 network to Bf16
1758  // Convert input of Convolution2d and FullyConnected from Fp32 to Bf16
1759  // Only Constant weight of Convolution2d and FullyConnected are converted from Fp32 to Bf16
1760  if (options.m_ReduceFp32ToBf16)
1761  {
1762  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ReduceFp32ToBf16");
1764  }
1765 
1766  // Initialize backend settings
1767  BackendSettings backendSettings(backendPreferences, deviceSpec);
1768  if (backendSettings.GetAvailablePreferredBackends().empty())
1769  {
1770  std::stringstream failureMsg;
1771  failureMsg << "None of the preferred backends " << backendPreferences
1772  << " are supported. Current platform provides " << backendSettings.m_SupportedBackends;
1773  ReportError(failureMsg.str(), messages);
1774  throw InvalidArgumentException(failureMsg.str());
1775  }
1776 
1777  // Create a map to temporarily hold initialized backend objects
1778  TensorHandleFactoryRegistry tensorHandleFactoryRegistry;
1779  BackendsMap backends = CreateSupportedBackends(tensorHandleFactoryRegistry, backendSettings);
1780 
1781  // Assign an available backend to each layer
1782  Graph::Iterator firstLayer = optGraph.begin();
1783  Graph::Iterator lastLayer = optGraph.end();
1784  OptimizationResult assignBackendsResult = AssignBackends(optNetObjPtr->pOptimizedNetworkImpl.get(),
1785  backendSettings,
1786  firstLayer,
1787  lastLayer,
1788  messages);
1789  if (assignBackendsResult.m_Error)
1790  {
1791  // Failed to assign a backend to each layer
1792  throw InvalidArgumentException("Failed to assign a backend to each layer");
1793  }
1794 
1797 
1798  // Apply the backend-specific optimizations
1799  OptimizationResult backendOptimizationResult = ApplyBackendOptimizations(optNetObjPtr->pOptimizedNetworkImpl.get(),
1800  backendSettings,
1801  backends,
1802  options.m_ModelOptions,
1803  messages);
1804  if (backendOptimizationResult.m_Error)
1805  {
1806  // Failed to apply the backend-specific optimizations
1807  throw InvalidArgumentException("Failed to apply the backend-specific optimizations");
1808  }
1809 
1810  // If the debug flag is set, then insert a DebugLayer after each layer
1811  // Doing this after applying the backend optimizations as they might have changed some layers
1812  if (options.m_Debug)
1813  {
1815  }
1816 
1817  // Calculate the compatibility strategies for tensor handles
1818  OptimizationResult strategyResult = SelectTensorHandleStrategy(optGraph,
1819  backends,
1820  tensorHandleFactoryRegistry,
1821  options.m_ImportEnabled,
1822  messages);
1823  if (strategyResult.m_Error)
1824  {
1825  // Failed to apply the backend-specific optimizations
1827  }
1828 
1829  // Based on the tensor handle strategy determined above, insert copy layers where required.
1830  {
1831  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_AddCompatibilityLayers");
1832  optGraph.AddCompatibilityLayers(backends, tensorHandleFactoryRegistry);
1833  }
1834 
1835  // Convert constants
1836  {
1837  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ConvertConstants");
1840 
1841  // Once the constants are converted we can now safely call RedirectMembersToConstantInputs
1843  }
1844  return optNet;
1845 }
OptimizeForConnection< Layer, PermuteLayer, SquashEqualSiblingsImpl< PermuteLayer > > SquashEqualPermuteSiblings
void ReportError(const std::string &errorMessage, Optional< std::vector< std::string > &> errorMessages)
Definition: Network.cpp:556
OptimizationResult AssignBackends(OptimizedNetworkImpl *optNetObjPtr, BackendSettings &backendSettings, Graph::Iterator &firstLayer, Graph::Iterator &lastLayer, Optional< std::vector< std::string > &> errMessages)
Definition: Network.cpp:1018
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
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:1139
Validate all output shapes.
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
Definition: INetwork.hpp:242
OptimizeForType< PermuteLayer, PermuteAsReshapeImpl > PermuteAsReshape
OptimizeForConnection< Layer, TransposeLayer, SquashEqualSiblingsImpl< TransposeLayer > > SquashEqualTransposeSiblings
void RegisterProfiler(IProfiler *profiler)
Definition: Profiling.cpp:579
ConvertConstants< Float16ToFloat32, IsFloat32Layer > ConvertConstantsHalfToFloat
BackendsMap CreateSupportedBackends(TensorHandleFactoryRegistry &handleFactoryRegistry, BackendSettings &backendSettings)
Definition: Network.cpp:1120
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
OptimizationResult SelectTensorHandleStrategy(Graph &optGraph, BackendsMap &backends, TensorHandleFactoryRegistry &registry, bool importEnabled, Optional< std::vector< std::string > &> errMessages)
Definition: Network.cpp:1601
IOptimizedNetwork(const IOptimizedNetwork &other, const ModelOptions &modelOptions)
Definition: Network.cpp:486
OptimizeForType< Layer, AddBroadcastReshapeLayerImpl > AddBroadcastReshapeLayer
OptimizeForConnection< ConstantLayer, DequantizeLayer, ConvertConstDequantisationLayersToConstLayersImpl > ConvertConstDequantisationLayersToConstLayers
static void Destroy(IOptimizedNetwork *network)
Definition: Network.cpp:500
OptimizeForType< Layer, ConvertFp32NetworkToBf16Impl > Fp32NetworkToBf16Converter
std::map< BackendId, std::unique_ptr< class IBackendInternal > > BackendsMap
Definition: Network.hpp:294

Member Data Documentation

◆ pOptimizedNetworkImpl


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