ArmNN
 21.08
IOptimizedNetwork Class Reference

#include <INetwork.hpp>

Public Member Functions

Status PrintGraph ()
 
Status SerializeToDot (std::ostream &stream) const
 
profiling::ProfilingGuid GetGuid () const
 
 IOptimizedNetwork (const IOptimizedNetwork &other, const ModelOptions &modelOptions)
 
 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 737 of file INetwork.hpp.

Constructor & Destructor Documentation

◆ IOptimizedNetwork() [1/4]

IOptimizedNetwork ( const IOptimizedNetwork other,
const ModelOptions modelOptions 
)

Definition at line 540 of file Network.cpp.

Referenced by armnn::Optimize().

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

◆ IOptimizedNetwork() [2/4]

IOptimizedNetwork ( std::unique_ptr< Graph graph)

Definition at line 543 of file Network.cpp.

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

◆ IOptimizedNetwork() [3/4]

IOptimizedNetwork ( std::unique_ptr< OptimizedNetworkImpl impl)

Definition at line 546 of file Network.cpp.

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

◆ ~IOptimizedNetwork()

◆ IOptimizedNetwork() [4/4]

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

Definition at line 549 of file Network.cpp.

References IOptimizedNetwork::~IOptimizedNetwork().

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

Member Function Documentation

◆ Destroy()

void Destroy ( IOptimizedNetwork network)
static

Definition at line 554 of file Network.cpp.

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

555 {
556  delete network;
557 }

◆ GetGuid()

profiling::ProfilingGuid GetGuid ( ) const

Definition at line 569 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

