ArmNN
 21.05
IOptimizedNetwork Class Reference

#include <INetwork.hpp>

Public Member Functions

Status PrintGraph ()
 
Status SerializeToDot (std::ostream &stream) const
 
profiling::ProfilingGuid GetGuid () const
 
 IOptimizedNetwork (std::unique_ptr< Graph > graph)
 
 IOptimizedNetwork (std::unique_ptr< OptimizedNetworkImpl > impl)
 
 ~IOptimizedNetwork ()
 

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 720 of file INetwork.hpp.

Constructor & Destructor Documentation

◆ IOptimizedNetwork() [1/3]

IOptimizedNetwork ( std::unique_ptr< Graph graph)

Definition at line 540 of file Network.cpp.

Referenced by armnn::Optimize().

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

◆ IOptimizedNetwork() [2/3]

IOptimizedNetwork ( std::unique_ptr< OptimizedNetworkImpl impl)

Definition at line 543 of file Network.cpp.

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

◆ ~IOptimizedNetwork()

◆ IOptimizedNetwork() [3/3]

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

Definition at line 546 of file Network.cpp.

References IOptimizedNetwork::~IOptimizedNetwork().

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

Member Function Documentation

◆ Destroy()

void Destroy ( IOptimizedNetwork network)
static

Definition at line 551 of file Network.cpp.

Referenced by armnn::Optimize().

552 {
553  delete network;
554 }

◆ GetGuid()

profiling::ProfilingGuid GetGuid ( ) const

Definition at line 566 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

