ArmNN
 20.11
IRuntime.hpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6 
7 #include "BackendOptions.hpp"
8 #include "INetwork.hpp"
9 #include "IProfiler.hpp"
10 #include "Tensor.hpp"
11 #include "Types.hpp"
12 #include "TypesUtils.hpp"
14 
15 #include <memory>
16 
17 namespace armnn
18 {
19 
20 using NetworkId = int;
21 
23 
24 class IRuntime;
25 using IRuntimePtr = std::unique_ptr<IRuntime, void(*)(IRuntime* runtime)>;
26 
28 {
29  INetworkProperties(bool importEnabled = false, bool exportEnabled = false)
30  : m_ImportEnabled(importEnabled),
31  m_ExportEnabled(exportEnabled) {}
32 
33  const bool m_ImportEnabled;
34  const bool m_ExportEnabled;
35 
36  virtual ~INetworkProperties() {}
37 };
38 
39 class IRuntime
40 {
41 public:
43  {
45  : m_GpuAccTunedParameters(nullptr)
46  , m_EnableGpuProfiling(false)
47  , m_DynamicBackendsPath("")
48  {}
49 
50  /// If set, uses the GpuAcc tuned parameters from the given object when executing GPU workloads.
51  /// It will also be updated with new tuned parameters if it is configured to do so.
52  std::shared_ptr<IGpuAccTunedParameters> m_GpuAccTunedParameters;
53 
54  /// Setting this flag will allow the user to obtain GPU profiling information from the runtime.
56 
57  /// Setting this value will override the paths set by the DYNAMIC_BACKEND_PATHS compiler directive
58  /// Only a single path is allowed for the override
59  std::string m_DynamicBackendsPath;
60 
62  {
64  : m_EnableProfiling(false)
65  , m_TimelineEnabled(false)
66  , m_OutgoingCaptureFile("")
67  , m_IncomingCaptureFile("")
68  , m_FileOnly(false)
69  , m_CapturePeriod(LOWEST_CAPTURE_PERIOD)
70  , m_FileFormat("binary")
71  , m_LocalPacketHandlers()
72  {}
73 
76  std::string m_OutgoingCaptureFile;
77  std::string m_IncomingCaptureFile;
78  bool m_FileOnly;
79  uint32_t m_CapturePeriod;
80  std::string m_FileFormat;
81  std::vector<armnn::profiling::ILocalPacketHandlerSharedPtr> m_LocalPacketHandlers;
82  };
84 
85  /// Pass backend specific options.
86  ///
87  /// For example, to enable GpuAcc tuning add the following
88  /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.cpp
89  /// m_BackendOption.emplace_back(
90  /// BackendOptions{"GpuAcc",
91  /// {
92  /// {"TuningLevel", 2},
93  /// {"TuningFile", filename}
94  /// }
95  /// });
96  /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
97  /// Execute representative workloads through the runtime to generate tuning data.
98  /// The tuning file is written once the runtime is destroyed
99 
100  /// To execute with the tuning data, start up with just the tuning file specified.
101  /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.cpp
102  /// m_BackendOption.emplace_back(
103  /// BackendOptions{"GpuAcc",
104  /// {
105  /// {"TuningFile", filename}
106  /// }
107  /// });
108  /// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
109 
110  /// The following backend options are available:
111  /// GpuAcc:
112  /// "TuningLevel" : int [0..3] (0=UseOnly(default) | 1=RapidTuning | 2=NormalTuning | 3=ExhaustiveTuning)
113  /// "TuningFile" : string [filenameString]
114  /// "KernelProfilingEnabled" : bool [true | false]
115  std::vector<BackendOptions> m_BackendOptions;
116  };
117 
118  static IRuntime* CreateRaw(const CreationOptions& options);
119  static IRuntimePtr Create(const CreationOptions& options);
120  static void Destroy(IRuntime* runtime);
121 
122  /// Loads a complete network into the IRuntime.
123  /// @param [out] networkIdOut - Unique identifier for the network is returned in this reference.
124  /// @param [in] network - Complete network to load into the IRuntime.
125  /// The runtime takes ownership of the network once passed in.
126  /// @return armnn::Status
127  virtual Status LoadNetwork(NetworkId& networkIdOut, IOptimizedNetworkPtr network) = 0;
128 
129  /// Load a complete network into the IRuntime.
130  /// @param [out] networkIdOut Unique identifier for the network is returned in this reference.
131  /// @param [in] network Complete network to load into the IRuntime.
132  /// @param [out] errorMessage Error message if there were any errors.
133  /// The runtime takes ownership of the network once passed in.
134  /// @return armnn::Status
135  virtual Status LoadNetwork(NetworkId& networkIdOut,
136  IOptimizedNetworkPtr network,
137  std::string& errorMessage) = 0;
138 
139  virtual Status LoadNetwork(NetworkId& networkIdOut,
140  IOptimizedNetworkPtr network,
141  std::string& errorMessage,
142  const INetworkProperties& networkProperties) = 0;
143 
144  virtual TensorInfo GetInputTensorInfo(NetworkId networkId, LayerBindingId layerId) const = 0;
145  virtual TensorInfo GetOutputTensorInfo(NetworkId networkId, LayerBindingId layerId) const = 0;
146 
147  /// Evaluates a network using input in inputTensors and outputs filled into outputTensors
148  virtual Status EnqueueWorkload(NetworkId networkId,
149  const InputTensors& inputTensors,
150  const OutputTensors& outputTensors) = 0;
151 
152  /// Unloads a network from the IRuntime.
153  /// At the moment this only removes the network from the m_Impl->m_Network.
154  /// This might need more work in the future to be AndroidNN compliant.
155  /// @param [in] networkId - Unique identifier for the network to be unloaded. Generated in LoadNetwork().
156  /// @return armnn::Status
157  virtual Status UnloadNetwork(NetworkId networkId) = 0;
158 
159  virtual const IDeviceSpec& GetDeviceSpec() const = 0;
160 
161  /// Gets the profiler corresponding to the given network id.
162  /// @param networkId The id of the network for which to get the profile.
163  /// @return A pointer to the requested profiler, or nullptr if not found.
164  virtual const std::shared_ptr<IProfiler> GetProfiler(NetworkId networkId) const = 0;
165 
166  /// Registers a callback function to debug layers performing custom computations on intermediate tensors.
167  /// @param networkId The id of the network to register the callback.
168  /// @param func callback function to pass to the debug layer.
169  virtual void RegisterDebugCallback(NetworkId networkId, const DebugCallbackFunction& func) = 0;
170 
171 protected:
173 };
174 
175 
176 /// The following API is replaced by the backend options API.
177 using IGpuAccTunedParametersPtr = std::shared_ptr<IGpuAccTunedParameters>;
178 
179 /// Manages a set of GpuAcc parameters which have been tuned for maximum performance.
180 /// Passes an instance of this object to the IRuntime::Create() method (via IRuntime::CreationOptions) to use it
181 /// for all GPU workload execution.
182 ///
183 /// Can be created in two modes:
184 /// - In UseTunedParameters mode, the parameters stored in this object are used to execute GPU workloads.
185 /// - In UpdateTunedParameters mode, additionally, whenever a GPU workload is executed for the first time, the
186 /// optimum parameters will be found and stored in this object. WARNING - This tuning can be slow.
187 ///
188 /// The parameters can be loaded from and saved to a file so that you can first run a slow initial read-write
189 /// execution, save the parameters for later and then run fast read-only executions using the optimised parameters.
191 {
192 public:
193  enum class Mode
194  {
195  UseTunedParameters,
196  UpdateTunedParameters
197  };
198 
199  enum class TuningLevel
200  {
201  Rapid = 0,
202  Normal = 1,
203  Exhaustive = 2
204  };
205 
206  /// Creates an IClTunedParameters with the given mode.
207  /// @{
208  static IGpuAccTunedParameters* CreateRaw(Mode mode, TuningLevel tunerMode);
209  static IGpuAccTunedParametersPtr Create(Mode mode, TuningLevel tunerMode);
210  /// @}
211  static void Destroy(IGpuAccTunedParameters* params);
212 
213  /// Loads an existing set of tuned parameters from the given file.
214  /// If there is an error loading the file, an armnn::Exception is thrown.
215  virtual void Load(const char* filename) = 0;
216 
217  /// Saves the current set of tuned parameters to the given file.
218  /// If there is an error saving to the file, an armnn::Exception is thrown.
219  virtual void Save(const char* filename) const = 0;
220 
221 protected:
223 };
224 
225 } // namespace armnn
const bool m_ImportEnabled
Definition: IRuntime.hpp:33
DataLayout::NCHW false
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
Definition: IRuntime.hpp:25
std::vector< std::pair< LayerBindingId, class ConstTensor > > InputTensors
Definition: Tensor.hpp:340
int NetworkId
Definition: IRuntime.hpp:20
Copyright (c) 2020 ARM Limited.
std::function< void(LayerGuid guid, unsigned int slotIndex, ITensorHandle *tensorHandle)> DebugCallbackFunction
Define the type of callback for the Debug layer to call.
Definition: Types.hpp:275
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
Definition: Types.hpp:202
std::shared_ptr< IGpuAccTunedParameters > m_GpuAccTunedParameters
If set, uses the GpuAcc tuned parameters from the given object when executing GPU workloads...
Definition: IRuntime.hpp:52
std::vector< BackendOptions > m_BackendOptions
Pass backend specific options.
Definition: IRuntime.hpp:115
std::vector< armnn::profiling::ILocalPacketHandlerSharedPtr > m_LocalPacketHandlers
Definition: IRuntime.hpp:81
std::vector< std::pair< LayerBindingId, class Tensor > > OutputTensors
Definition: Tensor.hpp:341
Status
enumeration
Definition: Types.hpp:26
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
Definition: INetwork.hpp:600
const bool m_ExportEnabled
Definition: IRuntime.hpp:34
Device specific knowledge to be passed to the optimizer.
Definition: Types.hpp:192
constexpr unsigned int LOWEST_CAPTURE_PERIOD
The lowest performance data capture interval we support is 10 miliseconds.
Definition: Types.hpp:21
std::shared_ptr< IGpuAccTunedParameters > IGpuAccTunedParametersPtr
The following API is replaced by the backend options API.
Definition: IRuntime.hpp:177
INetworkProperties(bool importEnabled=false, bool exportEnabled=false)
Definition: IRuntime.hpp:29
std::string m_DynamicBackendsPath
Setting this value will override the paths set by the DYNAMIC_BACKEND_PATHS compiler directive Only a...
Definition: IRuntime.hpp:59
bool m_EnableGpuProfiling
Setting this flag will allow the user to obtain GPU profiling information from the runtime...
Definition: IRuntime.hpp:55
Manages a set of GpuAcc parameters which have been tuned for maximum performance. ...
Definition: IRuntime.hpp:190
ExternalProfilingOptions m_ProfilingOptions
Definition: IRuntime.hpp:83
TensorInfo GetInputTensorInfo(const Network *network)
virtual ~INetworkProperties()
Definition: IRuntime.hpp:36