From 238ecd9279f08a1b05189e03ffa73a9201b1c0ce Mon Sep 17 00:00:00 2001 From: Ryan OShea Date: Tue, 7 Mar 2023 11:44:23 +0000 Subject: IVGCVSW-7526 Upgrade ArmNN to Tensorflow 2.12 When creating a flatbuffers model, we need to provide an empty buffer 0 that is reserved by tensorflow. When creating empty buffers for inputs and outputs we can not pass in an empty vector, or tflite will assume that we know how many bytes to allocate in advance. Instead we need to only pass in the builder. * Update libraries in FindTfLite.cmake * Add nullptr to delegate struct for OpaqueDelegateBuilder * Fix issue in unit tests where Flatbuffers model was not being parsed by tflite * Tensorflow 2.12 now includes C++ 17 features. Update our cmake build to require a compiler to support these features. * Change minimum cmake in Arm NN to 3.7 as that's the minimum for the delegate build. Signed-off-by: Ryan OShea Signed-off-by: Narumol Prangnawarat Signed-off-by: Colm Donelan Change-Id: I7d15b196b8c59b1914f8fc1c4c2f8960630c069c --- delegate/src/test/TransposeTestHelper.hpp | 65 ++++++++++++++++--------------- 1 file changed, 34 insertions(+), 31 deletions(-) (limited to 'delegate/src/test/TransposeTestHelper.hpp') diff --git a/delegate/src/test/TransposeTestHelper.hpp b/delegate/src/test/TransposeTestHelper.hpp index 1d55273b9f..4479c486cb 100644 --- a/delegate/src/test/TransposeTestHelper.hpp +++ b/delegate/src/test/TransposeTestHelper.hpp @@ -1,5 +1,5 @@ // -// Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +// Copyright © 2020, 2023 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // @@ -26,53 +26,56 @@ std::vector CreateTransposeTfLiteModel(tflite::TensorType tensorType, { using namespace tflite; flatbuffers::FlatBufferBuilder flatBufferBuilder; - std::array, 2> buffers; - buffers[0] = CreateBuffer(flatBufferBuilder, flatBufferBuilder.CreateVector({})); - buffers[1] = CreateBuffer(flatBufferBuilder, - flatBufferBuilder.CreateVector(reinterpret_cast(inputPermVec.data()), - sizeof(int32_t) * inputPermVec.size())); + flatbuffers::Offset buffers[4]{ + CreateBuffer(flatBufferBuilder), + CreateBuffer(flatBufferBuilder), + CreateBuffer(flatBufferBuilder, + flatBufferBuilder.CreateVector(reinterpret_cast(inputPermVec.data()), + sizeof(int32_t) * inputPermVec.size())), + CreateBuffer(flatBufferBuilder) + }; std::array, 3> tensors; tensors[0] = CreateTensor(flatBufferBuilder, flatBufferBuilder.CreateVector(input0TensorShape.data(), input0TensorShape.size()), - tensorType, 0); + tensorType, 1); tensors[1] = CreateTensor(flatBufferBuilder, flatBufferBuilder.CreateVector(inputPermVecShape.data(), inputPermVecShape.size()), - tflite::TensorType_INT32, 1, + tflite::TensorType_INT32, 2, flatBufferBuilder.CreateString("permutation_vector")); tensors[2] = CreateTensor(flatBufferBuilder, flatBufferBuilder.CreateVector(outputTensorShape.data(), outputTensorShape.size()), - tensorType); + tensorType,3); const std::vector operatorInputs{0, 1}; const std::vector operatorOutputs{2}; flatbuffers::Offset transposeOperator = - CreateOperator(flatBufferBuilder, - 0, - flatBufferBuilder.CreateVector(operatorInputs.data(), operatorInputs.size()), - flatBufferBuilder.CreateVector(operatorOutputs.data(), operatorOutputs.size()), - BuiltinOptions_TransposeOptions, - CreateTransposeOptions(flatBufferBuilder).Union()); + CreateOperator(flatBufferBuilder, + 0, + flatBufferBuilder.CreateVector(operatorInputs.data(), operatorInputs.size()), + flatBufferBuilder.CreateVector(operatorOutputs.data(), operatorOutputs.size()), + BuiltinOptions_TransposeOptions, + CreateTransposeOptions(flatBufferBuilder).Union()); const std::vector subgraphInputs{0, 1}; const std::vector subgraphOutputs{2}; flatbuffers::Offset subgraph = - CreateSubGraph(flatBufferBuilder, - flatBufferBuilder.CreateVector(tensors.data(), tensors.size()), - flatBufferBuilder.CreateVector(subgraphInputs.data(), subgraphInputs.size()), - flatBufferBuilder.CreateVector(subgraphOutputs.data(), subgraphOutputs.size()), - flatBufferBuilder.CreateVector(&transposeOperator, 1)); + CreateSubGraph(flatBufferBuilder, + flatBufferBuilder.CreateVector(tensors.data(), tensors.size()), + flatBufferBuilder.CreateVector(subgraphInputs.data(), subgraphInputs.size()), + flatBufferBuilder.CreateVector(subgraphOutputs.data(), subgraphOutputs.size()), + flatBufferBuilder.CreateVector(&transposeOperator, 1)); flatbuffers::Offset modelDescription = - flatBufferBuilder.CreateString("ArmnnDelegate: Transpose Operator Model"); + flatBufferBuilder.CreateString("ArmnnDelegate: Transpose Operator Model"); flatbuffers::Offset operatorCode = CreateOperatorCode(flatBufferBuilder, tflite::BuiltinOperator_TRANSPOSE); flatbuffers::Offset flatbufferModel = - CreateModel(flatBufferBuilder, - TFLITE_SCHEMA_VERSION, - flatBufferBuilder.CreateVector(&operatorCode, 1), - flatBufferBuilder.CreateVector(&subgraph, 1), - modelDescription, - flatBufferBuilder.CreateVector(buffers.data(), buffers.size())); + CreateModel(flatBufferBuilder, + TFLITE_SCHEMA_VERSION, + flatBufferBuilder.CreateVector(&operatorCode, 1), + flatBufferBuilder.CreateVector(&subgraph, 1), + modelDescription, + flatBufferBuilder.CreateVector(buffers, 4)); flatBufferBuilder.Finish(flatbufferModel); return std::vector(flatBufferBuilder.GetBufferPointer(), flatBufferBuilder.GetBufferPointer() + flatBufferBuilder.GetSize()); @@ -104,21 +107,21 @@ void TransposeFP32Test(std::vector& backends) // Create TfLite Interpreters std::unique_ptr armnnDelegateInterpreter; CHECK(InterpreterBuilder(tfLiteModel, ::tflite::ops::builtin::BuiltinOpResolver()) - (&armnnDelegateInterpreter) == kTfLiteOk); + (&armnnDelegateInterpreter) == kTfLiteOk); CHECK(armnnDelegateInterpreter != nullptr); CHECK(armnnDelegateInterpreter->AllocateTensors() == kTfLiteOk); std::unique_ptr tfLiteInterpreter; CHECK(InterpreterBuilder(tfLiteModel, ::tflite::ops::builtin::BuiltinOpResolver()) - (&tfLiteInterpreter) == kTfLiteOk); + (&tfLiteInterpreter) == kTfLiteOk); CHECK(tfLiteInterpreter != nullptr); CHECK(tfLiteInterpreter->AllocateTensors() == kTfLiteOk); // Create the ArmNN Delegate armnnDelegate::DelegateOptions delegateOptions(backends); std::unique_ptr - theArmnnDelegate(armnnDelegate::TfLiteArmnnDelegateCreate(delegateOptions), - armnnDelegate::TfLiteArmnnDelegateDelete); + theArmnnDelegate(armnnDelegate::TfLiteArmnnDelegateCreate(delegateOptions), + armnnDelegate::TfLiteArmnnDelegateDelete); CHECK(theArmnnDelegate != nullptr); // Modify armnnDelegateInterpreter to use armnnDelegate CHECK(armnnDelegateInterpreter->ModifyGraphWithDelegate(theArmnnDelegate.get()) == kTfLiteOk); -- cgit v1.2.1