1 // 2 // Copyright © 2017,2019-2023 Arm Ltd and Contributors. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 #pragma once 6 7 #include <armnn/IStrategy.hpp> 8 9 #include <armnnSerializer/ISerializer.hpp> 10 11 #include <common/include/ProfilingGuid.hpp> 12 13 #include <unordered_map> 14 15 #include "ArmnnSchema_generated.h" 16 17 #include <armnn/Types.hpp> 18 19 namespace armnnSerializer 20 { 21 22 class SerializerStrategy : public armnn::IStrategy 23 { 24 public: 25 void ExecuteStrategy(const armnn::IConnectableLayer* layer, 26 const armnn::BaseDescriptor& descriptor, 27 const std::vector<armnn::ConstTensor>& constants, 28 const char* name, 29 const armnn::LayerBindingId id) override; 30 SerializerStrategy()31 SerializerStrategy() : m_layerId(0) {} ~SerializerStrategy()32 ~SerializerStrategy() {} 33 GetFlatBufferBuilder()34 flatbuffers::FlatBufferBuilder& GetFlatBufferBuilder() 35 { 36 return m_flatBufferBuilder; 37 } 38 GetInputIds()39 std::vector<int>& GetInputIds() 40 { 41 return m_inputIds; 42 } 43 GetOutputIds()44 std::vector<int>& GetOutputIds() 45 { 46 return m_outputIds; 47 } 48 GetSerializedLayers()49 std::vector<flatbuffers::Offset<armnnSerializer::AnyLayer>>& GetSerializedLayers() 50 { 51 return m_serializedLayers; 52 } 53 54 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> GetVersionTable(); 55 56 private: 57 /// Creates the Input Slots and Output Slots and LayerBase for the layer. 58 flatbuffers::Offset<armnnSerializer::LayerBase> CreateLayerBase( 59 const armnn::IConnectableLayer* layer, 60 const armnnSerializer::LayerType layerType); 61 62 /// Creates the serializer AnyLayer for the layer and adds it to m_serializedLayers. 63 void CreateAnyLayer(const flatbuffers::Offset<void>& layer, const armnnSerializer::Layer serializerLayer); 64 65 /// Creates the serializer ConstTensor for the armnn ConstTensor. 66 flatbuffers::Offset<armnnSerializer::ConstTensor> CreateConstTensorInfo( 67 const armnn::ConstTensor& constTensor); 68 69 /// Creates the serializer TensorInfo for the armnn TensorInfo. 70 flatbuffers::Offset<TensorInfo> CreateTensorInfo(const armnn::TensorInfo& tensorInfo); 71 72 template <typename T> 73 flatbuffers::Offset<flatbuffers::Vector<T>> CreateDataVector(const void* memory, unsigned int size); 74 75 ///Function which maps Guid to an index 76 uint32_t GetSerializedId(LayerGuid guid); 77 78 /// Creates the serializer InputSlots for the layer. 79 std::vector<flatbuffers::Offset<armnnSerializer::InputSlot>> CreateInputSlots( 80 const armnn::IConnectableLayer* layer); 81 82 /// Creates the serializer OutputSlots for the layer. 83 std::vector<flatbuffers::Offset<armnnSerializer::OutputSlot>> CreateOutputSlots( 84 const armnn::IConnectableLayer* layer); 85 86 /// FlatBufferBuilder to create our layers' FlatBuffers. 87 flatbuffers::FlatBufferBuilder m_flatBufferBuilder; 88 89 /// AnyLayers required by the SerializedGraph. 90 std::vector<flatbuffers::Offset<armnnSerializer::AnyLayer>> m_serializedLayers; 91 92 /// Vector of the binding ids of all Input Layers required by the SerializedGraph. 93 std::vector<int> m_inputIds; 94 95 /// Vector of the binding ids of all Output Layers required by the SerializedGraph. 96 std::vector<int> m_outputIds; 97 98 /// Mapped Guids of all Layers to match our index. 99 std::unordered_map<LayerGuid, uint32_t > m_guidMap; 100 101 /// layer within our FlatBuffer index. 102 uint32_t m_layerId; 103 104 private: 105 void SerializeActivationLayer(const armnn::IConnectableLayer* layer, 106 const armnn::ActivationDescriptor& descriptor, 107 const char* name = nullptr); 108 109 void SerializeAdditionLayer(const armnn::IConnectableLayer* layer, 110 const char* name = nullptr); 111 112 void SerializeArgMinMaxLayer(const armnn::IConnectableLayer* layer, 113 const armnn::ArgMinMaxDescriptor& argMinMaxDescriptor, 114 const char* name = nullptr); 115 116 void SerializeBatchMatMulLayer(const armnn::IConnectableLayer* layer, 117 const armnn::BatchMatMulDescriptor& descriptor, 118 const char* name = nullptr); 119 120 void SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer, 121 const armnn::BatchToSpaceNdDescriptor& descriptor, 122 const char* name = nullptr); 123 124 void SerializeBatchNormalizationLayer(const armnn::IConnectableLayer* layer, 125 const armnn::BatchNormalizationDescriptor& BatchNormalizationDescriptor, 126 const std::vector<armnn::ConstTensor>& constants, 127 const char* name = nullptr); 128 129 void SerializeCastLayer(const armnn::IConnectableLayer* layer, 130 const char* name = nullptr); 131 132 void SerializeChannelShuffleLayer(const armnn::IConnectableLayer* layer, 133 const armnn::ChannelShuffleDescriptor& descriptor, 134 const char* name = nullptr); 135 136 void SerializeComparisonLayer(const armnn::IConnectableLayer* layer, 137 const armnn::ComparisonDescriptor& descriptor, 138 const char* name = nullptr); 139 140 void SerializeConcatLayer(const armnn::IConnectableLayer* layer, 141 const armnn::ConcatDescriptor& concatDescriptor, 142 const char* name = nullptr); 143 144 void SerializeConstantLayer(const armnn::IConnectableLayer* layer, 145 const std::vector<armnn::ConstTensor>& constants, 146 const char* name = nullptr); 147 148 void SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer, 149 const armnn::Convolution2dDescriptor& descriptor, 150 const char* name = nullptr); 151 152 void SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer, 153 const armnn::Convolution3dDescriptor& descriptor, 154 const char* name = nullptr); 155 156 void SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer, 157 const armnn::DepthToSpaceDescriptor& descriptor, 158 const char* name = nullptr); 159 160 void SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer, 161 const armnn::DepthwiseConvolution2dDescriptor& descriptor, 162 const char* name = nullptr); 163 164 void SerializeDequantizeLayer(const armnn::IConnectableLayer* layer, 165 const char* name = nullptr); 166 167 void SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer, 168 const armnn::DetectionPostProcessDescriptor& descriptor, 169 const std::vector<armnn::ConstTensor>& constants, 170 const char* name = nullptr); 171 172 void SerializeDivisionLayer(const armnn::IConnectableLayer* layer, 173 const char* name = nullptr); 174 175 void SerializeElementwiseBinaryLayer(const armnn::IConnectableLayer* layer, 176 const armnn::ElementwiseBinaryDescriptor& descriptor, 177 const char* name = nullptr); 178 179 void SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer, 180 const armnn::ElementwiseUnaryDescriptor& descriptor, 181 const char* name = nullptr); 182 183 void SerializeFillLayer(const armnn::IConnectableLayer* layer, 184 const armnn::FillDescriptor& fillDescriptor, 185 const char* name = nullptr); 186 187 void SerializeFloorLayer(const armnn::IConnectableLayer *layer, 188 const char *name = nullptr); 189 190 void SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer, 191 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor, 192 const char* name = nullptr); 193 194 void SerializeGatherLayer(const armnn::IConnectableLayer* layer, 195 const armnn::GatherDescriptor& gatherDescriptor, 196 const char* name = nullptr); 197 198 void SerializeGatherNdLayer(const armnn::IConnectableLayer* layer, 199 const char* name = nullptr); 200 201 void SerializeInputLayer(const armnn::IConnectableLayer* layer, 202 armnn::LayerBindingId id, 203 const char* name = nullptr); 204 205 void SerializeInstanceNormalizationLayer(const armnn::IConnectableLayer* layer, 206 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor, 207 const char* name = nullptr); 208 209 void SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer, 210 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor, 211 const char* name = nullptr); 212 213 void SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer, 214 const armnn::LogicalBinaryDescriptor& descriptor, 215 const char* name = nullptr); 216 217 void SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer, 218 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor, 219 const char* name = nullptr); 220 221 void SerializeLstmLayer(const armnn::IConnectableLayer* layer, 222 const armnn::LstmDescriptor& descriptor, 223 const std::vector<armnn::ConstTensor>& constants, 224 const char* name = nullptr); 225 226 void SerializeMeanLayer(const armnn::IConnectableLayer* layer, 227 const armnn::MeanDescriptor& descriptor, 228 const char* name); 229 230 void SerializeMinimumLayer(const armnn::IConnectableLayer* layer, 231 const char* name = nullptr); 232 233 void SerializeMaximumLayer(const armnn::IConnectableLayer* layer, 234 const char* name = nullptr); 235 236 void SerializeMergeLayer(const armnn::IConnectableLayer* layer, 237 const char* name = nullptr); 238 239 void SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer, 240 const char* name = nullptr); 241 242 void SerializeOutputLayer(const armnn::IConnectableLayer* layer, 243 armnn::LayerBindingId id, 244 const char* name = nullptr); 245 246 void SerializePadLayer(const armnn::IConnectableLayer* layer, 247 const armnn::PadDescriptor& PadDescriptor, 248 const char* name = nullptr); 249 250 void SerializePermuteLayer(const armnn::IConnectableLayer* layer, 251 const armnn::PermuteDescriptor& PermuteDescriptor, 252 const char* name = nullptr); 253 254 void SerializePooling2dLayer(const armnn::IConnectableLayer* layer, 255 const armnn::Pooling2dDescriptor& pooling2dDescriptor, 256 const char* name = nullptr); 257 258 void SerializePooling3dLayer(const armnn::IConnectableLayer* layer, 259 const armnn::Pooling3dDescriptor& pooling3dDescriptor, 260 const char* name = nullptr); 261 262 void SerializePreluLayer(const armnn::IConnectableLayer* layer, 263 const char* name = nullptr); 264 265 void SerializeQuantizeLayer(const armnn::IConnectableLayer* layer, 266 const char* name = nullptr); 267 268 void SerializeQLstmLayer(const armnn::IConnectableLayer* layer, 269 const armnn::QLstmDescriptor& descriptor, 270 const std::vector<armnn::ConstTensor>& constants, 271 const char* name = nullptr); 272 273 void SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer, 274 const std::vector<armnn::ConstTensor>& constants, 275 const char* name = nullptr); 276 277 void SerializeRankLayer(const armnn::IConnectableLayer* layer, 278 const char* name = nullptr); 279 280 void SerializeReduceLayer(const armnn::IConnectableLayer* layer, 281 const armnn::ReduceDescriptor& reduceDescriptor, 282 const char* name = nullptr); 283 284 void SerializeReshapeLayer(const armnn::IConnectableLayer* layer, 285 const armnn::ReshapeDescriptor& reshapeDescriptor, 286 const char* name = nullptr); 287 288 void SerializeResizeLayer(const armnn::IConnectableLayer* layer, 289 const armnn::ResizeDescriptor& resizeDescriptor, 290 const char* name = nullptr); 291 292 void SerializeSliceLayer(const armnn::IConnectableLayer* layer, 293 const armnn::SliceDescriptor& sliceDescriptor, 294 const char* name = nullptr); 295 296 void SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer, 297 const armnn::SoftmaxDescriptor& softmaxDescriptor, 298 const char* name = nullptr); 299 300 void SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer, 301 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor, 302 const char* name = nullptr); 303 304 void SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer, 305 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor, 306 const char* name = nullptr); 307 308 void SerializeNormalizationLayer(const armnn::IConnectableLayer* layer, 309 const armnn::NormalizationDescriptor& normalizationDescriptor, 310 const char* name = nullptr); 311 312 void SerializeShapeLayer(const armnn::IConnectableLayer* layer, 313 const char* name = nullptr); 314 315 void SerializeSplitterLayer(const armnn::IConnectableLayer* layer, 316 const armnn::ViewsDescriptor& viewsDescriptor, 317 const char* name = nullptr); 318 319 void SerializeStandInLayer(const armnn::IConnectableLayer* layer, 320 const armnn::StandInDescriptor& standInDescriptor, 321 const char* name = nullptr); 322 323 void SerializeStackLayer(const armnn::IConnectableLayer* layer, 324 const armnn::StackDescriptor& stackDescriptor, 325 const char* name = nullptr); 326 327 void SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer, 328 const armnn::StridedSliceDescriptor& stridedSliceDescriptor, 329 const char* name = nullptr); 330 331 void SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, 332 const char* name = nullptr); 333 334 void SerializeSwitchLayer(const armnn::IConnectableLayer* layer, 335 const char* name = nullptr); 336 337 void SerializeTransposeConvolution2dLayer(const armnn::IConnectableLayer* layer, 338 const armnn::TransposeConvolution2dDescriptor& descriptor, 339 const std::vector<armnn::ConstTensor>& constants, 340 const char* = nullptr); 341 342 void SerializeTransposeLayer(const armnn::IConnectableLayer* layer, 343 const armnn::TransposeDescriptor& descriptor, 344 const char* name = nullptr); 345 346 void SerializeUnidirectionalSequenceLstmLayer(const armnn::IConnectableLayer* layer, 347 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor, 348 const std::vector<armnn::ConstTensor>& constants, 349 const char* name = nullptr); 350 }; 351 352 353 354 class ISerializer::SerializerImpl 355 { 356 public: 357 SerializerImpl() = default; 358 ~SerializerImpl() = default; 359 360 /// Serializes the network to ArmNN SerializedGraph. 361 /// @param [in] inNetwork The network to be serialized. 362 void Serialize(const armnn::INetwork& inNetwork); 363 364 /// Serializes the SerializedGraph to the stream. 365 /// @param [stream] the stream to save to 366 /// @return true if graph is Serialized to the Stream, false otherwise 367 bool SaveSerializedToStream(std::ostream& stream); 368 369 private: 370 371 /// Visitor to contruct serialized network 372 SerializerStrategy m_SerializerStrategy; 373 }; 374 375 } //namespace armnnSerializer 376