ArmNN
 22.02
IOptimizedNetwork Class Reference

#include <INetwork.hpp>

Public Member Functions

Status PrintGraph ()
 
Status SerializeToDot (std::ostream &stream) const
 
profiling::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...
 

Detailed Description

Definition at line 790 of file INetwork.hpp.

Constructor & Destructor Documentation

◆ IOptimizedNetwork() [1/4]

IOptimizedNetwork ( const IOptimizedNetwork other,
const ModelOptions modelOptions 
)

Definition at line 502 of file Network.cpp.

Referenced by armnn::Optimize().

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

◆ IOptimizedNetwork() [2/4]

IOptimizedNetwork ( std::unique_ptr< Graph graph)

Definition at line 505 of file Network.cpp.

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

◆ IOptimizedNetwork() [3/4]

IOptimizedNetwork ( std::unique_ptr< OptimizedNetworkImpl impl)

Definition at line 508 of file Network.cpp.

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

◆ ~IOptimizedNetwork()

◆ IOptimizedNetwork() [4/4]

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

Definition at line 511 of file Network.cpp.

References IOptimizedNetwork::~IOptimizedNetwork().

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

Member Function Documentation

◆ Destroy()

void Destroy ( IOptimizedNetwork network)
static

Definition at line 516 of file Network.cpp.

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

517 {
518  delete network;
519 }

◆ GetGuid()

profiling::ProfilingGuid GetGuid ( ) const

Definition at line 536 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

