From 1d67a6905daed13354e66f00549e12fea62170ed Mon Sep 17 00:00:00 2001 From: Aron Virginas-Tar Date: Mon, 19 Nov 2018 10:58:30 +0000 Subject: IVGCVSW-2167: Run parser unit tests on the reference backend only Change-Id: Ib11c3d36c7109198da7266955414580e8fb916b5 --- .../test/ParserFlatbuffersFixture.hpp | 122 +++++++++---------- src/armnnUtils/ParserPrototxtFixture.hpp | 134 +++++++++------------ 2 files changed, 112 insertions(+), 144 deletions(-) diff --git a/src/armnnTfLiteParser/test/ParserFlatbuffersFixture.hpp b/src/armnnTfLiteParser/test/ParserFlatbuffersFixture.hpp index 6247fc3153..676dc7120d 100644 --- a/src/armnnTfLiteParser/test/ParserFlatbuffersFixture.hpp +++ b/src/armnnTfLiteParser/test/ParserFlatbuffersFixture.hpp @@ -28,22 +28,17 @@ using TensorRawPtr = const tflite::TensorT *; struct ParserFlatbuffersFixture { - ParserFlatbuffersFixture() - : m_Parser(ITfLiteParser::Create()), m_NetworkIdentifier(-1) + ParserFlatbuffersFixture() : + m_Parser(ITfLiteParser::Create()), + m_Runtime(armnn::IRuntime::Create(armnn::IRuntime::CreationOptions())), + m_NetworkIdentifier(-1) { - armnn::IRuntime::CreationOptions options; - - const armnn::BackendIdSet availableBackendIds = armnn::BackendRegistryInstance().GetBackendIds(); - for (auto& backendId : availableBackendIds) - { - m_Runtimes.push_back(std::make_pair(armnn::IRuntime::Create(options), backendId)); - } } std::vector m_GraphBinary; std::string m_JsonString; std::unique_ptr m_Parser; - std::vector> m_Runtimes; + armnn::IRuntimePtr m_Runtime; armnn::NetworkId m_NetworkIdentifier; /// If the single-input-single-output overload of Setup() is called, these will store the input and output name @@ -58,35 +53,29 @@ struct ParserFlatbuffersFixture throw armnn::Exception("LoadNetwork failed while reading binary input"); } - for (auto&& runtime : m_Runtimes) + armnn::INetworkPtr network = + m_Parser->CreateNetworkFromBinary(m_GraphBinary); + + if (!network) { + throw armnn::Exception("The parser failed to create an ArmNN network"); + } + + auto optimized = Optimize(*network, { armnn::Compute::CpuRef }, + m_Runtime->GetDeviceSpec()); + std::string errorMessage; + + armnn::Status ret = m_Runtime->LoadNetwork(m_NetworkIdentifier, move(optimized), errorMessage); + + if (ret != armnn::Status::Success) { - armnn::INetworkPtr network = - m_Parser->CreateNetworkFromBinary(m_GraphBinary); - - if (!network) { - throw armnn::Exception("The parser failed to create an ArmNN network"); - } - - auto optimized = Optimize(*network, - { runtime.second, armnn::Compute::CpuRef }, - runtime.first->GetDeviceSpec()); - std::string errorMessage; - - armnn::Status ret = runtime.first->LoadNetwork(m_NetworkIdentifier, - move(optimized), - errorMessage); - - if (ret != armnn::Status::Success) - { - throw armnn::Exception( - boost::str( - boost::format("The runtime failed to load the network. " - "Error was: %1%. in %2% [%3%:%4%]") % - errorMessage % - __func__ % - __FILE__ % - __LINE__)); - } + throw armnn::Exception( + boost::str( + boost::format("The runtime failed to load the network. " + "Error was: %1%. in %2% [%3%:%4%]") % + errorMessage % + __func__ % + __FILE__ % + __LINE__)); } } @@ -190,39 +179,36 @@ ParserFlatbuffersFixture::RunTest(size_t subgraphId, const std::map>& inputData, const std::map>& expectedOutputData) { - for (auto&& runtime : m_Runtimes) - { - using BindingPointInfo = std::pair; + using BindingPointInfo = std::pair; - // Setup the armnn input tensors from the given vectors. - armnn::InputTensors inputTensors; - for (auto&& it : inputData) - { - BindingPointInfo bindingInfo = m_Parser->GetNetworkInputBindingInfo(subgraphId, it.first); - armnn::VerifyTensorInfoDataType(bindingInfo.second); - inputTensors.push_back({ bindingInfo.first, armnn::ConstTensor(bindingInfo.second, it.second.data()) }); - } + // Setup the armnn input tensors from the given vectors. + armnn::InputTensors inputTensors; + for (auto&& it : inputData) + { + BindingPointInfo bindingInfo = m_Parser->GetNetworkInputBindingInfo(subgraphId, it.first); + armnn::VerifyTensorInfoDataType(bindingInfo.second); + inputTensors.push_back({ bindingInfo.first, armnn::ConstTensor(bindingInfo.second, it.second.data()) }); + } - // Allocate storage for the output tensors to be written to and setup the armnn output tensors. - std::map> outputStorage; - armnn::OutputTensors outputTensors; - for (auto&& it : expectedOutputData) - { - BindingPointInfo bindingInfo = m_Parser->GetNetworkOutputBindingInfo(subgraphId, it.first); - armnn::VerifyTensorInfoDataType(bindingInfo.second); - outputStorage.emplace(it.first, MakeTensor(bindingInfo.second)); - outputTensors.push_back( - { bindingInfo.first, armnn::Tensor(bindingInfo.second, outputStorage.at(it.first).data()) }); - } + // Allocate storage for the output tensors to be written to and setup the armnn output tensors. + std::map> outputStorage; + armnn::OutputTensors outputTensors; + for (auto&& it : expectedOutputData) + { + BindingPointInfo bindingInfo = m_Parser->GetNetworkOutputBindingInfo(subgraphId, it.first); + armnn::VerifyTensorInfoDataType(bindingInfo.second); + outputStorage.emplace(it.first, MakeTensor(bindingInfo.second)); + outputTensors.push_back( + { bindingInfo.first, armnn::Tensor(bindingInfo.second, outputStorage.at(it.first).data()) }); + } - runtime.first->EnqueueWorkload(m_NetworkIdentifier, inputTensors, outputTensors); + m_Runtime->EnqueueWorkload(m_NetworkIdentifier, inputTensors, outputTensors); - // Compare each output tensor to the expected values - for (auto&& it : expectedOutputData) - { - BindingPointInfo bindingInfo = m_Parser->GetNetworkOutputBindingInfo(subgraphId, it.first); - auto outputExpected = MakeTensor(bindingInfo.second, it.second); - BOOST_TEST(CompareTensors(outputExpected, outputStorage[it.first])); - } + // Compare each output tensor to the expected values + for (auto&& it : expectedOutputData) + { + BindingPointInfo bindingInfo = m_Parser->GetNetworkOutputBindingInfo(subgraphId, it.first); + auto outputExpected = MakeTensor(bindingInfo.second, it.second); + BOOST_TEST(CompareTensors(outputExpected, outputStorage[it.first])); } } diff --git a/src/armnnUtils/ParserPrototxtFixture.hpp b/src/armnnUtils/ParserPrototxtFixture.hpp index b10590342e..669b1fd0ca 100644 --- a/src/armnnUtils/ParserPrototxtFixture.hpp +++ b/src/armnnUtils/ParserPrototxtFixture.hpp @@ -26,16 +26,9 @@ struct ParserPrototxtFixture { ParserPrototxtFixture() : m_Parser(TParser::Create()) + , m_Runtime(armnn::IRuntime::Create(armnn::IRuntime::CreationOptions())) , m_NetworkIdentifier(-1) { - armnn::IRuntime::CreationOptions options; - - // Create runtimes for each available backend - const armnn::BackendIdSet availableBackendIds = armnn::BackendRegistryInstance().GetBackendIds(); - for (auto& backendId : availableBackendIds) - { - m_Runtimes.push_back(std::make_pair(armnn::IRuntime::Create(options), backendId)); - } } /// Parses and loads the network defined by the m_Prototext string. @@ -62,7 +55,7 @@ struct ParserPrototxtFixture std::string m_Prototext; std::unique_ptr m_Parser; - std::vector> m_Runtimes; + armnn::IRuntimePtr m_Runtime; armnn::NetworkId m_NetworkIdentifier; /// If the single-input-single-output overload of Setup() is called, these will store the input and output name @@ -98,44 +91,36 @@ template void ParserPrototxtFixture::Setup(const std::map& inputShapes, const std::vector& requestedOutputs) { - for (auto&& runtime : m_Runtimes) + std::string errorMessage; + + armnn::INetworkPtr network = + m_Parser->CreateNetworkFromString(m_Prototext.c_str(), inputShapes, requestedOutputs); + auto optimized = Optimize(*network, { armnn::Compute::CpuRef }, m_Runtime->GetDeviceSpec()); + armnn::Status ret = m_Runtime->LoadNetwork(m_NetworkIdentifier, move(optimized), errorMessage); + if (ret != armnn::Status::Success) { - std::string errorMessage; - - armnn::INetworkPtr network = - m_Parser->CreateNetworkFromString(m_Prototext.c_str(), inputShapes, requestedOutputs); - auto optimized = Optimize(*network, - { runtime.second, armnn::Compute::CpuRef }, runtime.first->GetDeviceSpec()); - armnn::Status ret = runtime.first->LoadNetwork(m_NetworkIdentifier, move(optimized), errorMessage); - if (ret != armnn::Status::Success) - { - throw armnn::Exception(boost::str( - boost::format("LoadNetwork failed with error: '%1%' %2%") - % errorMessage - % CHECK_LOCATION().AsString())); - } + throw armnn::Exception(boost::str( + boost::format("LoadNetwork failed with error: '%1%' %2%") + % errorMessage + % CHECK_LOCATION().AsString())); } } template void ParserPrototxtFixture::Setup() { - for (auto&& runtime : m_Runtimes) + std::string errorMessage; + + armnn::INetworkPtr network = + m_Parser->CreateNetworkFromString(m_Prototext.c_str()); + auto optimized = Optimize(*network, { armnn::Compute::CpuRef }, m_Runtime->GetDeviceSpec()); + armnn::Status ret = m_Runtime->LoadNetwork(m_NetworkIdentifier, move(optimized), errorMessage); + if (ret != armnn::Status::Success) { - std::string errorMessage; - - armnn::INetworkPtr network = - m_Parser->CreateNetworkFromString(m_Prototext.c_str()); - auto optimized = Optimize(*network, - { runtime.second, armnn::Compute::CpuRef }, runtime.first->GetDeviceSpec()); - armnn::Status ret = runtime.first->LoadNetwork(m_NetworkIdentifier, move(optimized), errorMessage); - if (ret != armnn::Status::Success) - { - throw armnn::Exception(boost::str( - boost::format("LoadNetwork failed with error: '%1%' %2%") - % errorMessage - % CHECK_LOCATION().AsString())); - } + throw armnn::Exception(boost::str( + boost::format("LoadNetwork failed with error: '%1%' %2%") + % errorMessage + % CHECK_LOCATION().AsString())); } } @@ -152,49 +137,46 @@ template void ParserPrototxtFixture::RunTest(const std::map>& inputData, const std::map>& expectedOutputData) { - for (auto&& runtime : m_Runtimes) - { - using BindingPointInfo = std::pair; + using BindingPointInfo = std::pair; - // Sets up the armnn input tensors from the given vectors. - armnn::InputTensors inputTensors; - for (auto&& it : inputData) - { - BindingPointInfo bindingInfo = m_Parser->GetNetworkInputBindingInfo(it.first); - inputTensors.push_back({ bindingInfo.first, armnn::ConstTensor(bindingInfo.second, it.second.data()) }); - } + // Sets up the armnn input tensors from the given vectors. + armnn::InputTensors inputTensors; + for (auto&& it : inputData) + { + BindingPointInfo bindingInfo = m_Parser->GetNetworkInputBindingInfo(it.first); + inputTensors.push_back({ bindingInfo.first, armnn::ConstTensor(bindingInfo.second, it.second.data()) }); + } - // Allocates storage for the output tensors to be written to and sets up the armnn output tensors. - std::map> outputStorage; - armnn::OutputTensors outputTensors; - for (auto&& it : expectedOutputData) - { - BindingPointInfo bindingInfo = m_Parser->GetNetworkOutputBindingInfo(it.first); - outputStorage.emplace(it.first, MakeTensor(bindingInfo.second)); - outputTensors.push_back( - { bindingInfo.first, armnn::Tensor(bindingInfo.second, outputStorage.at(it.first).data()) }); - } + // Allocates storage for the output tensors to be written to and sets up the armnn output tensors. + std::map> outputStorage; + armnn::OutputTensors outputTensors; + for (auto&& it : expectedOutputData) + { + BindingPointInfo bindingInfo = m_Parser->GetNetworkOutputBindingInfo(it.first); + outputStorage.emplace(it.first, MakeTensor(bindingInfo.second)); + outputTensors.push_back( + { bindingInfo.first, armnn::Tensor(bindingInfo.second, outputStorage.at(it.first).data()) }); + } - runtime.first->EnqueueWorkload(m_NetworkIdentifier, inputTensors, outputTensors); + m_Runtime->EnqueueWorkload(m_NetworkIdentifier, inputTensors, outputTensors); - // Compares each output tensor to the expected values. - for (auto&& it : expectedOutputData) + // Compares each output tensor to the expected values. + for (auto&& it : expectedOutputData) + { + BindingPointInfo bindingInfo = m_Parser->GetNetworkOutputBindingInfo(it.first); + if (bindingInfo.second.GetNumElements() != it.second.size()) { - BindingPointInfo bindingInfo = m_Parser->GetNetworkOutputBindingInfo(it.first); - if (bindingInfo.second.GetNumElements() != it.second.size()) - { - throw armnn::Exception( - boost::str( - boost::format("Output tensor %1% is expected to have %2% elements. " - "%3% elements supplied. %4%") % - it.first % - bindingInfo.second.GetNumElements() % - it.second.size() % - CHECK_LOCATION().AsString())); - } - auto outputExpected = MakeTensor(bindingInfo.second, it.second); - BOOST_TEST(CompareTensors(outputExpected, outputStorage[it.first])); + throw armnn::Exception( + boost::str( + boost::format("Output tensor %1% is expected to have %2% elements. " + "%3% elements supplied. %4%") % + it.first % + bindingInfo.second.GetNumElements() % + it.second.size() % + CHECK_LOCATION().AsString())); } + auto outputExpected = MakeTensor(bindingInfo.second, it.second); + BOOST_TEST(CompareTensors(outputExpected, outputStorage[it.first])); } } -- cgit v1.2.1