567 {
568  return pOptimizedNetworkImpl->GetGuid();
569 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:750

◆ PrintGraph()

Status PrintGraph ( )

Definition at line 556 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

557 {
558  return pOptimizedNetworkImpl->PrintGraph();
559 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:750

◆ SerializeToDot()

Status SerializeToDot ( std::ostream &  stream) const

Definition at line 561 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

562 {
563  return pOptimizedNetworkImpl->SerializeToDot(stream);
564 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:750

Friends And Related Function Documentation

◆ experimental::AsyncNetworkImpl

friend class experimental::AsyncNetworkImpl
friend

Definition at line 737 of file INetwork.hpp.

◆ experimental::WorkingMemHandle

friend class experimental::WorkingMemHandle
friend

Definition at line 738 of file INetwork.hpp.

◆ GetGraphForTesting

Graph& GetGraphForTesting ( IOptimizedNetwork optNetPtr)
friend

Definition at line 25 of file TestUtils.cpp.

26 {
27  return optNet->pOptimizedNetworkImpl->GetGraph();
28 }

◆ GetModelOptionsForTesting

ModelOptions& GetModelOptionsForTesting ( IOptimizedNetwork optNetPtr)
friend

Definition at line 30 of file TestUtils.cpp.

31 {
32  return optNet->pOptimizedNetworkImpl->GetModelOptions();
33 }

◆ LoadedNetwork

friend class LoadedNetwork
friend

Definition at line 735 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 1568 of file Network.cpp.

1573 {
1574  if (backendPreferences.empty())
1575  {
1576  throw InvalidArgumentException("Invoked Optimize with no backends specified");
1577  }
1578 
1579  if (options.m_ReduceFp32ToFp16 && options.m_ReduceFp32ToBf16)
1580  {
1581  throw InvalidArgumentException("BFloat16 and Float16 optimization cannot be enabled at the same time.");
1582  }
1583 
1584  std::unique_ptr<Graph> graph = std::make_unique<Graph>(inNetwork.pNetworkImpl->GetGraph());
1585 
1586  auto optNet = IOptimizedNetworkPtr(new IOptimizedNetwork(std::move(graph), options.m_ModelOptions),
1588 
1589  IOptimizedNetwork* optNetObjPtr = optNet.get();
1590 
1591  // Get the optimized graph
1592  Graph& optGraph = optNetObjPtr->pOptimizedNetworkImpl->GetGraph();
1593 
1594  // Perform AddBroadcastReshapeLayer optimisation
1595  using namespace optimizations;
1597 
1598  // Infer the tensor infos for all output slots. Throws an exception on failure
1599  optGraph.InferTensorInfos();
1600 
1601  // Perform optimisation passes
1607  MovePermuteUp(),
1608  MoveTransposeUp(),
1609  PermuteAsReshape(),
1620 
1621  // If Fp32 to Fp16 optimization is set convert Fp32 network to Fp16
1622  if (options.m_ReduceFp32ToFp16)
1623  {
1626  }
1627 
1628  // If Fp32 to Bf16 optimization is set convert Fp32 network to Bf16
1629  // Convert input of Convolution2d and FullyConnected from Fp32 to Bf16
1630  // Only Constant weight of Convolution2d and FullyConnected are converted from Fp32 to Bf16
1631  if (options.m_ReduceFp32ToBf16)
1632  {
1634  }
1635 
1636  // Initialize backend settings
1637  BackendSettings backendSettings(backendPreferences, deviceSpec);
1638  if (backendSettings.GetAvailablePreferredBackends().empty())
1639  {
1640  std::stringstream failureMsg;
1641  failureMsg << "None of the preferred backends " << backendPreferences
1642  << " are supported. Current platform provides " << backendSettings.m_SupportedBackends;
1643  ReportError(failureMsg.str(), messages);
1644  throw InvalidArgumentException(failureMsg.str());
1645  }
1646 
1647  // Create a map to temporarily hold initialized backend objects
1648  TensorHandleFactoryRegistry tensorHandleFactoryRegistry;
1649  BackendsMap backends = CreateSupportedBackends(tensorHandleFactoryRegistry, backendSettings);
1650 
1651  // Assign an available backend to each layer
1652  Graph::Iterator firstLayer = optGraph.begin();
1653  Graph::Iterator lastLayer = optGraph.end();
1654  OptimizationResult assignBackendsResult = AssignBackends(optNetObjPtr->pOptimizedNetworkImpl.get(),
1655  backendSettings,
1656  firstLayer,
1657  lastLayer,
1658  messages);
1659  if (assignBackendsResult.m_Error)
1660  {
1661  // Failed to assign a backend to each layer
1662  throw InvalidArgumentException("Failed to assign a backend to each layer");
1663  }
1664 
1667 
1668  // Apply the backend-specific optimizations
1669  OptimizationResult backendOptimizationResult = ApplyBackendOptimizations(optNetObjPtr->pOptimizedNetworkImpl.get(),
1670  backendSettings,
1671  backends,
1672  options.m_ModelOptions,
1673  messages);
1674  if (backendOptimizationResult.m_Error)
1675  {
1676  // Failed to apply the backend-specific optimizations
1677  throw InvalidArgumentException("Failed to apply the backend-specific optimizations");
1678  }
1679 
1680  // If the debug flag is set, then insert a DebugLayer after each layer
1681  // Doing this after applying the backend optimizations as they might have changed some layers
1682  if (options.m_Debug)
1683  {
1685  }
1686 
1687  // Calculate the compatibility strategies for tensor handles
1688  OptimizationResult strategyResult = SelectTensorHandleStrategy(optGraph,
1689  backends,
1690  tensorHandleFactoryRegistry,
1691  options.m_ImportEnabled,
1692  messages);
1693  if (strategyResult.m_Error)
1694  {
1695  // Failed to apply the backend-specific optimizations
1697  }
1698 
1699  // Based on the tensor handle strategy determined above, insert copy layers where required.
1700  optGraph.AddCompatibilityLayers(backends, tensorHandleFactoryRegistry);
1701 
1702  // Convert constants
1705 
1706  // Run backend specific optimizations (deprecated)
1707  for (auto&& chosenBackend : backendSettings.m_SelectedBackends)
1708  {
1709  auto factoryFun = BackendRegistryInstance().GetFactory(chosenBackend);
1710  auto backendPtr = factoryFun();
1711  ARMNN_ASSERT(backendPtr.get() != nullptr);
1712 
1714  auto backendSpecificOptimizations = backendPtr->GetOptimizations();
1716 
1717  if (!backendSpecificOptimizations.empty())
1718  {
1719  Optimizer::Pass(optNetObjPtr->pOptimizedNetworkImpl->GetGraph(), backendSpecificOptimizations);
1720  }
1721  }
1722 
1723  return optNet;
1724 }
OptimizeForConnection< Layer, PermuteLayer, SquashEqualSiblingsImpl< PermuteLayer > > SquashEqualPermuteSiblings
void ReportError(const std::string &errorMessage, Optional< std::vector< std::string > &> errorMessages)
Definition: Network.cpp:582
OptimizationResult AssignBackends(OptimizedNetworkImpl *optNetObjPtr, BackendSettings &backendSettings, Graph::Iterator &firstLayer, Graph::Iterator &lastLayer, Optional< std::vector< std::string > &> errMessages)
Definition: Network.cpp:888
FactoryFunction GetFactory(const BackendId &id) const
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
OptimizeForConnection< TransposeLayer, BatchToSpaceNdLayer, PermuteAndBatchToSpaceAsDepthToSpaceImpl< TransposeLayer > > TransposeAndBatchToSpaceAsDepthToSpace
OptimizeForExclusiveConnection< DepthwiseConvolution2dLayer, BatchNormalizationLayer, FuseBatchNorm< DepthwiseConvolution2dLayer, armnn::DataType::Float32 > > FuseBatchNormIntoDepthwiseConvolution2DFloat32
#define ARMNN_NO_DEPRECATE_WARN_BEGIN
Definition: Deprecated.hpp:33
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
BackendRegistry & BackendRegistryInstance()
OptimizeForConnection< Layer, ReshapeLayer, SquashEqualSiblingsImpl< ReshapeLayer > > SquashEqualReshapeSiblings
OptimizeForConnection< Layer, TransposeLayer, MoveTransposeUpImpl > MoveTransposeUp
LayerList::const_iterator Iterator
Definition: Graph.hpp:50
OptimizeForType< Layer, AddDebugImpl > InsertDebugLayer
Definition: AddDebug.hpp:34
OptimizeForConnection< ReshapeLayer, ReshapeLayer, OptimizeConsecutiveReshapesImpl > OptimizeConsecutiveReshapes
OptimizeForConnection< ConvertFp16ToFp32Layer, ConvertFp32ToFp16Layer, OptimizeInverseConversionsImpl > OptimizeInverseConversionsFp16
OptimizeForConnection< PermuteLayer, BatchToSpaceNdLayer, PermuteAndBatchToSpaceAsDepthToSpaceImpl< PermuteLayer > > PermuteAndBatchToSpaceAsDepthToSpace
OptimizeForConnection< Layer, PermuteLayer, MovePermuteUpImpl > MovePermuteUp
IOptimizedNetwork(std::unique_ptr< Graph > graph)
Definition: Network.cpp:540
ConvertConstants< Float32ToFloat16, IsFloat16Layer > ConvertConstantsFloatToHalf
OptimizeForType< TransposeLayer, TransposeAsReshapeImpl > TransposeAsReshape
#define ARMNN_NO_DEPRECATE_WARN_END
Definition: Deprecated.hpp:34
OptimizationResult ApplyBackendOptimizations(OptimizedNetworkImpl *optNetObjPtr, BackendSettings &backendSettings, BackendsMap &backends, const ModelOptions &modelOptions, Optional< std::vector< std::string > &> errMessages)
Definition: Network.cpp:1047
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
Definition: INetwork.hpp:174
#define ARMNN_ASSERT(COND)
Definition: Assert.hpp:14
OptimizeForType< PermuteLayer, PermuteAsReshapeImpl > PermuteAsReshape
OptimizeForConnection< Layer, TransposeLayer, SquashEqualSiblingsImpl< TransposeLayer > > SquashEqualTransposeSiblings
ConvertConstants< Float16ToFloat32, IsFloat32Layer > ConvertConstantsHalfToFloat
BackendsMap CreateSupportedBackends(TensorHandleFactoryRegistry &handleFactoryRegistry, BackendSettings &backendSettings)
Definition: Network.cpp:1028
OptimizeForConnection< ConvertFp32ToFp16Layer, ConvertFp16ToFp32Layer, OptimizeInverseConversionsImpl > OptimizeInverseConversionsFp32
OptimizeForExclusiveConnection< PadLayer, Pooling2dLayer, pad_fold::FoldPadIntoPooling2dImpl > FoldPadIntoPooling2d
OptimizeForType< Layer, ConvertFp32NetworkToFp16Impl > Fp32NetworkToFp16Converter
OptimizationResult SelectTensorHandleStrategy(Graph &optGraph, BackendsMap &backends, TensorHandleFactoryRegistry &registry, bool importEnabled, Optional< std::vector< std::string > &> errMessages)
Definition: Network.cpp:1500
OptimizeForType< Layer, AddBroadcastReshapeLayerImpl > AddBroadcastReshapeLayer
static void Destroy(IOptimizedNetwork *network)
Definition: Network.cpp:551
OptimizeForType< Layer, ConvertFp32NetworkToBf16Impl > Fp32NetworkToBf16Converter
std::map< BackendId, std::unique_ptr< class IBackendInternal > > BackendsMap
Definition: Network.hpp:317

Member Data Documentation

◆ pOptimizedNetworkImpl


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