blob: 0e8c894e46f4d08494b245a3da315690337a81f1 [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "Serializer.hpp"
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00007
8#include "SerializerUtils.hpp"
9
Mike Kelly8c1701a2019-02-11 17:01:27 +000010#include <armnn/ArmNN.hpp>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000011
Mike Kelly8c1701a2019-02-11 17:01:27 +000012#include <iostream>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000013
Aron Virginas-Tard4f0fea2019-04-09 14:08:06 +010014#include <boost/numeric/conversion/cast.hpp>
15
Mike Kelly8c1701a2019-02-11 17:01:27 +000016#include <flatbuffers/util.h>
17
18using namespace armnn;
19namespace fb = flatbuffers;
Derek Lamberti0028d1b2019-02-20 13:57:42 +000020namespace serializer = armnnSerializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000021
22namespace armnnSerializer
23{
24
Mike Kellyaf484012019-02-20 16:53:11 +000025serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
26{
27 switch (function)
28 {
29 case armnn::ActivationFunction::Sigmoid:
30 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
31 case armnn::ActivationFunction::TanH:
32 return serializer::ActivationFunction::ActivationFunction_TanH;
33 case armnn::ActivationFunction::Linear:
34 return serializer::ActivationFunction::ActivationFunction_Linear;
35 case armnn::ActivationFunction::ReLu:
36 return serializer::ActivationFunction::ActivationFunction_ReLu;
37 case armnn::ActivationFunction::BoundedReLu:
38 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
39 case armnn::ActivationFunction::LeakyReLu:
40 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
41 case armnn::ActivationFunction::Abs:
42 return serializer::ActivationFunction::ActivationFunction_Abs;
43 case armnn::ActivationFunction::Sqrt:
44 return serializer::ActivationFunction::ActivationFunction_Sqrt;
45 case armnn::ActivationFunction::Square:
46 return serializer::ActivationFunction::ActivationFunction_Square;
47 default:
48 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
49 }
50}
51
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010052serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
53{
54 switch (function)
55 {
56 case armnn::ArgMinMaxFunction::Max:
57 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
58 case armnn::ArgMinMaxFunction::Min:
59 default:
60 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
61 }
62}
63
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000064uint32_t SerializerVisitor::GetSerializedId(unsigned int guid)
65{
66 std::pair<unsigned int, uint32_t> guidPair(guid, m_layerId);
67
68 if (m_guidMap.empty())
69 {
70 m_guidMap.insert(guidPair);
71 }
72 else if (m_guidMap.find(guid) == m_guidMap.end())
73 {
74 guidPair.second = ++m_layerId;
75 m_guidMap.insert(guidPair);
76 return m_layerId;
77 }
Saoirse Stewart30211042019-02-18 17:19:16 +000078 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000079}
80
Mike Kelly8c1701a2019-02-11 17:01:27 +000081// Build FlatBuffer for Input Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +000082void SerializerVisitor::VisitInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +000083{
84 // Create FlatBuffer BaseLayer
85 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
86
87 // Create FlatBuffer BindableBaseLayer
88 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
89 flatBufferInputBaseLayer,
90 id);
Mike Kelly8c1701a2019-02-11 17:01:27 +000091 // Push layer Guid to outputIds.
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000092 m_inputIds.push_back(GetSerializedId(layer->GetGuid()));
Mike Kelly8c1701a2019-02-11 17:01:27 +000093
94 // Create the FlatBuffer InputLayer
95 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
96
97 // Add the AnyLayer to the FlatBufferLayers
98 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
99}
100
101// Build FlatBuffer for Output Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000102void SerializerVisitor::VisitOutputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000103{
104 // Create FlatBuffer BaseLayer
105 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
106
107 // Create FlatBuffer BindableBaseLayer
108 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
109 flatBufferOutputBaseLayer,
110 id);
111 // Push layer Guid to outputIds.
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000112 m_outputIds.push_back(GetSerializedId(layer->GetGuid()));
Mike Kelly8c1701a2019-02-11 17:01:27 +0000113
114 // Create the FlatBuffer OutputLayer
115 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
116 // Add the AnyLayer to the FlatBufferLayers
117 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
118}
119
Kevin May868eb142019-09-04 17:29:31 +0100120void SerializerVisitor::VisitAbsLayer(const armnn::IConnectableLayer* layer, const char* name)
121{
FinnWilliamsArm4ffcc8f2019-09-05 14:34:20 +0100122 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Abs);
123 auto flatBufferAbsLayer = serializer::CreateAbsLayer(m_flatBufferBuilder, flatBufferBaseLayer);
124
125 CreateAnyLayer(flatBufferAbsLayer.o, serializer::Layer::Layer_AbsLayer);
Kevin May868eb142019-09-04 17:29:31 +0100126}
127
Mike Kellyaf484012019-02-20 16:53:11 +0000128// Build FlatBuffer for Activation Layer
129void SerializerVisitor::VisitActivationLayer(const armnn::IConnectableLayer* layer,
130 const armnn::ActivationDescriptor& descriptor,
131 const char* name)
132{
133 // Create FlatBuffer BaseLayer
134 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
135
136 // Create the FlatBuffer ActivationDescriptor
137 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
138 GetFlatBufferActivationFunction(descriptor.m_Function),
139 descriptor.m_A,
140 descriptor.m_B);
141
142 // Create the FlatBuffer ActivationLayer
143 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
144 flatBufferBaseLayer,
145 flatBufferDescriptor);
146
147 // Add the AnyLayer to the FlatBufferLayers
148 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
149}
150
Mike Kelly8c1701a2019-02-11 17:01:27 +0000151// Build FlatBuffer for Addition Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000152void SerializerVisitor::VisitAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000153{
154 // Create FlatBuffer BaseLayer
155 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
156
157 // Create the FlatBuffer AdditionLayer
158 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
159
160 // Add the AnyLayer to the FlatBufferLayers
161 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
162}
163
Nikhil Rajee391d52019-09-05 17:50:44 +0100164// Build FlatBuffer for ArgMinMax Layer
165void SerializerVisitor::VisitArgMinMaxLayer(const armnn::IConnectableLayer *layer,
166 const armnn::ArgMinMaxDescriptor& descriptor,
167 const char *name)
168{
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100169 // Create FlatBuffer BaseLayer
170 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
171
172 // Create FlatBuffer Descriptor
173 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
174 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
175 descriptor.m_Axis);
176
177 // Create FlatBuffer ArgMinMaxLayer
178 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
179 flatBufferBaseLayer,
180 flatBufferDescriptor);
181
182 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100183}
184
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000185// Build FlatBuffer for BatchToSpaceNd Layer
186void SerializerVisitor::VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
187 const armnn::BatchToSpaceNdDescriptor& descriptor,
188 const char* name)
189{
190 // Create FlatBuffer BaseLayer
191 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
192
193 std::vector<unsigned int> crops;
194 crops.reserve(descriptor.m_Crops.size() * 2);
195 for (auto& crop : descriptor.m_Crops)
196 {
197 crops.push_back(crop.first);
198 crops.push_back(crop.second);
199 }
200
201 auto flatBufferDescriptor =
202 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
203 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
204 m_flatBufferBuilder.CreateVector(crops),
205 GetFlatBufferDataLayout(descriptor.m_DataLayout));
206
207 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
208 flatBufferBaseLayer,
209 flatBufferDescriptor);
210
211 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
212}
213
ruoyan018e7fa232019-02-28 15:09:07 +0000214void SerializerVisitor::VisitBatchNormalizationLayer(const armnn::IConnectableLayer* layer,
215 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
216 const armnn::ConstTensor& mean,
217 const armnn::ConstTensor& variance,
218 const armnn::ConstTensor& beta,
219 const armnn::ConstTensor& gamma,
220 const char* name)
221{
222 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
223 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
224 m_flatBufferBuilder,
225 batchNormDescriptor.m_Eps,
226 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
227
228 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
229 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
230 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
231 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
232 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
233 fbBatchNormalizationBaseLayer,
234 fbBatchNormalizationDescriptor,
235 fbMeanConstTensorInfo,
236 fbVarianceConstTensorInfo,
237 fbBetaConstTensorInfo,
238 fbGammaConstTensorInfo);
239
240 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
241}
242
Conor Kennedy76277882019-02-26 08:29:54 +0000243// Build FlatBuffer for Constant Layer
244void SerializerVisitor::VisitConstantLayer(const armnn::IConnectableLayer* layer,
245 const armnn::ConstTensor& input,
246 const char* name)
247{
248 // Create FlatBuffer BaseLayer
249 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
250
251 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
252
253 // Create the FlatBuffer ConstantLayer
254 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
255 flatBufferConstantBaseLayer,
256 flatBufferConstTensorInfo);
257
258 // Add the AnyLayer to the FlatBufferLayers
259 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
260}
261
Mike Kellya0766c32019-02-19 17:22:07 +0000262// Build FlatBuffer for Convolution2dLayer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000263void SerializerVisitor::VisitConvolution2dLayer(const armnn::IConnectableLayer* layer,
264 const armnn::Convolution2dDescriptor& descriptor,
265 const armnn::ConstTensor& weights,
266 const armnn::Optional<armnn::ConstTensor>& biases,
Mike Kellya0766c32019-02-19 17:22:07 +0000267 const char* name)
268{
269 // Create FlatBuffer BaseLayer
270 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
271
272 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
273 descriptor.m_PadLeft,
274 descriptor.m_PadRight,
275 descriptor.m_PadTop,
276 descriptor.m_PadBottom,
277 descriptor.m_StrideX,
278 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100279 descriptor.m_DilationX,
280 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000281 descriptor.m_BiasEnabled,
282 GetFlatBufferDataLayout(descriptor.m_DataLayout));
283 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
284 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
285
286 if (biases.has_value())
287 {
288 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
289 }
290
291 // Create the FlatBuffer Convolution2dLayer
292 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
293 flatBufferBaseLayer,
294 flatBufferDescriptor,
295 flatBufferWeightsConstTensorInfo,
296 flatBufferBiasesConstTensorInfo);
297
298 // Add the AnyLayer to the FlatBufferLayers
299 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
300}
301
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100302void SerializerVisitor::VisitDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
303 const armnn::DepthToSpaceDescriptor& descriptor,
304 const char* name)
305{
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100306 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
307 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
308 descriptor.m_BlockSize,
309 GetFlatBufferDataLayout(descriptor.m_DataLayout));
310
311 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
312
313 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100314}
315
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000316void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
317 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
318 const armnn::ConstTensor& weights,
319 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000320 const char* name)
321{
322 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
323 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
324 descriptor.m_PadLeft,
325 descriptor.m_PadRight,
326 descriptor.m_PadTop,
327 descriptor.m_PadBottom,
328 descriptor.m_StrideX,
329 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100330 descriptor.m_DilationX,
331 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000332 descriptor.m_BiasEnabled,
333 GetFlatBufferDataLayout(descriptor.m_DataLayout));
334
335 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
336 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
337 if (biases.has_value())
338 {
339 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
340 }
341
342 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
343 fbBaseLayer,
344 fbDescriptor,
345 fbWeightsConstTensorInfo,
346 fbBiasesConstTensorInfo);
347
348 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
349}
350
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000351void SerializerVisitor::VisitDequantizeLayer(const armnn::IConnectableLayer* layer,
352 const char* name)
353{
354 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
355 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
356
357 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
358}
359
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000360void SerializerVisitor::VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
361 const armnn::DetectionPostProcessDescriptor& descriptor,
362 const armnn::ConstTensor& anchors,
363 const char* name)
364{
365 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
366 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
367 descriptor.m_MaxDetections,
368 descriptor.m_MaxClassesPerDetection,
369 descriptor.m_DetectionsPerClass,
370 descriptor.m_NmsScoreThreshold,
371 descriptor.m_NmsIouThreshold,
372 descriptor.m_NumClasses,
373 descriptor.m_UseRegularNms,
374 descriptor.m_ScaleX,
375 descriptor.m_ScaleY,
376 descriptor.m_ScaleW,
377 descriptor.m_ScaleH);
378
379 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
380
381 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
382 fbBaseLayer,
383 fbDescriptor,
384 fbAnchorsConstTensorInfo);
385
386 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
387}
388
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000389void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
390{
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000391 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
392 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000393
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000394 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
395}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000396
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000397void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
398{
399 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
400 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
401
402 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
403}
404
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000405void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
406{
407 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
408 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
409
410 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
411}
412
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000413void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer, const char* name)
414{
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000415 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
416 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000417
418 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
419}
420
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000421void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
422{
423 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000424 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000425
426 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
427}
428
Kevin Mayce5045a2019-10-02 14:07:47 +0100429void SerializerVisitor::VisitInstanceNormalizationLayer(
430 const armnn::IConnectableLayer* layer,
431 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
432 const char* name)
433{
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100434 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
435 m_flatBufferBuilder,
436 instanceNormalizationDescriptor.m_Gamma,
437 instanceNormalizationDescriptor.m_Beta,
438 instanceNormalizationDescriptor.m_Eps,
439 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
440
441 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
442 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
443
444 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100445}
446
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000447void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
448 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
449 const char* name)
450{
451 // Create FlatBuffer BaseLayer
452 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
453
454 // Create the FlatBuffer L2Normalization Descriptor
455 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100456 m_flatBufferBuilder,
457 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
458 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000459
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100460 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000461 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
462
463 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
464}
465
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100466void SerializerVisitor::VisitLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
467 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
468 const char* name)
469{
470 throw armnn::UnimplementedException("SerializerVisitor::VisitLogSoftmaxLayer() is not implemented");
471}
472
473void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer,
474 const armnn::LstmDescriptor& descriptor,
475 const armnn::LstmInputParams& params,
476 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000477{
478 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
479
480 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
481 m_flatBufferBuilder,
482 descriptor.m_ActivationFunc,
483 descriptor.m_ClippingThresCell,
484 descriptor.m_ClippingThresProj,
485 descriptor.m_CifgEnabled,
486 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100487 descriptor.m_ProjectionEnabled,
488 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000489
490 // Get mandatory input parameters
491 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
492 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
493 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
494 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
495 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
496 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
497 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
498 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
499 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
500
501 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
502 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
503 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
504 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
505 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
506 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
507 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
508 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
509 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100510 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
511 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
512 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
513 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000514
515 if (!descriptor.m_CifgEnabled)
516 {
517 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
518 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
519 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
520 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
521 }
522
523 if (descriptor.m_ProjectionEnabled)
524 {
525 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
526 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
527 }
528
529 if (descriptor.m_PeepholeEnabled)
530 {
531 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
532 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
533 }
534
Jan Eilersf8c62972019-07-17 11:07:49 +0100535 if (descriptor.m_LayerNormEnabled)
536 {
537 if (!descriptor.m_CifgEnabled)
538 {
539 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
540 }
541 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
542 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
543 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
544 }
545
Jim Flynn11af3752019-03-19 17:22:29 +0000546 auto fbLstmParams = serializer::CreateLstmInputParams(
547 m_flatBufferBuilder,
548 inputToForgetWeights,
549 inputToCellWeights,
550 inputToOutputWeights,
551 recurrentToForgetWeights,
552 recurrentToCellWeights,
553 recurrentToOutputWeights,
554 forgetGateBias,
555 cellBias,
556 outputGateBias,
557 inputToInputWeights,
558 recurrentToInputWeights,
559 cellToInputWeights,
560 inputGateBias,
561 projectionWeights,
562 projectionBias,
563 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100564 cellToOutputWeights,
565 inputLayerNormWeights,
566 forgetLayerNormWeights,
567 cellLayerNormWeights,
568 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000569
570 auto fbLstmLayer = serializer::CreateLstmLayer(
571 m_flatBufferBuilder,
572 fbLstmBaseLayer,
573 fbLstmDescriptor,
574 fbLstmParams);
575
576 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
577}
578
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000579void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
580{
581 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
582 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
583
584 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
585}
586
587void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
588 const armnn::MeanDescriptor& descriptor,
589 const char* name)
590{
591 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
592 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
593 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
594 descriptor.m_KeepDims);
595
596 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
597 fbMeanBaseLayer,
598 fbMeanDescriptor);
599
600 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
601}
602
603void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
604{
605 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
606 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
607
608 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
609}
610
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100611void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
612{
613 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
614 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
615
616 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
617}
618
Jim Flynnac25a1b2019-02-28 10:40:49 +0000619void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100620 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000621 const char* name)
622{
Jim Flynne242f2d2019-05-22 14:24:13 +0100623 VisitConcatLayer(layer, mergerDescriptor, name);
624}
625
626void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
627 const armnn::ConcatDescriptor& concatDescriptor,
628 const char* name)
629{
630 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000631
632 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100633 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000634 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100635 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000636 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100637 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000638 {
639 origins.push_back(origin[d]);
640 }
641 auto view = m_flatBufferBuilder.CreateVector(origins);
642 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
643 views.push_back(uintVector);
644 }
645
Jim Flynne242f2d2019-05-22 14:24:13 +0100646 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
647 concatDescriptor.GetConcatAxis(),
648 concatDescriptor.GetNumViews(),
649 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000650 m_flatBufferBuilder.CreateVector(views));
651
Jim Flynne242f2d2019-05-22 14:24:13 +0100652 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
653 flatBufferConcatBaseLayer,
654 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000655
Jim Flynne242f2d2019-05-22 14:24:13 +0100656 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000657}
658
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000659void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000660{
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000661 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
662 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
663 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000664
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000665 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000666}
667
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000668void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
669 const armnn::PadDescriptor& padDescriptor,
670 const char* name)
671{
672 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
673
674 std::vector<unsigned int> padList;
675 for (auto& p: padDescriptor.m_PadList)
676 {
677 padList.push_back(p.first);
678 padList.push_back(p.second);
679 }
680
681 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100682 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100683 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000684
685 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
686 flatBufferBaseLayer,
687 flatBufferPadDesc);
688
689 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
690}
691
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000692void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
693 const armnn::PermuteDescriptor& permuteDescriptor,
694 const char* name)
695{
696 // Create FlatBuffer BaseLayer
697 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
698
699 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100700 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000701 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100702 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000703 }
704
705 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
706 m_flatBufferBuilder.CreateVector(dimMappings));
707
708 // Create the FlatBuffer PermuteLayer
709 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
710 flatBufferPermuteBaseLayer,
711 flatBufferPermuteDesc);
712
713 // Add the AnyLayer to the FlatBufferLayers
714 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
715}
716
Saoirse Stewart263829c2019-02-19 15:54:14 +0000717// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000718void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000719 const armnn::ReshapeDescriptor& reshapeDescriptor,
720 const char* name)
721{
722 // Create FlatBuffer BaseLayer
723 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
724
725 std::vector<unsigned int> targetShape;
726 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
727 {
728 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
729 }
730
731 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
732 m_flatBufferBuilder.CreateVector(targetShape));
733
734 // Create the FlatBuffer ReshapeLayer
735 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
736 flatBufferReshapeDesc);
737
738 // Add the AnyLayer to the FlatBufferLayers
739 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
740}
741
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000742void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
743 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
744 const char* name)
745{
746 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
747
748 auto flatBufferDescriptor =
749 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
750 resizeDescriptor.m_TargetWidth,
751 resizeDescriptor.m_TargetHeight,
752 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
753
754 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
755 flatBufferBaseLayer,
756 flatBufferDescriptor);
757
758 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
759}
760
Teresa Charlina9075df2019-06-27 15:41:57 +0100761void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
762 const armnn::ResizeDescriptor& resizeDescriptor,
763 const char* name)
764{
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100765 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
766
767 auto flatBufferDescriptor =
768 CreateResizeDescriptor(m_flatBufferBuilder,
769 resizeDescriptor.m_TargetHeight,
770 resizeDescriptor.m_TargetWidth,
771 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
772 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
773
774 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
775 flatBufferBaseLayer,
776 flatBufferDescriptor);
777
778 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100779}
780
Sadik Armagan8b42a382019-03-01 14:24:49 +0000781void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
782{
783 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
784 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
785
786 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
787}
788
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100789void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
790 const armnn::SliceDescriptor& sliceDescriptor,
791 const char* name)
792{
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100793 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
794 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
795 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
796 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
797
798 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
799
800 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100801}
802
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000803// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000804void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
805 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000806 const char* name)
807{
808 // Create FlatBuffer BaseLayer
809 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
810
811 // Create the FlatBuffer SoftmaxDescriptor
812 auto flatBufferSoftmaxDesc =
813 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
814
815 // Create the FlatBuffer SoftmaxLayer
816 auto flatBufferSoftmaxLayer =
817 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
818 flatBufferSoftmaxBaseLayer,
819 flatBufferSoftmaxDesc);
820
821 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
822}
823
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000824void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
825 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000826 const char* name)
827{
828 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
829 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
830 m_flatBufferBuilder,
831 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
832 pooling2dDescriptor.m_PadLeft,
833 pooling2dDescriptor.m_PadRight,
834 pooling2dDescriptor.m_PadTop,
835 pooling2dDescriptor.m_PadBottom,
836 pooling2dDescriptor.m_PoolWidth,
837 pooling2dDescriptor.m_PoolHeight,
838 pooling2dDescriptor.m_StrideX,
839 pooling2dDescriptor.m_StrideY,
840 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
841 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
842 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
843
844 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
845 fbPooling2dBaseLayer,
846 fbPooling2dDescriptor);
847
848 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
849}
850
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100851void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
852 const char* name)
853{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100854 // Create FlatBuffer BaseLayer
855 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
856
857 // Create the FlatBuffer AdditionLayer
858 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
859
860 // Add the AnyLayer to the FlatBufferLayers
861 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100862}
863
Derek Lamberti87acb272019-03-27 16:51:31 +0000864void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
865{
866 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
867 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
868 fbQuantizeBaseLayer);
869 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
870}
871
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000872// Build FlatBuffer for FullyConnected Layer
873void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
874 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
875 const armnn::ConstTensor& weights,
876 const armnn::Optional<armnn::ConstTensor>& biases,
877 const char* name)
878{
879 // Create FlatBuffer BaseLayer
880 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
881
882 // Create FlatBuffer FullyConnectedDescriptor
883 auto flatBufferDescriptor =
884 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
885 fullyConnectedDescriptor.m_BiasEnabled,
886 fullyConnectedDescriptor.m_TransposeWeightMatrix);
887
888 // Create FlatBuffer weights data
889 auto flatBufferWeights = CreateConstTensorInfo(weights);
890
891 // Create FlatBuffer bias data
892 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
893 if (fullyConnectedDescriptor.m_BiasEnabled)
894 {
895 flatBufferBiases = CreateConstTensorInfo(biases.value());
896 }
897
898 // Create FlatBuffer FullyConnectedLayer
899 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
900 flatBufferBaseLayer,
901 flatBufferDescriptor,
902 flatBufferWeights,
903 flatBufferBiases);
904
905 // Add created FullyConnectedLayer to the FlatBufferLayers
906 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
907}
908
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000909// Build FlatBuffer for SpaceToBatchNd Layer
910void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
911 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
912 const char* name)
913{
914 // Create FlatBuffer BaseLayer
915 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
916
917 std::vector<unsigned int> padList;
918 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
919 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
920 {
921 padList.push_back(pad.first);
922 padList.push_back(pad.second);
923 }
924
925 auto flatBufferDescriptor =
926 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
927 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
928 m_flatBufferBuilder.CreateVector(padList),
929 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
930
931 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
932 flatBufferBaseLayer,
933 flatBufferDescriptor);
934
935 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
936}
937
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100938// Build FlatBuffer for SpaceToDepthLayer
939void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
940 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
941 const char* name)
942{
Aron Virginas-Taraa067142019-06-11 16:01:44 +0100943 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
944 auto flatBufferDescriptor =
945 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
946 spaceToDepthDescriptor.m_BlockSize,
947 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
948
949 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
950 flatBufferBaseLayer,
951 flatBufferDescriptor);
952
953 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100954}
955
Jim Flynn18ce3382019-03-08 11:08:30 +0000956// Build FlatBuffer for Splitter Layer
957void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
958 const armnn::ViewsDescriptor& viewsDescriptor,
959 const char* name)
960{
961 // Create FlatBuffer ViewOrigins
962 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
963 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
964
965 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
966 {
967 std::vector<uint32_t> viewOrigin;
968 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
969
970 // Copy vector
971 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
972 {
973 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
974 }
975
976 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
977 m_flatBufferBuilder.CreateVector(viewOrigin)));
978 }
979
980 // Create FlatBuffer OriginsDescriptor
981 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
982 viewsDescriptor.GetOrigins().GetConcatAxis(),
983 viewsDescriptor.GetOrigins().GetNumViews(),
984 viewsDescriptor.GetOrigins().GetNumDimensions(),
985 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
986
987 // Create FlatBuffer ViewOrigins
988 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
989 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
990
991 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
992 {
993 std::vector<uint32_t> viewSize;
994 viewSize.reserve(viewsDescriptor.GetNumDimensions());
995
996 // Copy vector
997 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
998 {
999 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1000 }
1001
1002 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1003 m_flatBufferBuilder.CreateVector(viewSize)));
1004 }
1005
1006 // Create FlatBuffer ViewsDescriptor
1007 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1008 flatBufferOriginDescriptor,
1009 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1010
1011 // Create FlatBuffer BaseLayer
1012 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1013
1014 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1015 flatBufferBaseLayer,
1016 flatBufferViewsDescriptor);
1017
1018 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1019}
1020
Nina Drozd57728782019-02-27 10:53:27 +00001021void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1022 const armnn::NormalizationDescriptor& descriptor,
1023 const char* name)
1024{
1025 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1026
1027 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1028 m_flatBufferBuilder,
1029 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1030 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1031 descriptor.m_NormSize,
1032 descriptor.m_Alpha,
1033 descriptor.m_Beta,
1034 descriptor.m_K,
1035 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1036
1037 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1038 fbNormalizationBaseLayer,
1039 fbNormalizationDescriptor);
1040
1041 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1042}
1043
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001044void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1045 const armnn::StackDescriptor& stackDescriptor,
1046 const char* name)
1047{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001048 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1049
1050 std::vector<unsigned int> inputShape;
1051 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1052 {
1053 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1054 }
1055
1056 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1057 stackDescriptor.m_Axis,
1058 stackDescriptor.m_NumInputs,
1059 m_flatBufferBuilder.CreateVector(inputShape));
1060
1061 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1062 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001063}
1064
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001065void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1066 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1067 const char* name)
1068{
1069 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1070
1071 auto flatBufferDescriptor =
1072 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1073 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1074 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1075 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1076 stridedSliceDescriptor.m_BeginMask,
1077 stridedSliceDescriptor.m_EndMask,
1078 stridedSliceDescriptor.m_ShrinkAxisMask,
1079 stridedSliceDescriptor.m_EllipsisMask,
1080 stridedSliceDescriptor.m_NewAxisMask,
1081 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1082
1083 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1084 flatBufferBaseLayer,
1085 flatBufferDescriptor);
1086
1087 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1088}
1089
Conor Kennedyda1f9752019-03-01 14:37:12 +00001090void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1091{
1092 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1093 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1094
1095 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1096}
1097
Sadik Armaganeff363d2019-04-05 15:25:46 +01001098void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1099{
1100 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1101 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1102
1103 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1104}
1105
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001106void SerializerVisitor::VisitTransposeConvolution2dLayer(
1107 const armnn::IConnectableLayer* layer,
1108 const armnn::TransposeConvolution2dDescriptor& descriptor,
1109 const armnn::ConstTensor& weights,
1110 const armnn::Optional<armnn::ConstTensor>& biases,
1111 const char* name)
1112{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001113 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1114 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1115 descriptor.m_PadLeft,
1116 descriptor.m_PadRight,
1117 descriptor.m_PadTop,
1118 descriptor.m_PadBottom,
1119 descriptor.m_StrideX,
1120 descriptor.m_StrideY,
1121 descriptor.m_BiasEnabled,
1122 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1123
1124 // weights & biases
1125 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1126 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1127 if (biases.has_value())
1128 {
1129 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1130 }
1131
1132 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1133 fbBaseLayer,
1134 fbDescriptor,
1135 fbWeightsConstTensorInfo,
1136 fbBiasesConstTensorInfo);
1137
1138 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001139}
1140
James Conroyee18dc82019-07-17 11:27:46 +01001141void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1142 const armnn::QuantizedLstmInputParams& params,
1143 const char* name)
1144{
Jan Eilers5b01a892019-07-23 09:47:43 +01001145 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1146
1147 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001148 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1149 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1150 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1151 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001152
Francis Murtaghbb590b42019-08-14 09:51:36 +01001153 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1154 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1155 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1156 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001157
Francis Murtaghbb590b42019-08-14 09:51:36 +01001158 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1159 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1160 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1161 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001162
1163 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1164 m_flatBufferBuilder,
1165 inputToInputWeights,
1166 inputToForgetWeights,
1167 inputToCellWeights,
1168 inputToOutputWeights,
1169 recurrentToInputWeights,
1170 recurrentToForgetWeights,
1171 recurrentToCellWeights,
1172 recurrentToOutputWeights,
1173 inputGateBias,
1174 forgetGateBias,
1175 cellBias,
1176 outputGateBias);
1177
1178 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1179 m_flatBufferBuilder,
1180 fbQuantizedLstmBaseLayer,
1181 fbQuantizedLstmParams);
1182
1183 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001184}
1185
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001186fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001187 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001188{
Sadik Armagandb059fd2019-03-20 12:28:32 +00001189 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1190
Mike Kelly8c1701a2019-02-11 17:01:27 +00001191 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1192 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1193
1194 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001195 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001196 m_flatBufferBuilder.CreateString(layer->GetName()),
1197 layerType,
1198 m_flatBufferBuilder.CreateVector(inputSlots),
1199 m_flatBufferBuilder.CreateVector(outputSlots));
1200}
1201
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001202void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001203{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001204 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001205 m_serializedLayers.push_back(anyLayer);
1206}
1207
Mike Kellya0766c32019-02-19 17:22:07 +00001208template <typename T>
1209flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1210{
1211 const T* buffer = reinterpret_cast<const T*>(memory);
1212 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1213 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1214 return fbVector;
1215}
1216
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001217flatbuffers::Offset<serializer::ConstTensor>
1218 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001219{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001220 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001221
1222 // Get the dimensions
1223 std::vector<unsigned int> shape;
1224
1225 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1226 {
1227 shape.push_back(tensorInfo.GetShape()[dim]);
1228 }
1229
1230 // Create FlatBuffer TensorInfo
1231 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1232 m_flatBufferBuilder.CreateVector(shape),
1233 GetFlatBufferDataType(tensorInfo.GetDataType()),
1234 tensorInfo.GetQuantizationScale(),
1235 tensorInfo.GetQuantizationOffset());
1236 flatbuffers::Offset<void> fbPayload;
1237
1238 switch (tensorInfo.GetDataType())
1239 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001240 case armnn::DataType::Float32:
1241 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001242 {
1243 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1244 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1245 m_flatBufferBuilder,
1246 fbVector);
1247 fbPayload = flatBuffersData.o;
1248 break;
1249 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001250 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001251 {
1252 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1253 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1254 m_flatBufferBuilder,
1255 fbVector);
1256 fbPayload = flatBuffersData.o;
1257 break;
1258 }
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001259 case armnn::DataType::QuantisedSymm16:
1260 {
1261 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1262 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1263 m_flatBufferBuilder,
1264 fbVector);
1265 fbPayload = flatBuffersData.o;
1266 break;
1267 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001268 case armnn::DataType::QuantisedAsymm8:
1269 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001270 default:
1271 {
1272 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1273 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1274 m_flatBufferBuilder,
1275 fbVector);
1276 fbPayload = flatBuffersData.o;
1277 }
1278 }
1279 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1280 m_flatBufferBuilder,
1281 flatBufferTensorInfo,
1282 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1283 fbPayload);
1284 return flatBufferConstTensor;
1285}
1286
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001287std::vector<fb::Offset<serializer::InputSlot>>
1288 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001289{
Mike Kellya0766c32019-02-19 17:22:07 +00001290 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001291
1292 // Get the InputSlots
1293 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1294 {
1295 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1296
1297 // Get the Connection for the InputSlot
1298 const IOutputSlot* connection = inputSlot.GetConnection();
1299
1300 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001301 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1302 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001303 // Create FlatBuffer InputSlot
1304 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1305 }
1306 return inputSlots;
1307}
1308
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001309std::vector<fb::Offset<serializer::OutputSlot>>
1310 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001311{
1312 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1313
1314 // Get the OutputSlots
1315 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1316 {
1317 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001318 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001319
1320 // Get the dimensions
1321 std::vector<unsigned int> shape;
1322 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1323 {
1324 shape.push_back(tensorInfo.GetShape()[dim]);
1325 }
1326
1327 // Create FlatBuffer TensorInfo
1328 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1329 m_flatBufferBuilder.CreateVector(shape),
1330 GetFlatBufferDataType(tensorInfo.GetDataType()),
1331 tensorInfo.GetQuantizationScale(),
1332 tensorInfo.GetQuantizationOffset());
1333
1334 // Create FlatBuffer Outputslot
1335 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1336 slotIndex,
1337 flatBufferTensorInfo));
1338 }
1339 return outputSlots;
1340}
1341
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001342
1343ISerializer* ISerializer::CreateRaw()
1344{
1345 return new Serializer();
1346}
1347
1348ISerializerPtr ISerializer::Create()
1349{
1350 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1351}
1352
1353void ISerializer::Destroy(ISerializer* serializer)
1354{
1355 delete serializer;
1356}
1357
1358void Serializer::Serialize(const INetwork& inNetwork)
1359{
1360 // Iterate through to network
1361 inNetwork.Accept(m_SerializerVisitor);
1362 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1363
1364 // Create FlatBuffer SerializedGraph
1365 auto serializedGraph = serializer::CreateSerializedGraph(
1366 fbBuilder,
1367 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1368 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
1369 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
1370
1371 // Serialize the graph
1372 fbBuilder.Finish(serializedGraph);
1373}
1374
1375bool Serializer::SaveSerializedToStream(std::ostream& stream)
1376{
1377 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1378
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001379 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1380 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001381 return !stream.bad();
1382}
1383
Matteo Martincighec333912019-02-13 15:12:39 +00001384} // namespace armnnSerializer