537 {
538  return pOptimizedNetworkImpl->GetGuid();
539 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:828

◆ GetNumInputs()

size_t GetNumInputs ( ) const

Definition at line 541 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

542 {
543  return pOptimizedNetworkImpl->GetNumInputs();
544 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:828

◆ GetNumOutputs()

size_t GetNumOutputs ( ) const

Definition at line 546 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

547 {
548  return pOptimizedNetworkImpl->GetNumOutputs();
549 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:828

◆ GetProfiler()

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

Definition at line 531 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

532 {
533  return pOptimizedNetworkImpl->GetGraph().GetProfiler();
534 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:828

◆ PrintGraph()

Status PrintGraph ( )

Definition at line 521 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

522 {
523  return pOptimizedNetworkImpl->PrintGraph();
524 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:828

◆ SerializeToDot()

Status SerializeToDot ( std::ostream &  stream) const

Definition at line 526 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

527 {
528  return pOptimizedNetworkImpl->SerializeToDot(stream);
529 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:828

Friends And Related Function Documentation

◆ experimental::AsyncNetworkImpl

friend class experimental::AsyncNetworkImpl
friend

Definition at line 815 of file INetwork.hpp.

◆ experimental::WorkingMemHandle

friend class experimental::WorkingMemHandle
friend

Definition at line 816 of file INetwork.hpp.

◆ GetGraphForTesting

Graph& GetGraphForTesting ( IOptimizedNetwork optNetPtr)
friend

Definition at line 47 of file TestUtils.cpp.

48 {
49  return optNet->pOptimizedNetworkImpl->GetGraph();
50 }

◆ GetModelOptionsForTesting

ModelOptions& GetModelOptionsForTesting ( IOptimizedNetwork optNetPtr)
friend

Definition at line 52 of file TestUtils.cpp.

53 {
54  return optNet->pOptimizedNetworkImpl->GetModelOptions();
55 }

◆ LoadedNetwork

friend class LoadedNetwork
friend

Definition at line 813 of file INetwork.hpp.

◆ Optimize

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

1685 {
1686  ARMNN_LOG(debug) << options.ToString();
1687 
1688  // Enable profiling
1689  auto profiler = inNetwork.pNetworkImpl->GetGraph().GetProfiler();
1691  profiler->EnableProfiling(options.m_ProfilingEnabled);
1692 
1694  if (backendPreferences.empty())
1695  {
1696  throw InvalidArgumentException("Invoked Optimize with no backends specified");
1697  }
1698 
1699  if (options.m_ReduceFp32ToFp16 && options.m_ReduceFp32ToBf16)
1700  {
1701  throw InvalidArgumentException("BFloat16 and Float16 optimization cannot be enabled at the same time.");
1702  }
1703 
1704  // Ensure TensorInfo is set on all output slots of ConstantLayers in the graph
1705  inNetwork.pNetworkImpl->GetGraph().VerifyConstantLayerSetTensorInfo();
1706 
1707  std::unique_ptr<Graph> graph = std::make_unique<Graph>(inNetwork.pNetworkImpl->GetGraph());
1708 
1709  auto optNet = IOptimizedNetworkPtr(new IOptimizedNetwork(std::move(graph), options.m_ModelOptions),
1711 
1712  IOptimizedNetwork* optNetObjPtr = optNet.get();
1713 
1714  // Get the optimized graph
1715  Graph& optGraph = optNetObjPtr->pOptimizedNetworkImpl->GetGraph();
1716 
1717  if(options.m_shapeInferenceMethod == ShapeInferenceMethod::InferAndValidate)
1718  {
1719  // Infer the tensor infos for all output slots. Throws an exception on failure
1720  optGraph.InferTensorInfos();
1721  }
1722 
1723  // Perform AddBroadcastReshapeLayer optimisation
1724  using namespace optimizations;
1726 
1727  if(options.m_shapeInferenceMethod == ShapeInferenceMethod::ValidateOnly)
1728  {
1729  // Validate the tensor infos for all output slots. Throws an exception on failure
1730  optGraph.InferTensorInfos();
1731  }
1732 
1733  // Perform optimisation passes
1739  MovePermuteUp(),
1740  MoveTransposeUp(),
1741  PermuteAsReshape(),
1754 
1755  // If Fp32 to Fp16 optimization is set convert Fp32 network to Fp16
1756  if (options.m_ReduceFp32ToFp16)
1757  {
1758  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ReduceFp32ToFp16");
1761  }
1762 
1763  // If Fp32 to Bf16 optimization is set convert Fp32 network to Bf16
1764  // Convert input of Convolution2d and FullyConnected from Fp32 to Bf16
1765  // Only Constant weight of Convolution2d and FullyConnected are converted from Fp32 to Bf16
1766  if (options.m_ReduceFp32ToBf16)
1767  {
1768  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ReduceFp32ToBf16");
1770  }
1771 
1772  // Initialize backend settings
1773  BackendSettings backendSettings(backendPreferences, deviceSpec);
1774  if (backendSettings.GetAvailablePreferredBackends().empty())
1775  {
1776  std::stringstream failureMsg;
1777  failureMsg << "None of the preferred backends " << backendPreferences
1778  << " are supported. Current platform provides " << backendSettings.m_SupportedBackends;
1779  ReportError(failureMsg.str(), messages);
1780  throw InvalidArgumentException(failureMsg.str());
1781  }
1782 
1783  // Create a map to temporarily hold initialized backend objects
1784  TensorHandleFactoryRegistry tensorHandleFactoryRegistry;
1785  BackendsMap backends = CreateSupportedBackends(tensorHandleFactoryRegistry, backendSettings);
1786 
1787  // Assign an available backend to each layer
1788  Graph::Iterator firstLayer = optGraph.begin();
1789  Graph::Iterator lastLayer = optGraph.end();
1790  OptimizationResult assignBackendsResult = AssignBackends(optNetObjPtr->pOptimizedNetworkImpl.get(),
1791  backendSettings,
1792  firstLayer,
1793  lastLayer,
1794  messages);
1795  if (assignBackendsResult.m_Error)
1796  {
1797  // Failed to assign a backend to each layer
1798  throw InvalidArgumentException("Failed to assign a backend to each layer");
1799  }
1800 
1803 
1804  // Apply the backend-specific optimizations
1805  OptimizationResult backendOptimizationResult = ApplyBackendOptimizations(optNetObjPtr->pOptimizedNetworkImpl.get(),
1806  backendSettings,
1807  backends,
1808  options.m_ModelOptions,
1809  messages);
1810  if (backendOptimizationResult.m_Error)
1811  {
1812  // Failed to apply the backend-specific optimizations
1813  throw InvalidArgumentException("Failed to apply the backend-specific optimizations");
1814  }
1815 
1816  // If the debug flag is set, then insert a DebugLayer after each layer
1817  // Doing this after applying the backend optimizations as they might have changed some layers
1818  if (options.m_Debug)
1819  {
1821  }
1822 
1823  // Calculate the compatibility strategies for tensor handles
1824  OptimizationResult strategyResult = SelectTensorHandleStrategy(optGraph,
1825  backends,
1826  tensorHandleFactoryRegistry,
1827  options.m_ImportEnabled,
1828  messages);
1829  if (strategyResult.m_Error)
1830  {
1831  // Failed to apply the backend-specific optimizations
1833  }
1834 
1835  // Based on the tensor handle strategy determined above, insert copy layers where required.
1836  {
1837  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_AddCompatibilityLayers");
1838  optGraph.AddCompatibilityLayers(backends, tensorHandleFactoryRegistry);
1839  }
1840 
1841  // Convert constants
1842  {
1843  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ConvertConstants");
1846  }
1847  return optNet;
1848 }
OptimizeForConnection< Layer, PermuteLayer, SquashEqualSiblingsImpl< PermuteLayer > > SquashEqualPermuteSiblings
void ReportError(const std::string &errorMessage, Optional< std::vector< std::string > &> errorMessages)
Definition: Network.cpp:572
OptimizationResult AssignBackends(OptimizedNetworkImpl *optNetObjPtr, BackendSettings &backendSettings, Graph::Iterator &firstLayer, Graph::Iterator &lastLayer, Optional< std::vector< std::string > &> errMessages)
Definition: Network.cpp:1034
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:568
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
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< 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:1155
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:575
ConvertConstants< Float16ToFloat32, IsFloat32Layer > ConvertConstantsHalfToFloat
BackendsMap CreateSupportedBackends(TensorHandleFactoryRegistry &handleFactoryRegistry, BackendSettings &backendSettings)
Definition: Network.cpp:1136
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:1611
IOptimizedNetwork(const IOptimizedNetwork &other, const ModelOptions &modelOptions)
Definition: Network.cpp:502
OptimizeForType< Layer, AddBroadcastReshapeLayerImpl > AddBroadcastReshapeLayer
static void Destroy(IOptimizedNetwork *network)
Definition: Network.cpp:516
OptimizeForType< Layer, ConvertFp32NetworkToBf16Impl > Fp32NetworkToBf16Converter
std::map< BackendId, std::unique_ptr< class IBackendInternal > > BackendsMap
Definition: Network.hpp:287
OptimizeForType< FullyConnectedLayer, RedirectMembersToConstantInputsImpl > RedirectMembersToConstantInputs

Member Data Documentation

◆ pOptimizedNetworkImpl


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