ArmNN
 21.11
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 725 of file INetwork.hpp.

Constructor & Destructor Documentation

◆ IOptimizedNetwork() [1/4]

IOptimizedNetwork ( const IOptimizedNetwork other,
const ModelOptions modelOptions 
)

Definition at line 488 of file Network.cpp.

Referenced by armnn::Optimize().

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

◆ IOptimizedNetwork() [2/4]

IOptimizedNetwork ( std::unique_ptr< Graph graph)

Definition at line 491 of file Network.cpp.

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

◆ IOptimizedNetwork() [3/4]

IOptimizedNetwork ( std::unique_ptr< OptimizedNetworkImpl impl)

Definition at line 494 of file Network.cpp.

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

◆ ~IOptimizedNetwork()

◆ IOptimizedNetwork() [4/4]

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

Definition at line 497 of file Network.cpp.

References IOptimizedNetwork::~IOptimizedNetwork().

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

Member Function Documentation

◆ Destroy()

void Destroy ( IOptimizedNetwork network)
static

Definition at line 502 of file Network.cpp.

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

503 {
504  delete network;
505 }

◆ GetGuid()

profiling::ProfilingGuid GetGuid ( ) const

Definition at line 522 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

523 {
524  return pOptimizedNetworkImpl->GetGuid();
525 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:763

◆ GetNumInputs()

size_t GetNumInputs ( ) const

Definition at line 527 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

528 {
529  return pOptimizedNetworkImpl->GetNumInputs();
530 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:763

◆ GetNumOutputs()

size_t GetNumOutputs ( ) const

Definition at line 532 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

533 {
534  return pOptimizedNetworkImpl->GetNumOutputs();
535 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:763

◆ GetProfiler()

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

Definition at line 517 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

518 {
519  return pOptimizedNetworkImpl->GetGraph().GetProfiler();
520 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:763

◆ PrintGraph()

Status PrintGraph ( )

Definition at line 507 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

508 {
509  return pOptimizedNetworkImpl->PrintGraph();
510 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:763

◆ SerializeToDot()

Status SerializeToDot ( std::ostream &  stream) const

Definition at line 512 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

513 {
514  return pOptimizedNetworkImpl->SerializeToDot(stream);
515 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:763

Friends And Related Function Documentation

◆ experimental::AsyncNetworkImpl

friend class experimental::AsyncNetworkImpl
friend

Definition at line 750 of file INetwork.hpp.

◆ experimental::WorkingMemHandle

friend class experimental::WorkingMemHandle
friend

Definition at line 751 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 748 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 1605 of file Network.cpp.

1610 {
1611  // Enable profiling
1612  auto profiler = inNetwork.pNetworkImpl->GetGraph().GetProfiler();
1614  profiler->EnableProfiling(options.m_ProfilingEnabled);
1615 
1617  if (backendPreferences.empty())
1618  {
1619  throw InvalidArgumentException("Invoked Optimize with no backends specified");
1620  }
1621 
1622  if (options.m_ReduceFp32ToFp16 && options.m_ReduceFp32ToBf16)
1623  {
1624  throw InvalidArgumentException("BFloat16 and Float16 optimization cannot be enabled at the same time.");
1625  }
1626 
1627  // Ensure TensorInfo is set on all output slots of ConstantLayers in the graph
1628  inNetwork.pNetworkImpl->GetGraph().VerifyConstantLayerSetTensorInfo();
1629 
1630  std::unique_ptr<Graph> graph = std::make_unique<Graph>(inNetwork.pNetworkImpl->GetGraph());
1631 
1632  auto optNet = IOptimizedNetworkPtr(new IOptimizedNetwork(std::move(graph), options.m_ModelOptions),
1634 
1635  IOptimizedNetwork* optNetObjPtr = optNet.get();
1636 
1637  // Get the optimized graph
1638  Graph& optGraph = optNetObjPtr->pOptimizedNetworkImpl->GetGraph();
1639 
1640  if(options.m_shapeInferenceMethod == ShapeInferenceMethod::InferAndValidate)
1641  {
1642  // Infer the tensor infos for all output slots. Throws an exception on failure
1643  optGraph.InferTensorInfos();
1644  }
1645 
1646  // Perform AddBroadcastReshapeLayer optimisation
1647  using namespace optimizations;
1649 
1650  if(options.m_shapeInferenceMethod == ShapeInferenceMethod::ValidateOnly)
1651  {
1652  // Validate the tensor infos for all output slots. Throws an exception on failure
1653  optGraph.InferTensorInfos();
1654  }
1655 
1656  // Perform optimisation passes
1662  MovePermuteUp(),
1663  MoveTransposeUp(),
1664  PermuteAsReshape(),
1677 
1678  // If Fp32 to Fp16 optimization is set convert Fp32 network to Fp16
1679  if (options.m_ReduceFp32ToFp16)
1680  {
1681  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ReduceFp32ToFp16");
1684  }
1685 
1686  // If Fp32 to Bf16 optimization is set convert Fp32 network to Bf16
1687  // Convert input of Convolution2d and FullyConnected from Fp32 to Bf16
1688  // Only Constant weight of Convolution2d and FullyConnected are converted from Fp32 to Bf16
1689  if (options.m_ReduceFp32ToBf16)
1690  {
1691  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ReduceFp32ToBf16");
1693  }
1694 
1695  // Initialize backend settings
1696  BackendSettings backendSettings(backendPreferences, deviceSpec);
1697  if (backendSettings.GetAvailablePreferredBackends().empty())
1698  {
1699  std::stringstream failureMsg;
1700  failureMsg << "None of the preferred backends " << backendPreferences
1701  << " are supported. Current platform provides " << backendSettings.m_SupportedBackends;
1702  ReportError(failureMsg.str(), messages);
1703  throw InvalidArgumentException(failureMsg.str());
1704  }
1705 
1706  // Create a map to temporarily hold initialized backend objects
1707  TensorHandleFactoryRegistry tensorHandleFactoryRegistry;
1708  BackendsMap backends = CreateSupportedBackends(tensorHandleFactoryRegistry, backendSettings);
1709 
1710  // Assign an available backend to each layer
1711  Graph::Iterator firstLayer = optGraph.begin();
1712  Graph::Iterator lastLayer = optGraph.end();
1713  OptimizationResult assignBackendsResult = AssignBackends(optNetObjPtr->pOptimizedNetworkImpl.get(),
1714  backendSettings,
1715  firstLayer,
1716  lastLayer,
1717  messages);
1718  if (assignBackendsResult.m_Error)
1719  {
1720  // Failed to assign a backend to each layer
1721  throw InvalidArgumentException("Failed to assign a backend to each layer");
1722  }
1723 
1726 
1727  // Apply the backend-specific optimizations
1728  OptimizationResult backendOptimizationResult = ApplyBackendOptimizations(optNetObjPtr->pOptimizedNetworkImpl.get(),
1729  backendSettings,
1730  backends,
1731  options.m_ModelOptions,
1732  messages);
1733  if (backendOptimizationResult.m_Error)
1734  {
1735  // Failed to apply the backend-specific optimizations
1736  throw InvalidArgumentException("Failed to apply the backend-specific optimizations");
1737  }
1738 
1739  // If the debug flag is set, then insert a DebugLayer after each layer
1740  // Doing this after applying the backend optimizations as they might have changed some layers
1741  if (options.m_Debug)
1742  {
1744  }
1745 
1746  // Calculate the compatibility strategies for tensor handles
1747  OptimizationResult strategyResult = SelectTensorHandleStrategy(optGraph,
1748  backends,
1749  tensorHandleFactoryRegistry,
1750  options.m_ImportEnabled,
1751  messages);
1752  if (strategyResult.m_Error)
1753  {
1754  // Failed to apply the backend-specific optimizations
1756  }
1757 
1758  // Based on the tensor handle strategy determined above, insert copy layers where required.
1759  {
1760  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_AddCompatibilityLayers");
1761  optGraph.AddCompatibilityLayers(backends, tensorHandleFactoryRegistry);
1762  }
1763 
1764  // Convert constants
1765  {
1766  ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ConvertConstants");
1769  }
1770  return optNet;
1771 }
OptimizeForConnection< Layer, PermuteLayer, SquashEqualSiblingsImpl< PermuteLayer > > SquashEqualPermuteSiblings
void ReportError(const std::string &errorMessage, Optional< std::vector< std::string > &> errorMessages)
Definition: Network.cpp:558
OptimizationResult AssignBackends(OptimizedNetworkImpl *optNetObjPtr, BackendSettings &backendSettings, Graph::Iterator &firstLayer, Graph::Iterator &lastLayer, Optional< std::vector< std::string > &> errMessages)
Definition: Network.cpp:906
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
OptimizeForConnection< Layer, ReshapeLayer, SquashEqualSiblingsImpl< ReshapeLayer > > SquashEqualReshapeSiblings
OptimizeForConnection< Layer, TransposeLayer, MoveTransposeUpImpl > MoveTransposeUp
LayerList::const_iterator Iterator
Definition: Graph.hpp:51
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:1082
Validate all output shapes.
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
Definition: INetwork.hpp:198
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:1063
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:1536
IOptimizedNetwork(const IOptimizedNetwork &other, const ModelOptions &modelOptions)
Definition: Network.cpp:488
OptimizeForType< Layer, AddBroadcastReshapeLayerImpl > AddBroadcastReshapeLayer
static void Destroy(IOptimizedNetwork *network)
Definition: Network.cpp:502
OptimizeForType< Layer, ConvertFp32NetworkToBf16Impl > Fp32NetworkToBf16Converter
std::map< BackendId, std::unique_ptr< class IBackendInternal > > BackendsMap
Definition: Network.hpp:279
OptimizeForType< FullyConnectedLayer, RedirectMembersToConstantInputsImpl > RedirectMembersToConstantInputs

Member Data Documentation

◆ pOptimizedNetworkImpl


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