• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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