1 // 2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 #pragma once 6 7 #include <armnn/DescriptorsFwd.hpp> 8 #include <armnn/LstmParams.hpp> 9 #include <armnn/QuantizedLstmParams.hpp> 10 #include <armnn/TensorFwd.hpp> 11 #include <armnn/Types.hpp> 12 13 #include <armnn/INetwork.hpp> 14 15 #include <string> 16 #include <vector> 17 #include <map> 18 #include <memory> 19 20 #include "Graph.hpp" 21 #include "Layer.hpp" 22 23 namespace armnn 24 { 25 class Graph; 26 27 /// Private implementation of INetwork. 28 class Network final : public INetwork 29 { 30 public: 31 Network(NetworkOptions networkOptions = {}); 32 ~Network(); 33 GetGraph() const34 const Graph& GetGraph() const { return *m_Graph; } 35 36 Status PrintGraph() override; 37 38 IConnectableLayer* AddInputLayer(LayerBindingId id, const char* name=nullptr) override; 39 40 IConnectableLayer* AddArgMinMaxLayer(const ArgMinMaxDescriptor& desc, 41 const char* name = nullptr) override; 42 43 IConnectableLayer* AddBatchToSpaceNdLayer(const BatchToSpaceNdDescriptor& batchToSpaceNdDescriptor, 44 const char* name = nullptr) override; 45 46 IConnectableLayer* AddComparisonLayer(const ComparisonDescriptor& comparisonDescriptor, 47 const char* name = nullptr) override; 48 49 IConnectableLayer* AddConcatLayer(const ConcatDescriptor& concatDescriptor, 50 const char* name = nullptr) override; 51 52 IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor, 53 const ConstTensor& weights, 54 const Optional<ConstTensor>& biases, 55 const char* name = nullptr) override; 56 57 ARMNN_DEPRECATED_MSG("This AddConvolution2dLayer overload is deprecated") 58 IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor, 59 const ConstTensor& weights, 60 const char* name = nullptr) override; 61 62 ARMNN_DEPRECATED_MSG("This AddConvolution2dLayer overload is deprecated") 63 IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor, 64 const ConstTensor& weights, 65 const ConstTensor& biases, 66 const char* name = nullptr) override; 67 68 IConnectableLayer* AddDepthToSpaceLayer(const DepthToSpaceDescriptor& depthToSpaceDescriptor, 69 const char* name = nullptr) override; 70 71 IConnectableLayer* AddDepthwiseConvolution2dLayer( 72 const DepthwiseConvolution2dDescriptor& convolution2dDescriptor, 73 const ConstTensor& weights, 74 const Optional<ConstTensor>& biases, 75 const char* name = nullptr) override; 76 77 ARMNN_DEPRECATED_MSG("This AddDepthwiseConvolution2dLayer overload is deprecated") 78 IConnectableLayer* AddDepthwiseConvolution2dLayer( 79 const DepthwiseConvolution2dDescriptor& convolution2dDescriptor, 80 const ConstTensor& weights, 81 const char* name = nullptr) override; 82 83 ARMNN_DEPRECATED_MSG("This AddDepthwiseConvolution2dLayer overload is deprecated") 84 IConnectableLayer* AddDepthwiseConvolution2dLayer( 85 const DepthwiseConvolution2dDescriptor& convolution2dDescriptor, 86 const ConstTensor& weights, 87 const ConstTensor& biases, 88 const char* name = nullptr) override; 89 90 IConnectableLayer* AddDequantizeLayer(const char* name = nullptr) override; 91 92 IConnectableLayer* AddDetectionPostProcessLayer( 93 const DetectionPostProcessDescriptor& descriptor, 94 const ConstTensor& anchors, 95 const char* name = nullptr) override; 96 97 IConnectableLayer* AddElementwiseUnaryLayer(const ElementwiseUnaryDescriptor& elementwiseUnaryDescriptor, 98 const char* name = nullptr) override; 99 100 IConnectableLayer* AddFillLayer(const FillDescriptor& fillDescriptor, 101 const char* name = nullptr) override; 102 103 IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor, 104 const ConstTensor& weights, 105 const Optional<ConstTensor>& biases, 106 const char* name = nullptr) override; 107 108 ARMNN_DEPRECATED_MSG("This AddFullyConnectedLayer overload is deprecated") 109 IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor, 110 const ConstTensor& weights, 111 const char* name = nullptr) override; 112 113 ARMNN_DEPRECATED_MSG("This AddFullyConnectedLayer overload is deprecated") 114 IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor, 115 const ConstTensor& weights, 116 const ConstTensor& biases, 117 const char* name = nullptr) override; 118 119 ARMNN_DEPRECATED_MSG("This AddGatherLayer overload is deprecated") 120 IConnectableLayer* AddGatherLayer(const char* name = nullptr) override; 121 122 IConnectableLayer* AddGatherLayer(const GatherDescriptor& gatherDescriptor, 123 const char* name = nullptr) override; 124 125 IConnectableLayer* AddPermuteLayer(const PermuteDescriptor& permuteDescriptor, 126 const char* name = nullptr) override; 127 128 IConnectableLayer* AddPooling2dLayer(const Pooling2dDescriptor& pooling2dDescriptor, 129 const char* name = nullptr) override; 130 131 IConnectableLayer* AddActivationLayer(const ActivationDescriptor& activationDescriptor, 132 const char* name = nullptr) override; 133 134 IConnectableLayer* AddNormalizationLayer(const NormalizationDescriptor& normalizationDescriptor, 135 const char* name = nullptr) override; 136 137 IConnectableLayer* AddSliceLayer(const SliceDescriptor& sliceDescriptor, const char* name = nullptr) override; 138 139 IConnectableLayer* AddSoftmaxLayer(const SoftmaxDescriptor& softmaxDescriptor, 140 const char* name = nullptr) override; 141 142 IConnectableLayer* AddSplitterLayer(const ViewsDescriptor& splitterDescriptor, 143 const char* name = nullptr) override; 144 145 ARMNN_DEPRECATED_MSG("Use AddConcatLayer instead") 146 IConnectableLayer* AddMergerLayer(const MergerDescriptor& mergerDescriptor, 147 const char* name = nullptr) override; 148 149 ARMNN_DEPRECATED_MSG("Use AddElementwiseUnaryLayer instead") 150 IConnectableLayer* AddAbsLayer(const char* name = nullptr) override; 151 152 IConnectableLayer* AddAdditionLayer(const char* name = nullptr) override; 153 154 IConnectableLayer* AddMultiplicationLayer(const char* name = nullptr) override; 155 156 IConnectableLayer* AddBatchNormalizationLayer(const BatchNormalizationDescriptor& desc, 157 const ConstTensor& mean, 158 const ConstTensor& variance, 159 const ConstTensor& beta, 160 const ConstTensor& gamma, 161 const char* name = nullptr) override; 162 163 IConnectableLayer* AddRankLayer(const char* name = nullptr) override; 164 165 ARMNN_DEPRECATED_MSG("Use AddResizeLayer instead") 166 IConnectableLayer* AddResizeBilinearLayer(const ResizeBilinearDescriptor& resizeDesc, 167 const char* name = nullptr) override; 168 169 IConnectableLayer* AddResizeLayer(const ResizeDescriptor& resizeDescriptor, 170 const char* name = nullptr) override; 171 172 IConnectableLayer* AddInstanceNormalizationLayer(const InstanceNormalizationDescriptor& desc, 173 const char* name = nullptr) override; 174 175 IConnectableLayer* AddL2NormalizationLayer(const L2NormalizationDescriptor& desc, 176 const char* name = nullptr) override; 177 178 IConnectableLayer* AddLogSoftmaxLayer(const LogSoftmaxDescriptor& logSoftmaxDescriptor, 179 const char* name = nullptr) override; 180 181 IConnectableLayer* AddConstantLayer(const ConstTensor& input, const char* name = nullptr) override; 182 183 IConnectableLayer* AddReshapeLayer(const ReshapeDescriptor& reshapeDescriptor, 184 const char* name = nullptr) override; 185 186 IConnectableLayer* AddSpaceToBatchNdLayer(const SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor, 187 const char* name = nullptr) override; 188 189 IConnectableLayer* AddSpaceToDepthLayer(const SpaceToDepthDescriptor& spaceToDepthDescriptor, 190 const char* name = nullptr) override; 191 192 IConnectableLayer* AddFloorLayer(const char* name = nullptr) override; 193 194 IConnectableLayer* AddOutputLayer(LayerBindingId id, const char* name = nullptr) override; 195 196 IConnectableLayer* AddLstmLayer(const LstmDescriptor& descriptor, 197 const LstmInputParams& params, 198 const char* name = nullptr) override; 199 200 IConnectableLayer* AddDivisionLayer(const char* name = nullptr) override; 201 202 IConnectableLayer* AddSubtractionLayer(const char* name = nullptr) override; 203 204 IConnectableLayer* AddMaximumLayer(const char* name = nullptr) override; 205 206 IConnectableLayer* AddMeanLayer(const MeanDescriptor& meanDescriptor, const char* name = nullptr) override; 207 208 IConnectableLayer* AddPadLayer(const PadDescriptor& padDescriptor, const char* name = nullptr) override; 209 210 IConnectableLayer* AddQuantizeLayer(const char* name = nullptr) override; 211 212 IConnectableLayer* AddStridedSliceLayer(const StridedSliceDescriptor& stridedSliceDescriptor, 213 const char* name = nullptr) override; 214 215 IConnectableLayer* AddMinimumLayer(const char* name = nullptr) override; 216 217 ARMNN_DEPRECATED_MSG("Use AddComparisonLayer instead") 218 IConnectableLayer* AddGreaterLayer(const char* name = nullptr) override; 219 220 ARMNN_DEPRECATED_MSG("Use AddComparisonLayer instead") 221 IConnectableLayer* AddEqualLayer(const char* name = nullptr) override; 222 223 ARMNN_DEPRECATED_MSG("Use AddElementwiseUnaryLayer instead") 224 IConnectableLayer* AddRsqrtLayer(const char* name = nullptr) override; 225 226 IConnectableLayer* AddMergeLayer(const char* name = nullptr) override; 227 228 IConnectableLayer* AddSwitchLayer(const char* name = nullptr) override; 229 230 IConnectableLayer* AddPreluLayer(const char* name = nullptr) override; 231 232 IConnectableLayer* AddTransposeConvolution2dLayer(const TransposeConvolution2dDescriptor& descriptor, 233 const ConstTensor& weights, 234 const Optional<ConstTensor>& biases, 235 const char* name = nullptr) override; 236 237 IConnectableLayer* AddTransposeLayer(const TransposeDescriptor& transposeDescriptor, 238 const char* name = nullptr) override; 239 240 IConnectableLayer* AddStackLayer(const StackDescriptor& stackDescriptor, 241 const char* name = nullptr) override; 242 243 IConnectableLayer* AddStandInLayer(const StandInDescriptor& descriptor, 244 const char* name = nullptr) override; 245 246 IConnectableLayer* AddQLstmLayer(const QLstmDescriptor& descriptor, 247 const LstmInputParams& params, 248 const char* name = nullptr) override; 249 250 IConnectableLayer* AddQuantizedLstmLayer(const QuantizedLstmInputParams& params, 251 const char* name = nullptr) override; 252 253 IConnectableLayer* AddLogicalBinaryLayer(const LogicalBinaryDescriptor& logicalBinaryDescriptor, 254 const char* name = nullptr) override; 255 256 void Accept(ILayerVisitor& visitor) const override; 257 258 private: 259 IConnectableLayer* AddFullyConnectedLayerImpl(const FullyConnectedDescriptor& fullyConnectedDescriptor, 260 const ConstTensor& weights, 261 const Optional<ConstTensor>& biases, 262 const char* name); 263 264 IConnectableLayer* AddConvolution2dLayerImpl(const Convolution2dDescriptor& convolution2dDescriptor, 265 const ConstTensor& weights, 266 const Optional<ConstTensor>& biases, 267 const char* name); 268 269 IConnectableLayer* AddDepthwiseConvolution2dLayerImpl( 270 const DepthwiseConvolution2dDescriptor& convolution2dDescriptor, 271 const ConstTensor& weights, 272 const Optional<ConstTensor>& biases, 273 const char* name); 274 275 bool GetShapeInferenceMethod(); 276 NetworkOptions m_NetworkOptions; 277 278 std::unique_ptr<Graph> m_Graph; 279 ModelOptions m_ModelOptions; 280 }; 281 282 class OptimizedNetwork final : public IOptimizedNetwork 283 { 284 public: 285 OptimizedNetwork(std::unique_ptr<Graph> graph); 286 OptimizedNetwork(std::unique_ptr<Graph> graph, const ModelOptions& modelOptions); 287 ~OptimizedNetwork(); 288 289 Status PrintGraph() override; 290 Status SerializeToDot(std::ostream& stream) const override; 291 GetGuid() const292 profiling::ProfilingGuid GetGuid() const final { return m_Guid; }; 293 GetGraph()294 Graph& GetGraph() { return *m_Graph; } GetModelOptions()295 ModelOptions& GetModelOptions() { return m_ModelOptions; } 296 297 private: 298 std::unique_ptr<Graph> m_Graph; 299 profiling::ProfilingGuid m_Guid; 300 ModelOptions m_ModelOptions; 301 }; 302 303 304 305 struct OptimizationResult 306 { 307 bool m_Warning; 308 bool m_Error; 309 OptimizationResultarmnn::OptimizationResult310 OptimizationResult(bool warning, bool error) 311 : m_Warning(warning) 312 , m_Error(error) 313 {} 314 OptimizationResultarmnn::OptimizationResult315 OptimizationResult() 316 : OptimizationResult(false, false) 317 {} 318 IsOkarmnn::OptimizationResult319 bool IsOk() const { return !m_Warning && !m_Error; } IsWarningOnlyarmnn::OptimizationResult320 bool IsWarningOnly() const { return m_Warning && !m_Error; } IsErrorarmnn::OptimizationResult321 bool IsError() const { return m_Error; } 322 323 }; 324 325 using BackendsMap = std::map<BackendId, std::unique_ptr<class IBackendInternal>>; 326 327 BackendsMap CreateSupportedBackends(TensorHandleFactoryRegistry& handleFactoryRegistry, 328 struct BackendSettings& backendSettings); 329 330 OptimizationResult SelectTensorHandleStrategy(Graph& optGraph, 331 BackendsMap& backends, 332 TensorHandleFactoryRegistry& registry, 333 bool importEnabled, 334 Optional<std::vector<std::string>&> errMessages); 335 336 OptimizationResult AssignBackends(OptimizedNetwork* optNetObjPtr, 337 BackendSettings& backendSettings, 338 Graph::Iterator& firstLayer, 339 Graph::Iterator& lastLayer, 340 Optional<std::vector<std::string>&> errMessages); 341 342 } // namespace armnn 343