aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTee Jung <tee.ty.jung@openedges.com>2019-11-05 10:48:25 +0000
committerDerek Lamberti <derek.lamberti@arm.com>2020-02-04 13:50:36 +0000
commitaa920c56838c2a0b31bd4e3c54bd57ff2f20969e (patch)
treed029c5685fd3a622fd94c2e9707821aa0b47ca06
parent9a61fa6bdc8724cc66eba532360e0e48b6b1a60e (diff)
downloadarmnn-experimental/QuantizerStuff.tar.gz
Build graph->inputIds/outputIds with layerBindingId instead of layerIndexexperimental/QuantizerStuff
Signed-off-by: Jung Tae-young tee.ty.jung@openedges.com Signed-off-by: Matteo Martincigh <matteo.martincigh@arm.com> Change-Id: I25ceeca70e72fad88ab039aed5a5ab6a7cc08c6c Signed-off-by: Derek Lamberti <derek.lamberti@arm.com>
-rw-r--r--src/armnnDeserializer/Deserializer.cpp74
-rw-r--r--src/armnnDeserializer/Deserializer.hpp12
-rw-r--r--src/armnnSerializer/ArmnnSchema.fbs9
-rw-r--r--src/armnnSerializer/Serializer.cpp21
-rw-r--r--src/armnnSerializer/Serializer.hpp15
5 files changed, 114 insertions, 17 deletions
diff --git a/src/armnnDeserializer/Deserializer.cpp b/src/armnnDeserializer/Deserializer.cpp
index 99ee0b5b2d..3bbd71a972 100644
--- a/src/armnnDeserializer/Deserializer.cpp
+++ b/src/armnnDeserializer/Deserializer.cpp
@@ -768,6 +768,40 @@ BindingPointInfo Deserializer::GetNetworkOutputBindingInfo(unsigned int layerInd
CHECK_LOCATION().AsString()));
}
+unsigned int Deserializer::GetInputLayerInVector(GraphPtr graph, int targetId)
+{
+ for (unsigned int i = 0; i < graph->layers()->size(); i++)
+ {
+ auto layer = graph->layers()->Get(i);
+ if (layer->layer_type() == Layer::Layer_InputLayer)
+ {
+ auto layerBindingId = layer->layer_as_InputLayer()->base()->layerBindingId();
+ if (layerBindingId == targetId)
+ {
+ return i;
+ }
+ }
+ }
+ throw ParseException("Input layer with given layerBindingId not found");
+}
+
+unsigned int Deserializer::GetOutputLayerInVector(GraphPtr graph, int targetId)
+{
+ for (unsigned int i = 0; i < graph->layers()->size(); i++)
+ {
+ auto layer = graph->layers()->Get(i);
+ if (layer->layer_type() == Layer::Layer_OutputLayer)
+ {
+ auto layerBindingId = layer->layer_as_OutputLayer()->base()->layerBindingId();
+ if (layerBindingId == targetId)
+ {
+ return i;
+ }
+ }
+ }
+ throw ParseException("Output layer with given layerBindingId not found");
+}
+
unsigned int Deserializer::GetLayerIndexInVector(GraphPtr graph, unsigned int targetIndex)
{
for (unsigned int i = 0; i < graph->layers()->size(); i++)
@@ -781,6 +815,18 @@ unsigned int Deserializer::GetLayerIndexInVector(GraphPtr graph, unsigned int ta
throw ParseException("Layer with given index not found");
}
+Deserializer::FeatureVersions Deserializer::GetFeatureVersions(GraphPtr graph)
+{
+ Deserializer::FeatureVersions versions;
+
+ if (graph->featureVersions())
+ {
+ versions.m_BindingIdScheme = graph->featureVersions()->bindingIdsScheme();
+ }
+
+ return versions;
+}
+
void Deserializer::SetupInputLayers(GraphPtr graph)
{
CHECK_GRAPH(graph, 0);
@@ -790,8 +836,18 @@ void Deserializer::SetupInputLayers(GraphPtr graph)
for (unsigned int i = 0; i < numInputs; i++)
{
- const unsigned int inputId = graph->inputIds()->Get(i);
- const unsigned int inputLayerIndex = GetLayerIndexInVector(graph, inputId);
+ unsigned int inputLayerIndex = 0xFFFFFFFF;
+ if (GetFeatureVersions(graph).m_BindingIdScheme == 0)
+ {
+ const unsigned int inputId = boost::numeric_cast<unsigned int>(graph->inputIds()->Get(i));
+ inputLayerIndex = GetLayerIndexInVector(graph, inputId);
+ }
+ else
+ {
+ const int inputId = graph->inputIds()->Get(i);
+ inputLayerIndex = GetInputLayerInVector(graph, inputId);
+ }
+
LayerBaseRawPtr baseLayer = GetBaseLayer(graph, inputLayerIndex);
// GetBindingLayerInfo expect the index to be index in the vector not index property on each layer base
@@ -819,8 +875,18 @@ void Deserializer::SetupOutputLayers(GraphPtr graph)
for (unsigned int i = 0; i < numOutputs; i++)
{
- const unsigned int outputId = graph->outputIds()->Get(i);
- const unsigned int outputLayerIndex = GetLayerIndexInVector(graph, outputId);
+ unsigned int outputLayerIndex = 0xFFFFFFFF;
+ if (GetFeatureVersions(graph).m_BindingIdScheme == 0)
+ {
+ const unsigned int outputId = boost::numeric_cast<unsigned int>(graph->outputIds()->Get(i));
+ outputLayerIndex = GetLayerIndexInVector(graph, outputId);
+ }
+ else
+ {
+ const int outputId = graph->outputIds()->Get(i);
+ outputLayerIndex = GetOutputLayerInVector(graph, outputId);
+ }
+
LayerBaseRawPtr baseLayer = GetBaseLayer(graph, outputLayerIndex);
// GetBindingLayerInfo expect the index to be index in the vector not index property on each layer base
diff --git a/src/armnnDeserializer/Deserializer.hpp b/src/armnnDeserializer/Deserializer.hpp
index ae8be6e932..8e8fe1aca8 100644
--- a/src/armnnDeserializer/Deserializer.hpp
+++ b/src/armnnDeserializer/Deserializer.hpp
@@ -144,9 +144,21 @@ private:
void SetupInputLayers(GraphPtr graphPtr);
void SetupOutputLayers(GraphPtr graphPtr);
+ /// Helper to get the index of the layer in the flatbuffer vector from its bindingId property
+ unsigned int GetInputLayerInVector(GraphPtr graph, int targetId);
+ unsigned int GetOutputLayerInVector(GraphPtr graph, int targetId);
+
/// Helper to get the index of the layer in the flatbuffer vector from its index property
unsigned int GetLayerIndexInVector(GraphPtr graph, unsigned int index);
+ struct FeatureVersions
+ {
+ // Default values to zero for backward compatibility
+ unsigned int m_BindingIdScheme = 0;
+ };
+
+ FeatureVersions GetFeatureVersions(GraphPtr graph);
+
/// The network we're building. Gets cleared after it is passed to the user
armnn::INetworkPtr m_Network;
std::vector<LayerParsingFunction> m_ParserFunctions;
diff --git a/src/armnnSerializer/ArmnnSchema.fbs b/src/armnnSerializer/ArmnnSchema.fbs
index 0f8a816093..be6616d1e9 100644
--- a/src/armnnSerializer/ArmnnSchema.fbs
+++ b/src/armnnSerializer/ArmnnSchema.fbs
@@ -826,11 +826,16 @@ table AnyLayer {
layer:Layer;
}
+table FeatureCompatibilityVersions {
+ bindingIdsScheme:uint = 0;
+}
+
// Root type for serialized data is the graph of the network
table SerializedGraph {
layers:[AnyLayer];
- inputIds:[uint];
- outputIds:[uint];
+ inputIds:[int];
+ outputIds:[int];
+ featureVersions:FeatureCompatibilityVersions;
}
root_type SerializedGraph;
diff --git a/src/armnnSerializer/Serializer.cpp b/src/armnnSerializer/Serializer.cpp
index 13ea0f04a9..b43f26c652 100644
--- a/src/armnnSerializer/Serializer.cpp
+++ b/src/armnnSerializer/Serializer.cpp
@@ -91,8 +91,8 @@ void SerializerVisitor::VisitInputLayer(const armnn::IConnectableLayer* layer, L
auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
flatBufferInputBaseLayer,
id);
- // Push layer index to outputIds.
- m_inputIds.push_back(GetSerializedId(layer->GetGuid()));
+ // Push layer binding id to outputIds.
+ m_inputIds.push_back(id);
// Create the FlatBuffer InputLayer
auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
@@ -113,8 +113,8 @@ void SerializerVisitor::VisitOutputLayer(const armnn::IConnectableLayer* layer,
auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
flatBufferOutputBaseLayer,
id);
- // Push layer index to outputIds.
- m_outputIds.push_back(GetSerializedId(layer->GetGuid()));
+ // Push layer binding id to outputIds.
+ m_outputIds.push_back(id);
// Create the FlatBuffer OutputLayer
auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
@@ -1449,6 +1449,16 @@ flatbuffers::Offset<serializer::ConstTensor>
return flatBufferConstTensor;
}
+flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerVisitor::GetVersionTable()
+{
+ flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
+ serializer::CreateFeatureCompatibilityVersions(
+ m_flatBufferBuilder,
+ 1 // Binding ids scheme version
+ );
+ return versionsTable;
+}
+
std::vector<fb::Offset<serializer::InputSlot>>
SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
{
@@ -1531,7 +1541,8 @@ void Serializer::Serialize(const INetwork& inNetwork)
fbBuilder,
fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
- fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
+ fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()),
+ m_SerializerVisitor.GetVersionTable());
// Serialize the graph
fbBuilder.Finish(serializedGraph);
diff --git a/src/armnnSerializer/Serializer.hpp b/src/armnnSerializer/Serializer.hpp
index d92c93d46c..14d2776147 100644
--- a/src/armnnSerializer/Serializer.hpp
+++ b/src/armnnSerializer/Serializer.hpp
@@ -29,12 +29,12 @@ public:
return m_flatBufferBuilder;
}
- std::vector<uint32_t>& GetInputIds()
+ std::vector<int>& GetInputIds()
{
return m_inputIds;
}
- std::vector<uint32_t>& GetOutputIds()
+ std::vector<int>& GetOutputIds()
{
return m_outputIds;
}
@@ -44,6 +44,9 @@ public:
return m_serializedLayers;
}
+ flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> GetVersionTable();
+
+
ARMNN_DEPRECATED_MSG("Use VisitElementwiseUnaryLayer instead")
void VisitAbsLayer(const armnn::IConnectableLayer* layer,
const char* name = nullptr) override;
@@ -301,11 +304,11 @@ private:
/// AnyLayers required by the SerializedGraph.
std::vector<flatbuffers::Offset<armnnSerializer::AnyLayer>> m_serializedLayers;
- /// Vector of indexes of all Input Layers required by the SerializedGraph.
- std::vector<uint32_t> m_inputIds;
+ /// Vector of the binding ids of all Input Layers required by the SerializedGraph.
+ std::vector<int> m_inputIds;
- /// Vector of indexes of all Output Layers required by the SerializedGraph.
- std::vector<uint32_t> m_outputIds;
+ /// Vector of the binding ids of all Output Layers required by the SerializedGraph.
+ std::vector<int> m_outputIds;
/// Mapped Guids of all Layers to match our index.
std::unordered_map<armnn::LayerGuid, uint32_t > m_guidMap;