ArmNN
 22.11
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 770 of file INetwork.hpp.

Constructor & Destructor Documentation

◆ IOptimizedNetwork() [1/4]

IOptimizedNetwork ( const IOptimizedNetwork other,
const ModelOptions modelOptions 
)

Definition at line 461 of file Network.cpp.

Referenced by armnn::Optimize().

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

◆ IOptimizedNetwork() [2/4]

IOptimizedNetwork ( std::unique_ptr< Graph graph)

Definition at line 464 of file Network.cpp.

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

◆ IOptimizedNetwork() [3/4]

IOptimizedNetwork ( std::unique_ptr< OptimizedNetworkImpl impl)

Definition at line 467 of file Network.cpp.

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

◆ ~IOptimizedNetwork()

◆ IOptimizedNetwork() [4/4]

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

Definition at line 470 of file Network.cpp.

References IOptimizedNetwork::~IOptimizedNetwork().

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

Member Function Documentation

◆ Destroy()

void Destroy ( IOptimizedNetwork network)
static

Definition at line 475 of file Network.cpp.

Referenced by armnn::Optimize().

476 {
477  delete network;
478 }

◆ ExecuteStrategy()

void ExecuteStrategy ( IStrategy strategy) const

Definition at line 2942 of file Network.cpp.

2943 {
2944  pOptimizedNetworkImpl->ExecuteStrategy(strategy);
2945 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:815

◆ GetGuid()

arm::pipe::ProfilingGuid GetGuid ( ) const

Definition at line 495 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

496 {
497  return pOptimizedNetworkImpl->GetGuid();
498 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:815

◆ GetNumInputs()

size_t GetNumInputs ( ) const

Definition at line 500 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

501 {
502  return pOptimizedNetworkImpl->GetNumInputs();
503 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:815

◆ GetNumOutputs()

size_t GetNumOutputs ( ) const

Definition at line 505 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

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

◆ GetProfiler()

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

Definition at line 490 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

491 {
492  return pOptimizedNetworkImpl->GetGraph().GetProfiler();
493 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:815

◆ PrintGraph()

Status PrintGraph ( )

Definition at line 480 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

481 {
482  return pOptimizedNetworkImpl->PrintGraph();
483 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:815

◆ SerializeToDot()

Status SerializeToDot ( std::ostream &  stream) const

Definition at line 485 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

Referenced by armnn_driver::ExportNetworkGraphToDotFile().

486 {
487  return pOptimizedNetworkImpl->SerializeToDot(stream);
488 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:815

Friends And Related Function Documentation

◆ experimental::AsyncNetworkImpl

friend class experimental::AsyncNetworkImpl
friend

Definition at line 797 of file INetwork.hpp.

◆ experimental::WorkingMemHandle

friend class experimental::WorkingMemHandle
friend

Definition at line 798 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 795 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 1850 of file Network.cpp.

Referenced by armnn::Optimize().

1855 {
1856  return Optimize(inNetwork.pNetworkImpl->GetGraph(),
1857  backendPreferences,
1858  deviceSpec,
1859  options,
1860  messages);
1861 }
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:1850

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

1658 {
1659  ARMNN_LOG(debug) << options.ToString();
1660 
1661  // Enable profiling
1662  auto profiler = inGraph.GetProfiler();
1664  profiler->EnableProfiling(options.m_ProfilingEnabled);
1665 
1667  if (backendPreferences.empty())
1668  {
1669  throw InvalidArgumentException("Invoked Optimize with no backends specified");
1670  }
1671 
1672  if (options.m_ReduceFp32ToFp16 && options.m_ReduceFp32ToBf16)
1673  {
1674  throw InvalidArgumentException("BFloat16 and Float16 optimization cannot be enabled at the same time.");
1675  }
1676 
1677  // Ensure TensorInfo is set on all output slots of ConstantLayers in the graph
1678  inGraph.VerifyConstantLayerSetTensorInfo();
1679 
1680  std::unique_ptr<Graph> graph = std::make_unique<Graph>(inGraph);
1681 
1682  // We need to pass on the information about whether import and export is enabled to the LoadNetwork phase.
1683  // The mechanism to do that is to add model options to the optimized network.
1684  armnn::BackendOptions importExport("Global",
1685  {{"ImportEnabled", options.m_ImportEnabled},
1686  {"ExportEnabled", options.m_ExportEnabled}});
1687  ModelOptions optimizedOptions(options.m_ModelOptions);
1688  optimizedOptions.push_back(importExport);
1689 
1690  auto optNet = IOptimizedNetworkPtr(new IOptimizedNetwork(std::move(graph), optimizedOptions),
1692 
1693  IOptimizedNetwork* optNetObjPtr = optNet.get();
1694 
1695  // Get the optimized graph
1696  Graph& optGraph = optNetObjPtr->pOptimizedNetworkImpl->GetGraph();
1697 
1698  if(options.m_shapeInferenceMethod == ShapeInferenceMethod::InferAndValidate)
1699  {
1700  // Infer the tensor infos for all output slots. Throws an exception on failure
1701  optGraph.InferTensorInfos();
1702  }
1703 
1704  // Perform AddBroadcastReshapeLayer optimisation
1705  using namespace optimizations;
1707 
1708  if(options.m_shapeInferenceMethod == ShapeInferenceMethod::ValidateOnly)
1709  {
1710  // Validate the tensor infos for all output slots. Throws an exception on failure
1711  optGraph.InferTensorInfos();
1712  }
1713 
1714  // Need to FusePermuteIntoConstantLayer before FoldPadIntoDepthwiseConvolution2d or
1715  // FuseBatchNormIntoDepthwiseConvolution2D optimizations are called.
1717 
1718  // Perform optimisation passes
1724  MovePermuteUp(),
1725  MoveTransposeUp(),
1726  PermuteAsReshape(),
1739 
1740  // If Fp32 to Fp16 optimization is set convert Fp32 network to Fp16
1741  if (options.m_ReduceFp32ToFp16)
1742  {
1743  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ReduceFp32ToFp16");
1746  }
1747 
1748  // If Fp32 to Bf16 optimization is set convert Fp32 network to Bf16
1749  // Convert input of Convolution2d and FullyConnected from Fp32 to Bf16
1750  // Only Constant weight of Convolution2d and FullyConnected are converted from Fp32 to Bf16
1751  // Constant and Fp32ToBf16 layers will also be fused so conversion is no longer needed at inference time
1752  if (options.m_ReduceFp32ToBf16)
1753  {
1754  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ReduceFp32ToBf16");
1757  }
1758 
1759  // Initialize backend settings
1760  BackendSettings backendSettings(backendPreferences, deviceSpec);
1761  if (backendSettings.GetAvailablePreferredBackends().empty())
1762  {
1763  std::stringstream failureMsg;
1764  failureMsg << "None of the preferred backends " << backendPreferences
1765  << " are supported. Current platform provides " << backendSettings.m_SupportedBackends;
1766  ReportError(failureMsg.str(), messages);
1767  throw InvalidArgumentException(failureMsg.str());
1768  }
1769 
1770  // Create a map to temporarily hold initialized backend objects
1771  TensorHandleFactoryRegistry tensorHandleFactoryRegistry;
1772  BackendsMap backends = CreateSupportedBackends(tensorHandleFactoryRegistry, backendSettings);
1773 
1774  // Assign an available backend to each layer
1775  Graph::Iterator firstLayer = optGraph.begin();
1776  Graph::Iterator lastLayer = optGraph.end();
1777  OptimizationResult assignBackendsResult = AssignBackends(optNetObjPtr->pOptimizedNetworkImpl.get(),
1778  backendSettings,
1779  firstLayer,
1780  lastLayer,
1781  messages);
1782  if (assignBackendsResult.m_Error)
1783  {
1784  // Failed to assign a backend to each layer
1785  throw InvalidArgumentException("Failed to assign a backend to each layer");
1786  }
1787 
1790 
1791  // Apply the backend-specific optimizations
1792  OptimizationResult backendOptimizationResult = ApplyBackendOptimizations(optNetObjPtr->pOptimizedNetworkImpl.get(),
1793  backendSettings,
1794  backends,
1795  options.m_ModelOptions,
1796  messages);
1797  if (backendOptimizationResult.m_Error)
1798  {
1799  // Failed to apply the backend-specific optimizations
1800  throw InvalidArgumentException("Failed to apply the backend-specific optimizations");
1801  }
1802 
1803  // Convert constants
1804  {
1805  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ConvertConstants");
1808 
1809  // Once the constants are converted we can now safely call RedirectMembersToConstantInputs
1811  }
1812 
1813  // This must occur after all topological changes to the graph and any redirection of variables
1814  // If the debug flag is set, then insert a DebugLayer after each layer
1815  // Doing this after applying the backend optimizations as they might have changed some layers
1816  if (options.m_Debug && !options.m_DebugToFile)
1817  {
1819  }
1820  else if (options.m_DebugToFile)
1821  {
1822  // Setup the output file path
1823  armnnUtils::Filesystem::CreateDirectory("/ArmNNIntermediateLayerOutputs");
1825  }
1826 
1827  // Calculate the compatibility strategies for tensor handles
1828  OptimizationResult strategyResult = SelectTensorHandleStrategy(optGraph,
1829  backends,
1830  tensorHandleFactoryRegistry,
1831  options.m_ImportEnabled,
1832  options.m_ExportEnabled,
1833  messages);
1834 
1835  if (strategyResult.m_Error)
1836  {
1837  // Failed to apply the backend-specific optimizations
1839  }
1840 
1841  // Based on the tensor handle strategy determined above, insert copy layers where required.
1842  {
1843  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_AddCompatibilityLayers");
1844  optGraph.AddCompatibilityLayers(backends, tensorHandleFactoryRegistry);
1845  }
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:531
OptimizationResult AssignBackends(OptimizedNetworkImpl *optNetObjPtr, BackendSettings &backendSettings, Graph::Iterator &firstLayer, Graph::Iterator &lastLayer, Optional< std::vector< std::string > &> errMessages)
Definition: Network.cpp:1000
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:593
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:53
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:1121
std::string CreateDirectory(std::string sPath)
Returns full path to temporary folder.
Definition: Filesystem.cpp:46
OptimizationResult SelectTensorHandleStrategy(Graph &optGraph, BackendsMap &backends, TensorHandleFactoryRegistry &registry, bool importEnabled, bool exportEnabled, Optional< std::vector< std::string > &> errMessages)
Definition: Network.cpp:1583
Validate all output shapes.
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
Definition: INetwork.hpp:254
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:600
ConvertConstants< Float16ToFloat32, IsFloat32Layer > ConvertConstantsHalfToFloat
BackendsMap CreateSupportedBackends(TensorHandleFactoryRegistry &handleFactoryRegistry, BackendSettings &backendSettings)
Definition: Network.cpp:1102
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:461
OptimizeForType< Layer, AddBroadcastReshapeLayerImpl > AddBroadcastReshapeLayer
OptimizeForConnection< ConstantLayer, DequantizeLayer, ConvertConstDequantisationLayersToConstLayersImpl > ConvertConstDequantisationLayersToConstLayers
static void Destroy(IOptimizedNetwork *network)
Definition: Network.cpp:475
OptimizeForType< Layer, ConvertFp32NetworkToBf16Impl > Fp32NetworkToBf16Converter
OptimizeForConnection< ConstantLayer, ConvertFp32ToBf16Layer, FuseConvertFp32ToBf16IntoConstLayers > FuseConversionLayersIntoConstLayers
OptimizeForType< Layer, AddDebugToFileImpl > InsertDebugToFileLayer
Definition: AddDebug.hpp:54
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: