Create an optimized version of the network.
1662 auto profiler = inGraph.GetProfiler();
1664 profiler->EnableProfiling(options.m_ProfilingEnabled);
1667 if (backendPreferences.empty())
1669 throw InvalidArgumentException(
"Invoked Optimize with no backends specified");
1672 if (options.m_ReduceFp32ToFp16 && options.m_ReduceFp32ToBf16)
1674 throw InvalidArgumentException(
"BFloat16 and Float16 optimization cannot be enabled at the same time.");
1678 inGraph.VerifyConstantLayerSetTensorInfo();
1680 std::unique_ptr<Graph> graph = std::make_unique<Graph>(inGraph);
1685 {{
"ImportEnabled", options.m_ImportEnabled},
1686 {
"ExportEnabled", options.m_ExportEnabled}});
1688 optimizedOptions.push_back(importExport);
1696 Graph& optGraph = optNetObjPtr->pOptimizedNetworkImpl->GetGraph();
1701 optGraph.InferTensorInfos();
1705 using namespace optimizations;
1711 optGraph.InferTensorInfos();
1741 if (options.m_ReduceFp32ToFp16)
1752 if (options.m_ReduceFp32ToBf16)
1760 BackendSettings backendSettings(backendPreferences, deviceSpec);
1761 if (backendSettings.GetAvailablePreferredBackends().empty())
1763 std::stringstream failureMsg;
1764 failureMsg <<
"None of the preferred backends " << backendPreferences
1765 <<
" are supported. Current platform provides " << backendSettings.m_SupportedBackends;
1767 throw InvalidArgumentException(failureMsg.str());
1771 TensorHandleFactoryRegistry tensorHandleFactoryRegistry;
1777 OptimizationResult assignBackendsResult =
AssignBackends(optNetObjPtr->pOptimizedNetworkImpl.get(),
1782 if (assignBackendsResult.m_Error)
1785 throw InvalidArgumentException(
"Failed to assign a backend to each layer");
1795 options.m_ModelOptions,
1797 if (backendOptimizationResult.m_Error)
1800 throw InvalidArgumentException(
"Failed to apply the backend-specific optimizations");
1816 if (options.m_Debug && !options.m_DebugToFile)
1820 else if (options.m_DebugToFile)
1830 tensorHandleFactoryRegistry,
1831 options.m_ImportEnabled,
1832 options.m_ExportEnabled,
1835 if (strategyResult.m_Error)
1844 optGraph.AddCompatibilityLayers(backends, tensorHandleFactoryRegistry);
OptimizeForConnection< Layer, PermuteLayer, SquashEqualSiblingsImpl< PermuteLayer > > SquashEqualPermuteSiblings
void ReportError(const std::string &errorMessage, Optional< std::vector< std::string > &> errorMessages)
OptimizationResult AssignBackends(OptimizedNetworkImpl *optNetObjPtr, BackendSettings &backendSettings, Graph::Iterator &firstLayer, Graph::Iterator &lastLayer, Optional< std::vector< std::string > &> errMessages)
OptimizeForConnection< PermuteLayer, PermuteLayer, OptimizeInversePermutesImpl< PermuteLayer > > OptimizeInversePermutes
OptimizeForExclusiveConnection< PadLayer, Convolution2dLayer, pad_fold::FoldPadIntoConvolution2dImpl > FoldPadIntoConvolution2d
Optimizer::Optimizations MakeOptimizations(Args &&... args)
OptimizeForConnection< TransposeLayer, TransposeLayer, OptimizeInversePermutesImpl< TransposeLayer > > OptimizeInverseTransposes
OptimizeForExclusiveConnection< PadLayer, DepthwiseConvolution2dLayer, pad_fold::FoldPadIntoDepthwiseConvolution2dImpl > FoldPadIntoDepthwiseConvolution2d
static ProfilerManager & GetInstance()
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)
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)
OptimizeForConnection< Layer, ReshapeLayer, SquashEqualSiblingsImpl< ReshapeLayer > > SquashEqualReshapeSiblings
OptimizeForConnection< Layer, TransposeLayer, MoveTransposeUpImpl > MoveTransposeUp
LayerList::const_iterator Iterator
OptimizeForType< Layer, AddDebugImpl > InsertDebugLayer
OptimizeForConnection< ReshapeLayer, ReshapeLayer, OptimizeConsecutiveReshapesImpl > OptimizeConsecutiveReshapes
#define ARMNN_SCOPED_PROFILING_EVENT(backendId, name)
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)
std::string CreateDirectory(std::string sPath)
Returns full path to temporary folder.
OptimizationResult SelectTensorHandleStrategy(Graph &optGraph, BackendsMap &backends, TensorHandleFactoryRegistry ®istry, bool importEnabled, bool exportEnabled, Optional< std::vector< std::string > &> errMessages)
Validate all output shapes.
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
OptimizeForType< PermuteLayer, PermuteAsReshapeImpl > PermuteAsReshape
OptimizeForConnection< Layer, TransposeLayer, SquashEqualSiblingsImpl< TransposeLayer > > SquashEqualTransposeSiblings
Struct for the users to pass backend specific options.
void RegisterProfiler(IProfiler *profiler)
ConvertConstants< Float16ToFloat32, IsFloat32Layer > ConvertConstantsHalfToFloat
BackendsMap CreateSupportedBackends(TensorHandleFactoryRegistry &handleFactoryRegistry, BackendSettings &backendSettings)
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)
OptimizeForType< Layer, AddBroadcastReshapeLayerImpl > AddBroadcastReshapeLayer
OptimizeForConnection< ConstantLayer, DequantizeLayer, ConvertConstDequantisationLayersToConstLayersImpl > ConvertConstDequantisationLayersToConstLayers
static void Destroy(IOptimizedNetwork *network)
OptimizeForType< Layer, ConvertFp32NetworkToBf16Impl > Fp32NetworkToBf16Converter
OptimizeForConnection< ConstantLayer, ConvertFp32ToBf16Layer, FuseConvertFp32ToBf16IntoConstLayers > FuseConversionLayersIntoConstLayers
OptimizeForType< Layer, AddDebugToFileImpl > InsertDebugToFileLayer
std::map< BackendId, std::unique_ptr< class IBackendInternal > > BackendsMap