570 {
571  return pOptimizedNetworkImpl->GetGuid();
572 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:770

◆ PrintGraph()

Status PrintGraph ( )

Definition at line 559 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

560 {
561  return pOptimizedNetworkImpl->PrintGraph();
562 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:770

◆ SerializeToDot()

Status SerializeToDot ( std::ostream &  stream) const

Definition at line 564 of file Network.cpp.

References IOptimizedNetwork::pOptimizedNetworkImpl.

565 {
566  return pOptimizedNetworkImpl->SerializeToDot(stream);
567 }
std::unique_ptr< OptimizedNetworkImpl > pOptimizedNetworkImpl
Definition: INetwork.hpp:770

Friends And Related Function Documentation

◆ experimental::AsyncNetworkImpl

friend class experimental::AsyncNetworkImpl
friend

Definition at line 757 of file INetwork.hpp.

◆ experimental::WorkingMemHandle

friend class experimental::WorkingMemHandle
friend

Definition at line 758 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 755 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 1613 of file Network.cpp.

1618 {
1619  if (backendPreferences.empty())
1620  {
1621  throw InvalidArgumentException("Invoked Optimize with no backends specified");
1622  }
1623 
1624  if (options.m_ReduceFp32ToFp16 && options.m_ReduceFp32ToBf16)
1625  {
1626  throw InvalidArgumentException("BFloat16 and Float16 optimization cannot be enabled at the same time.");
1627  }
1628 
1629  std::unique_ptr<Graph> graph = std::make_unique<Graph>(inNetwork.pNetworkImpl->GetGraph());
1630 
1631  auto optNet = IOptimizedNetworkPtr(new IOptimizedNetwork(std::move(graph), options.m_ModelOptions),
1633 
1634  IOptimizedNetwork* optNetObjPtr = optNet.get();
1635 
1636  // Get the optimized graph
1637  Graph& optGraph = optNetObjPtr->pOptimizedNetworkImpl->GetGraph();
1638 
1639  if(options.m_shapeInferenceMethod == ShapeInferenceMethod::InferAndValidate)
1640  {
1641  // Infer the tensor infos for all output slots. Throws an exception on failure
1642  optGraph.InferTensorInfos();
1643  }
1644 
1645  // Perform AddBroadcastReshapeLayer optimisation
1646  using namespace optimizations;
1648 
1649  if(options.m_shapeInferenceMethod == ShapeInferenceMethod::ValidateOnly)
1650  {
1651  // Validate the tensor infos for all output slots. Throws an exception on failure
1652  optGraph.InferTensorInfos();
1653  }
1654 
1655  // Perform optimisation passes
1661  MovePermuteUp(),
1662  MoveTransposeUp(),
1663  PermuteAsReshape(),
1676 
1677  // If Fp32 to Fp16 optimization is set convert Fp32 network to Fp16
1678  if (options.m_ReduceFp32ToFp16)
1679  {
1682  }
1683 
1684  // If Fp32 to Bf16 optimization is set convert Fp32 network to Bf16
1685  // Convert input of Convolution2d and FullyConnected from Fp32 to Bf16
1686  // Only Constant weight of Convolution2d and FullyConnected are converted from Fp32 to Bf16
1687  if (options.m_ReduceFp32ToBf16)
1688  {
1690  }
1691 
1692  // Initialize backend settings
1693  BackendSettings backendSettings(backendPreferences, deviceSpec);
1694  if (backendSettings.GetAvailablePreferredBackends().empty())
1695  {
1696  std::stringstream failureMsg;
1697  failureMsg << "None of the preferred backends " << backendPreferences
1698  << " are supported. Current platform provides " << backendSettings.m_SupportedBackends;
1699  ReportError(failureMsg.str(), messages);
1700  throw InvalidArgumentException(failureMsg.str());
1701  }
1702 
1703  // Create a map to temporarily hold initialized backend objects
1704  TensorHandleFactoryRegistry tensorHandleFactoryRegistry;
1705  BackendsMap backends = CreateSupportedBackends(tensorHandleFactoryRegistry, backendSettings);
1706 
1707  // Assign an available backend to each layer
1708  Graph::Iterator firstLayer = optGraph.begin();
1709  Graph::Iterator lastLayer = optGraph.end();
1710  OptimizationResult assignBackendsResult = AssignBackends(optNetObjPtr->pOptimizedNetworkImpl.get(),
1711  backendSettings,
1712  firstLayer,
1713  lastLayer,
1714  messages);
1715  if (assignBackendsResult.m_Error)
1716  {
1717  // Failed to assign a backend to each layer
1718  throw InvalidArgumentException("Failed to assign a backend to each layer");
1719  }
1720 
1723 
1724  // Apply the backend-specific optimizations
1725  OptimizationResult backendOptimizationResult = ApplyBackendOptimizations(optNetObjPtr->pOptimizedNetworkImpl.get(),
1726  backendSettings,
1727  backends,
1728  options.m_ModelOptions,
1729  messages);
1730  if (backendOptimizationResult.m_Error)
1731  {
1732  // Failed to apply the backend-specific optimizations
1733  throw InvalidArgumentException("Failed to apply the backend-specific optimizations");
1734  }
1735 
1736  // If the debug flag is set, then insert a DebugLayer after each layer
1737  // Doing this after applying the backend optimizations as they might have changed some layers
1738  if (options.m_Debug)
1739  {
1741  }
1742 
1743  // Calculate the compatibility strategies for tensor handles
1744  OptimizationResult strategyResult = SelectTensorHandleStrategy(optGraph,
1745  backends,
1746  tensorHandleFactoryRegistry,
1747  options.m_ImportEnabled,
1748  messages);
1749  if (strategyResult.m_Error)
1750  {
1751  // Failed to apply the backend-specific optimizations
1753  }
1754 
1755  // Based on the tensor handle strategy determined above, insert copy layers where required.
1756  optGraph.AddCompatibilityLayers(backends, tensorHandleFactoryRegistry);
1757 
1758  // Convert constants
1761 
1762  // Run backend specific optimizations (deprecated)
1763  for (auto&& chosenBackend : backendSettings.m_SelectedBackends)
1764  {
1765  auto factoryFun = BackendRegistryInstance().GetFactory(chosenBackend);
1766  auto backendPtr = factoryFun();
1767  ARMNN_ASSERT(backendPtr.get() != nullptr);
1768 
1770  auto backendSpecificOptimizations = backendPtr->GetOptimizations();
1772 
1773  if (!backendSpecificOptimizations.empty())
1774  {
1775  Optimizer::Pass(optNetObjPtr->pOptimizedNetworkImpl->GetGraph(), backendSpecificOptimizations);
1776  }
1777  }
1778 
1779  return optNet;
1780 }
OptimizeForConnection< Layer, PermuteLayer, SquashEqualSiblingsImpl< PermuteLayer > > SquashEqualPermuteSiblings
void ReportError(const std::string &errorMessage, Optional< std::vector< std::string > &> errorMessages)
Definition: Network.cpp:585
OptimizationResult AssignBackends(OptimizedNetworkImpl *optNetObjPtr, BackendSettings &backendSettings, Graph::Iterator &firstLayer, Graph::Iterator &lastLayer, Optional< std::vector< std::string > &> errMessages)
Definition: Network.cpp:933
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
OptimizeForExclusiveConnection< PadLayer, DepthwiseConvolution2dLayer, pad_fold::FoldPadIntoDepthwiseConvolution2dImpl > FoldPadIntoDepthwiseConvolution2d
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
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:1092
Validate all output shapes.
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
Definition: INetwork.hpp:173
#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:1073
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:1545
IOptimizedNetwork(const IOptimizedNetwork &other, const ModelOptions &modelOptions)
Definition: Network.cpp:540
OptimizeForType< Layer, AddBroadcastReshapeLayerImpl > AddBroadcastReshapeLayer
static void Destroy(IOptimizedNetwork *network)
Definition: Network.cpp:554
OptimizeForType< Layer, ConvertFp32NetworkToBf16Impl > Fp32NetworkToBf16Converter
std::map< BackendId, std::unique_ptr< class IBackendInternal > > BackendsMap
Definition: Network.hpp:313
OptimizeForType< FullyConnectedLayer, RedirectMembersToConstantInputsImpl > RedirectMembersToConstantInputs

Member Data Documentation

◆ pOptimizedNetworkImpl


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