From 70104000ddcf3bc1a1d21f16d1468456ca17b80a Mon Sep 17 00:00:00 2001 From: Aron Virginas-Tar Date: Wed, 24 Oct 2018 15:33:28 +0100 Subject: IVGCVSW-2073: Move remaining backend-specific tests from armnn to backends Change-Id: I45fd5b6dd32c435b78a54dc377a623e60978ce13 --- src/armnn/test/EndToEndTest.cpp | 380 +--------------------------------------- 1 file changed, 4 insertions(+), 376 deletions(-) (limited to 'src/armnn/test/EndToEndTest.cpp') diff --git a/src/armnn/test/EndToEndTest.cpp b/src/armnn/test/EndToEndTest.cpp index d34bf69548..4f202f174e 100644 --- a/src/armnn/test/EndToEndTest.cpp +++ b/src/armnn/test/EndToEndTest.cpp @@ -2,14 +2,15 @@ // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // -#include #include #include #include #include + #include +#include #include @@ -17,12 +18,14 @@ BOOST_AUTO_TEST_SUITE(EndToEnd) namespace { + template bool IsFloatIterFunc(T iter) { boost::ignore_unused(iter); return IsFloatingPointIterator::value; } + } //namespace BOOST_AUTO_TEST_CASE(QuantizedHelper) @@ -44,381 +47,6 @@ BOOST_AUTO_TEST_CASE(QuantizedHelper) BOOST_TEST(IsFloatIterFunc(&ints[0]) == false); } -BOOST_AUTO_TEST_CASE(Unsigned8) -{ - using namespace armnn; - - // Create runtime in which test will run - armnn::IRuntime::CreationOptions options; - armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options)); - - // Builds up the structure of the network. - armnn::INetworkPtr net(INetwork::Create()); - - IConnectableLayer* input = net->AddInputLayer(0, "input"); - IConnectableLayer* softmax = net->AddSoftmaxLayer(SoftmaxDescriptor(), "softmax"); - IConnectableLayer* output = net->AddOutputLayer(0, "output"); - - input->GetOutputSlot(0).Connect(softmax->GetInputSlot(0)); - softmax->GetOutputSlot(0).Connect(output->GetInputSlot(0)); - - // Sets the tensors in the network. - TensorInfo inputTensorInfo(TensorShape({1, 5}), DataType::QuantisedAsymm8); - inputTensorInfo.SetQuantizationOffset(100); - inputTensorInfo.SetQuantizationScale(10000.0f); - input->GetOutputSlot(0).SetTensorInfo(inputTensorInfo); - - TensorInfo outputTensorInfo(TensorShape({1, 5}), DataType::QuantisedAsymm8); - outputTensorInfo.SetQuantizationOffset(0); - outputTensorInfo.SetQuantizationScale(1.0f/255.0f); - softmax->GetOutputSlot(0).SetTensorInfo(outputTensorInfo); - - // optimize the network - std::vector backends = {armnn::Compute::CpuRef}; - IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec()); - - // Loads it into the runtime. - NetworkId netId; - auto error = runtime->LoadNetwork(netId, std::move(optNet)); - BOOST_TEST(error == Status::Success); - - // Creates structures for input & output. - std::vector inputData - { - 1, 10, 3, 200, 5 // Some inputs - one of which is sufficiently larger than the others to saturate softmax. - }; - std::vector outputData(5); - - armnn::InputTensors inputTensors - { - {0, armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), inputData.data())} - }; - armnn::OutputTensors outputTensors - { - {0, armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), outputData.data())} - }; - - // Does the inference. - runtime->EnqueueWorkload(netId, inputTensors, outputTensors); - - // Checks the results. - BOOST_TEST(outputData[0] == 0); - BOOST_TEST(outputData[1] == 0); - BOOST_TEST(outputData[2] == 0); - BOOST_TEST(outputData[3] == 255); // softmax has been saturated. - BOOST_TEST(outputData[4] == 0); -} - -template -void ConstantUsageTest(const std::vector& computeDevice, - const armnn::TensorInfo& commonTensorInfo, - const std::vector& inputData, - const std::vector& constantData, - const std::vector& expectedOutputData) -{ - using namespace armnn; - - // Create runtime in which test will run - armnn::IRuntime::CreationOptions options; - armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options)); - - // Builds up the structure of the network. - INetworkPtr net(INetwork::Create()); - - IConnectableLayer* input = net->AddInputLayer(0); - IConnectableLayer* constant = net->AddConstantLayer(ConstTensor(commonTensorInfo, constantData)); - IConnectableLayer* add = net->AddAdditionLayer(); - IConnectableLayer* output = net->AddOutputLayer(0); - - input->GetOutputSlot(0).Connect(add->GetInputSlot(0)); - constant->GetOutputSlot(0).Connect(add->GetInputSlot(1)); - add->GetOutputSlot(0).Connect(output->GetInputSlot(0)); - - // Sets the tensors in the network. - input->GetOutputSlot(0).SetTensorInfo(commonTensorInfo); - constant->GetOutputSlot(0).SetTensorInfo(commonTensorInfo); - add->GetOutputSlot(0).SetTensorInfo(commonTensorInfo); - - // optimize the network - IOptimizedNetworkPtr optNet = Optimize(*net, computeDevice, runtime->GetDeviceSpec()); - - // Loads it into the runtime. - NetworkId netId; - runtime->LoadNetwork(netId, std::move(optNet)); - - // Creates structures for input & output. - std::vector outputData(inputData.size()); - - InputTensors inputTensors - { - {0, armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), inputData.data())} - }; - OutputTensors outputTensors - { - {0, armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), outputData.data())} - }; - - // Does the inference. - runtime->EnqueueWorkload(netId, inputTensors, outputTensors); - - // Checks the results. - BOOST_TEST(outputData == expectedOutputData); -} - -static void ConstantUsageFloat32Test(const std::vector& computeDevice) -{ - const armnn::TensorInfo commonTensorInfo({ 2, 3 }, armnn::DataType::Float32); - - ConstantUsageTest(computeDevice, - commonTensorInfo, - std::vector{ 1.f, 2.f, 3.f, 4.f, 5.f, 6.f }, // Input. - std::vector{ 6.f, 5.f, 4.f, 3.f, 2.f, 1.f }, // Const input. - std::vector{ 7.f, 7.f, 7.f, 7.f, 7.f, 7.f } // Expected output. - ); -} - -static void ConstantUsageUint8Test(const std::vector& computeDevice) -{ - armnn::TensorInfo commonTensorInfo({ 2, 3 }, armnn::DataType::QuantisedAsymm8); - - const float scale = 0.023529f; - const int8_t offset = -43; - - commonTensorInfo.SetQuantizationScale(scale); - commonTensorInfo.SetQuantizationOffset(offset); - - ConstantUsageTest(computeDevice, - commonTensorInfo, - QuantizedVector(scale, offset, { 1.f, 2.f, 3.f, 4.f, 5.f, 6.f }), // Input. - QuantizedVector(scale, offset, { 6.f, 5.f, 4.f, 3.f, 2.f, 1.f }), // Const input. - QuantizedVector(scale, offset, { 7.f, 7.f, 7.f, 7.f, 7.f, 7.f }) // Expected output. - ); -} - -BOOST_AUTO_TEST_CASE(ConstantUsage_Ref_Float32) -{ - std::vector backends = {armnn::Compute::CpuRef}; - ConstantUsageFloat32Test(backends); -} - -#if ARMCOMPUTENEON_ENABLED -BOOST_AUTO_TEST_CASE(ConstantUsage_Neon_Float32) -{ - ConstantUsageFloat32Test({armnn::Compute::CpuAcc}); -} -#endif - -#if ARMCOMPUTECL_ENABLED -BOOST_AUTO_TEST_CASE(ConstantUsage_Cl_Float32) -{ - ConstantUsageFloat32Test({armnn::Compute::GpuAcc}); -} -#endif - -BOOST_AUTO_TEST_CASE(ConstantUsage_Ref_Uint8) -{ - std::vector backends = {armnn::Compute::CpuRef}; - ConstantUsageUint8Test(backends); -} - -BOOST_AUTO_TEST_CASE(TrivialAdd) -{ - // This test was designed to match "AddTwo" in android nn/runtime/test/TestTrivialModel.cpp. - - using namespace armnn; - - // Create runtime in which test will run - armnn::IRuntime::CreationOptions options; - armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options)); - - // Builds up the structure of the network. - armnn::INetworkPtr net(INetwork::Create()); - - IConnectableLayer* input1 = net->AddInputLayer(0); - IConnectableLayer* input2 = net->AddInputLayer(1); - IConnectableLayer* add = net->AddAdditionLayer(); - IConnectableLayer* output = net->AddOutputLayer(0); - - input1->GetOutputSlot(0).Connect(add->GetInputSlot(0)); - input2->GetOutputSlot(0).Connect(add->GetInputSlot(1)); - add->GetOutputSlot(0).Connect(output->GetInputSlot(0)); - - // Sets the tensors in the network. - TensorInfo tensorInfo(TensorShape({3, 4}), DataType::Float32); - input1->GetOutputSlot(0).SetTensorInfo(tensorInfo); - input2->GetOutputSlot(0).SetTensorInfo(tensorInfo); - add->GetOutputSlot(0).SetTensorInfo(tensorInfo); - - // optimize the network - std::vector backends = {armnn::Compute::CpuRef}; - IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec()); - - // Loads it into the runtime. - NetworkId netId; - runtime->LoadNetwork(netId, std::move(optNet)); - - // Creates structures for input & output - matching android nn test. - std::vector input1Data - { - 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f, 10.f, 11.f, 12.f - }; - std::vector input2Data - { - 100.f, 200.f, 300.f, 400.f, 500.f, 600.f, 700.f, 800.f, 900.f, 1000.f, 1100.f, 1200.f - }; - std::vector outputData(12); - - InputTensors inputTensors - { - {0,armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), input1Data.data())}, - {1,armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), input2Data.data())} - }; - OutputTensors outputTensors - { - {0,armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), outputData.data())} - }; - - // Does the inference. - runtime->EnqueueWorkload(netId, inputTensors, outputTensors); - - // Checks the results - BOOST_TEST(outputData[0] == 101); - BOOST_TEST(outputData[1] == 202); - BOOST_TEST(outputData[2] == 303); - BOOST_TEST(outputData[3] == 404); - BOOST_TEST(outputData[4] == 505); - BOOST_TEST(outputData[5] == 606); - BOOST_TEST(outputData[6] == 707); - BOOST_TEST(outputData[7] == 808); - BOOST_TEST(outputData[8] == 909); - BOOST_TEST(outputData[9] == 1010); - BOOST_TEST(outputData[10] == 1111); - BOOST_TEST(outputData[11] == 1212); -} - -BOOST_AUTO_TEST_CASE(MultipleOutputs) -{ - using namespace armnn; - - // Create runtime in which test will run - armnn::IRuntime::CreationOptions options; - armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options)); - - // Builds up the structure of the network. - INetworkPtr net(INetwork::Create()); - - IConnectableLayer* input = net->AddInputLayer(0); - - // ReLu1 - ActivationDescriptor activation1Descriptor; - activation1Descriptor.m_Function = ActivationFunction::BoundedReLu; - activation1Descriptor.m_A = 1.f; - activation1Descriptor.m_B = -1.f; - IConnectableLayer* activation1 = net->AddActivationLayer(activation1Descriptor); - - // ReLu6 - ActivationDescriptor activation2Descriptor; - activation2Descriptor.m_Function = ActivationFunction::BoundedReLu; - activation2Descriptor.m_A = 6.0f; - IConnectableLayer* activation2 = net->AddActivationLayer(activation2Descriptor); - - // BoundedReLu(min=2, max=5) - ActivationDescriptor activation3Descriptor; - activation3Descriptor.m_Function = ActivationFunction::BoundedReLu; - activation3Descriptor.m_A = 5.0f; - activation3Descriptor.m_B = 2.0f; - IConnectableLayer* activation3 = net->AddActivationLayer(activation3Descriptor); - - IConnectableLayer* output1 = net->AddOutputLayer(0); - IConnectableLayer* output2 = net->AddOutputLayer(1); - IConnectableLayer* output3 = net->AddOutputLayer(2); - - input->GetOutputSlot(0).Connect(activation1->GetInputSlot(0)); - input->GetOutputSlot(0).Connect(activation2->GetInputSlot(0)); - input->GetOutputSlot(0).Connect(activation3->GetInputSlot(0)); - - activation1->GetOutputSlot(0).Connect(output1->GetInputSlot(0)); - activation2->GetOutputSlot(0).Connect(output2->GetInputSlot(0)); - activation3->GetOutputSlot(0).Connect(output3->GetInputSlot(0)); - - // Sets the tensors in the network. - TensorInfo tensorInfo(TensorShape({ 10 }), DataType::Float32); - input->GetOutputSlot(0).SetTensorInfo(tensorInfo); - activation1->GetOutputSlot(0).SetTensorInfo(tensorInfo); - activation2->GetOutputSlot(0).SetTensorInfo(tensorInfo); - activation3->GetOutputSlot(0).SetTensorInfo(tensorInfo); - - // optimize the network - std::vector backends = {armnn::Compute::CpuRef}; - IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec()); - - // Loads it into the runtime. - NetworkId netId; - runtime->LoadNetwork(netId, std::move(optNet)); - - // Creates structures for input & output. - const std::vector inputData{ 3.f, 5.f, 2.f, 3.f, 7.f, 0.f, -2.f, -1.f, 3.f, 3.f }; - - std::vector output1Data(inputData.size()); - std::vector output2Data(inputData.size()); - std::vector output3Data(inputData.size()); - - InputTensors inputTensors - { - {0,armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), inputData.data())} - }; - OutputTensors outputTensors - { - {0,armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), output1Data.data())}, - {1,armnn::Tensor(runtime->GetOutputTensorInfo(netId, 1), output2Data.data())}, - {2,armnn::Tensor(runtime->GetOutputTensorInfo(netId, 2), output3Data.data())} - }; - - // Does the inference. - runtime->EnqueueWorkload(netId, inputTensors, outputTensors); - - // Checks the results. - BOOST_TEST(output1Data == std::vector({ 1.f, 1.f, 1.f, 1.f, 1.f, 0.f, -1.f, -1.f, 1.f, 1.f })); // ReLu1 - BOOST_TEST(output2Data == std::vector({ 3.f, 5.f, 2.f, 3.f, 6.f, 0.f, 0.f, 0.f, 3.f, 3.f })); // ReLu6 - BOOST_TEST(output3Data == std::vector({ 3.f, 5.f, 2.f, 3.f, 5.f, 2.f, 2.f, 2.f, 3.f, 3.f })); // [2, 5] -} - -#if ARMCOMPUTENEON_ENABLED -BOOST_AUTO_TEST_CASE(FallbackToCpuRef) -{ - using namespace armnn; - - // Create runtime in which test will run and allow fallback to CpuRef. - IRuntime::CreationOptions options; - IRuntimePtr runtime(IRuntime::Create(options)); - - // Builds up the structure of the network. - INetworkPtr net(INetwork::Create()); - - IConnectableLayer* input = net->AddInputLayer(0); - - // This layer configuration isn't supported by CpuAcc but we allow fallback to CpuRef so it shoud pass. - NormalizationDescriptor descriptor; - IConnectableLayer* pooling = net->AddNormalizationLayer(descriptor); - - IConnectableLayer* output = net->AddOutputLayer(0); - - input->GetOutputSlot(0).Connect(pooling->GetInputSlot(0)); - pooling->GetOutputSlot(0).Connect(output->GetInputSlot(0)); - - input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32)); - pooling->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32)); - - // optimize the network - std::vector backends = {Compute::CpuAcc, Compute::CpuRef}; - IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec()); - - // Load it into the runtime. It should pass. - NetworkId netId; - BOOST_TEST(runtime->LoadNetwork(netId, std::move(optNet)) == Status::Success); -} -#endif // ARMCOMPUTENEON_ENABLED - BOOST_AUTO_TEST_CASE(ErrorOnLoadNetwork) { using namespace armnn; -- cgit v1.2.1