From f1e0ad38f1bc064e78e795f57db23901cf13f4ce Mon Sep 17 00:00:00 2001 From: Derek Lamberti Date: Wed, 13 Oct 2021 18:02:25 +0100 Subject: Profiling instrumentation throughout the Optimizer Signed-off-by: Derek Lamberti Change-Id: Ifcdafc12ca09455af2389bf84e34b6b87bbb0b15 --- include/armnn/INetwork.hpp | 6 ++++++ src/armnn/Network.cpp | 26 +++++++++++++++++++++----- src/armnn/Optimizer.cpp | 1 + 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/include/armnn/INetwork.hpp b/include/armnn/INetwork.hpp index a8e6cfc0e3..5027818623 100644 --- a/include/armnn/INetwork.hpp +++ b/include/armnn/INetwork.hpp @@ -124,6 +124,7 @@ struct OptimizerOptions , m_shapeInferenceMethod(armnn::ShapeInferenceMethod::ValidateOnly) , m_ImportEnabled(false) , m_ModelOptions() + , m_ProfilingEnabled(false) {} OptimizerOptions(bool reduceFp32ToFp16, bool debug, bool reduceFp32ToBf16, bool importEnabled, @@ -134,6 +135,7 @@ struct OptimizerOptions , m_shapeInferenceMethod(armnn::ShapeInferenceMethod::ValidateOnly) , m_ImportEnabled(importEnabled) , m_ModelOptions(modelOptions) + , m_ProfilingEnabled(false) { if (m_ReduceFp32ToFp16 && m_ReduceFp32ToBf16) { @@ -150,6 +152,7 @@ struct OptimizerOptions , m_shapeInferenceMethod(shapeInferenceMethod) , m_ImportEnabled(importEnabled) , m_ModelOptions(modelOptions) + , m_ProfilingEnabled(false) { if (m_ReduceFp32ToFp16 && m_ReduceFp32ToBf16) { @@ -174,6 +177,9 @@ struct OptimizerOptions // Enable Model Options ModelOptions m_ModelOptions; + + // Enable profiling dump of the optimizer phase + bool m_ProfilingEnabled; }; class IWorkloadFactory; diff --git a/src/armnn/Network.cpp b/src/armnn/Network.cpp index 39af10f2ac..4298b05528 100644 --- a/src/armnn/Network.cpp +++ b/src/armnn/Network.cpp @@ -886,6 +886,7 @@ OptimizationResult AssignBackends(OptimizedNetworkImpl* optNetObjPtr, Graph::Iterator& lastLayer, Optional&> errMessages) { + ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_AssignBackends"); OptimizationResult result; // Helper lambda to compose meaningful error message before returning with error @@ -1046,7 +1047,7 @@ OptimizationResult ApplyBackendOptimizations(OptimizedNetworkImpl* optNetObjPtr, Optional&> errMessages) { ARMNN_ASSERT(optNetObjPtr); - + ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ApplyBackendOptimizations") OptimizationResult result; // Get the optimized graph @@ -1078,6 +1079,7 @@ OptimizationResult ApplyBackendOptimizations(OptimizedNetworkImpl* optNetObjPtr, for (auto& subgraph : subgraphs) { // Try to optimize the current sub-graph + ARMNN_SCOPED_PROFILING_EVENT(backendObjPtr->GetId(), "Optimizer_OptimizeSubgraph"); OptimizationViews optimizationViews = backendObjPtr->OptimizeSubgraphView(*subgraph, modelOptions); ARMNN_ASSERT(optimizationViews.Validate(*subgraph)); @@ -1498,6 +1500,7 @@ OptimizationResult SelectTensorHandleStrategy(Graph& optGraph, bool importEnabled, Optional&> errMessages) { + ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_SelectTensorHandleStrategy"); OptimizationResult result; optGraph.ForEachLayer([&backends, ®istry, &result, &errMessages, importEnabled](Layer* layer) @@ -1566,6 +1569,12 @@ IOptimizedNetworkPtr Optimize(const INetwork& inNetwork, const OptimizerOptions& options, Optional&> messages) { + // Enable profiling + auto profiler = inNetwork.pNetworkImpl->GetGraph().GetProfiler(); + ProfilerManager::GetInstance().RegisterProfiler(profiler.get()); + profiler->EnableProfiling(options.m_ProfilingEnabled); + + ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer"); if (backendPreferences.empty()) { throw InvalidArgumentException("Invoked Optimize with no backends specified"); @@ -1630,6 +1639,7 @@ IOptimizedNetworkPtr Optimize(const INetwork& inNetwork, // If Fp32 to Fp16 optimization is set convert Fp32 network to Fp16 if (options.m_ReduceFp32ToFp16) { + ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ReduceFp32ToFp16"); Optimizer::Pass(optGraph, MakeOptimizations(Fp32NetworkToFp16Converter())); Optimizer::Pass(optGraph, MakeOptimizations(ConvertConstantsFloatToHalf())); } @@ -1639,6 +1649,7 @@ IOptimizedNetworkPtr Optimize(const INetwork& inNetwork, // Only Constant weight of Convolution2d and FullyConnected are converted from Fp32 to Bf16 if (options.m_ReduceFp32ToBf16) { + ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ReduceFp32ToBf16"); Optimizer::Pass(optGraph, MakeOptimizations(Fp32NetworkToBf16Converter())); } @@ -1706,12 +1717,17 @@ IOptimizedNetworkPtr Optimize(const INetwork& inNetwork, } // Based on the tensor handle strategy determined above, insert copy layers where required. - optGraph.AddCompatibilityLayers(backends, tensorHandleFactoryRegistry); + { + ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_AddCompatibilityLayers"); + optGraph.AddCompatibilityLayers(backends, tensorHandleFactoryRegistry); + } // Convert constants - Optimizer::Pass(optGraph, MakeOptimizations(ConvertConstantsFloatToHalf())); - Optimizer::Pass(optGraph, MakeOptimizations(ConvertConstantsHalfToFloat())); - + { + ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ConvertConstants"); + Optimizer::Pass(optGraph, MakeOptimizations(ConvertConstantsFloatToHalf())); + Optimizer::Pass(optGraph, MakeOptimizations(ConvertConstantsHalfToFloat())); + } return optNet; } bool NetworkImpl::GetShapeInferenceMethod() diff --git a/src/armnn/Optimizer.cpp b/src/armnn/Optimizer.cpp index 9c7e51614e..1d6a52efed 100644 --- a/src/armnn/Optimizer.cpp +++ b/src/armnn/Optimizer.cpp @@ -15,6 +15,7 @@ Optimizer::Optimizer() void Optimizer::Pass(Graph& graph, const Optimizations& optimizations) { + ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_Pass"); // Create observables to observe changes to the graph AddedLayerObservable addedLayerObservable(graph); ErasedLayerNamesObservable erasedLayerNamesObservable(graph); -- cgit v1.2.1