From df82f3abc8acc90acfd56f18744a8cae201a759a Mon Sep 17 00:00:00 2001 From: Teresa Charlin Date: Mon, 30 Nov 2020 17:10:21 +0000 Subject: IVGCVSW-5532 Adding UnitTest fusing activation * QASymmS8 and BoundedReLU * Float16 and ReLU in GpuAcc * Remove layerName, not needed as 1 test per combination Signed-off-by: Teresa Charlin Change-Id: I930c7a04d8d904f370f1b40c62cf9311c172bbdf --- .../test/optimizations/FuseActivationTests.cpp | 193 +++++++++++++++++---- 1 file changed, 157 insertions(+), 36 deletions(-) (limited to 'src/armnn') diff --git a/src/armnn/test/optimizations/FuseActivationTests.cpp b/src/armnn/test/optimizations/FuseActivationTests.cpp index f28abff1e7..d5525811d2 100644 --- a/src/armnn/test/optimizations/FuseActivationTests.cpp +++ b/src/armnn/test/optimizations/FuseActivationTests.cpp @@ -42,7 +42,6 @@ template> struct Convolution2dTest { using LayerType = Convolution2dLayer; - static std::string GetReceiverLayerName() { return "Convolution2d"; }; static const bool isElementWise = false; static TensorShape GetInputShape() { return TensorShape( {1, 4, 4, 3}); } // NHWCin @@ -58,7 +57,6 @@ struct Convolution2dTest int32_t offset = 0) { Convolution2dDescriptor descriptor; - descriptor.m_BiasEnabled = false; descriptor.m_DataLayout = DataLayout::NHWC; descriptor.m_StrideX = 1; descriptor.m_StrideY = 1; @@ -81,7 +79,6 @@ struct DWConvolution2dTest { public: using LayerType = DepthwiseConvolution2dLayer; - static std::string GetReceiverLayerName() { return "DepthwiseConvolution2d"; }; static const bool isElementWise = false; static TensorShape GetInputShape() { return TensorShape( {1, 4, 4, 3}); } // NHWCin @@ -120,7 +117,6 @@ struct FullyConnectedTest { public: using LayerType = FullyConnectedLayer; - static std::string GetReceiverLayerName() { return "FullyConnected"; }; static const bool isElementWise = false; static TensorShape GetInputShape() { return TensorShape( {2, 5, 1, 1}); } // NCinHW @@ -155,7 +151,6 @@ struct BatchNormTest { public: using LayerType = BatchNormalizationLayer; - static std::string GetReceiverLayerName() { return "BatchNorm"; }; static const bool isElementWise = false; static TensorShape GetInputShape() { return TensorShape( {1, 4, 4, 3}); } // NHWCin @@ -194,7 +189,6 @@ template> struct MultiplicationTest { using LayerType = MultiplicationLayer; - static std::string GetReceiverLayerName() { return "Multiplication"; }; static const bool isElementWise = true; static TensorShape GetInputShape() { return TensorShape( {1, 4, 4, 3}); } // NHWCin @@ -219,7 +213,6 @@ template> struct AdditionTest { using LayerType = AdditionLayer; - static std::string GetReceiverLayerName() { return "Addition"; }; static const bool isElementWise = true; static TensorShape GetInputShape() { return TensorShape( {1, 4, 4, 3}); } // NHWCin @@ -244,7 +237,6 @@ template> struct SubtractionTest { using LayerType = SubtractionLayer; - static std::string GetReceiverLayerName() { return "Subtraction"; }; static const bool isElementWise = true; static TensorShape GetInputShape() { return TensorShape( {1, 4, 4, 3}); } // NHWCin @@ -269,7 +261,6 @@ template> struct DivisionTest { using LayerType = DivisionLayer; - static std::string GetReceiverLayerName() { return "Division"; }; static const bool isElementWise = true; static TensorShape GetInputShape() { return TensorShape( {1, 4, 4, 3}); } // NHWCin @@ -361,7 +352,7 @@ void FuseActivationIntoPreviousLayerTest(ActivationDescriptor activationDescript (layer->GetNameStr() == "fused-activation-into-receiverLayer"); }; - BOOST_CHECK_MESSAGE(3 == graphFused.GetNumLayers(), LayerTest::GetReceiverLayerName()); + BOOST_CHECK(3 == graphFused.GetNumLayers()); BOOST_TEST(CheckSequence(graphFused.cbegin(), graphFused.cend(), &IsLayerOfType, @@ -587,13 +578,35 @@ BOOST_AUTO_TEST_CASE(FuseReLUIntoFullyConnectedQAsymmU8CpuAccTest) (activationDescriptor, 0.0001f, Compute::CpuAcc); } -// HardSwish fused into Receiver Layers Float32 -BOOST_AUTO_TEST_CASE(FuseHardSwishIntoConvFloat32CpuAccTest) +// BoundedReLu fused into Receiver Layers QAsymmS8 +BOOST_AUTO_TEST_CASE(FuseBoundedReLUIntoConvQASymmS8CpuAccTest) { ActivationDescriptor activationDescriptor; - activationDescriptor.m_Function = ActivationFunction::HardSwish; + activationDescriptor.m_Function = ActivationFunction::BoundedReLu; + activationDescriptor.m_A = 6.0f; + activationDescriptor.m_B = 0.0f; - FuseActivationIntoPreviousLayerTest, DataType::Float32> + FuseActivationIntoPreviousLayerTest, DataType::QAsymmS8> + (activationDescriptor, 0.0001f, Compute::CpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseBoundedReLUIntoDWConvQASymmS8CpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::BoundedReLu; + activationDescriptor.m_A = 6.0f; + activationDescriptor.m_B = 0.0f; + + FuseActivationIntoPreviousLayerTest < DWConvolution2dTest < DataType::QAsymmS8 > , DataType::QAsymmS8 > + (activationDescriptor, 0.0001f, Compute::CpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseBoundedReLUIntoFullyConnectedQASymmS8CpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::BoundedReLu; + activationDescriptor.m_A = 6.0f; + activationDescriptor.m_B = 0.0f; + + FuseActivationIntoPreviousLayerTest, DataType::QAsymmS8> (activationDescriptor, 0.0001f, Compute::CpuAcc); } @@ -607,6 +620,16 @@ BOOST_AUTO_TEST_CASE(FuseTanHIntoConvFloat32CpuAccTest) (activationDescriptor, 0.0001f, Compute::CpuAcc); } +// HardSwish fused into Receiver Layers Float32 +BOOST_AUTO_TEST_CASE(FuseHardSwishIntoConvFloat32CpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::HardSwish; + + FuseActivationIntoPreviousLayerTest, DataType::Float32> + (activationDescriptor, 0.0001f, Compute::CpuAcc); +} + // Test that all receiver layers follow by all activation layers work, either fused or not fused BOOST_AUTO_TEST_CASE(LayerFollowedByActivationFloat32CpuAccTest) { @@ -841,6 +864,72 @@ BOOST_AUTO_TEST_CASE(FuseBoundedReLUIntoDivFloat32GpuAccTest) (activationDescriptor, 0.0001f, Compute::GpuAcc); } +// ReLu fused into Receiver Layers Float16 +BOOST_AUTO_TEST_CASE(FuseReLUIntoConvFloat16GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::ReLu; + + FuseActivationIntoPreviousLayerTest, DataType::Float16> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseReLUIntoDWConvFloat16GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::ReLu; + + FuseActivationIntoPreviousLayerTest, DataType::Float16> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseReLUIntoFullyConnectedFloat16GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::ReLu; + + FuseActivationIntoPreviousLayerTest, DataType::Float16> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseReLUIntoBatchNormFloat16GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::ReLu; + + FuseActivationIntoPreviousLayerTest, DataType::Float16> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseReLUIntoMulFloat16GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::ReLu; + + FuseActivationIntoPreviousLayerTest, DataType::Float16> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseReLUIntoAddFloat16GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::ReLu; + + FuseActivationIntoPreviousLayerTest, DataType::Float16> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseReLUIntoSubFloat16GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::ReLu; + + FuseActivationIntoPreviousLayerTest, DataType::Float16> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseReLUIntoDivFloat16GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::ReLu; + + FuseActivationIntoPreviousLayerTest, DataType::Float16> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} + // ReLU fused into Receiver Layers QAsymmU8 BOOST_AUTO_TEST_CASE(FuseReLUQIntoConvAsymmU8GpuAccTest) { @@ -867,85 +956,117 @@ BOOST_AUTO_TEST_CASE(FuseReLUQIntoFullyConnectedAsymmU8GpuAccTest) (activationDescriptor, 0.0001f, Compute::GpuAcc); } -// HardSwish fused into Receiver Layers Float32 -BOOST_AUTO_TEST_CASE(FuseHardSwishIntoConvFloat32GpuAccTest) +// BoundedReLu fused into Receiver Layers QAsymmS8 +BOOST_AUTO_TEST_CASE(FuseBoundedReLUIntoConvQASymmS8GpuAccTest) { ActivationDescriptor activationDescriptor; - activationDescriptor.m_Function = ActivationFunction::HardSwish; + activationDescriptor.m_Function = ActivationFunction::BoundedReLu; + activationDescriptor.m_A = 6.0f; + activationDescriptor.m_B = 0.0f; + + FuseActivationIntoPreviousLayerTest, DataType::QAsymmS8> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseBoundedReLUIntoDWConvQASymmS8GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::BoundedReLu; + activationDescriptor.m_A = 6.0f; + activationDescriptor.m_B = 0.0f; + + FuseActivationIntoPreviousLayerTest < DWConvolution2dTest < DataType::QAsymmS8 > , DataType::QAsymmS8 > + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseBoundedReLUIntoFullyConnectedQASymmS8GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::BoundedReLu; + activationDescriptor.m_A = 6.0f; + activationDescriptor.m_B = 0.0f; + + FuseActivationIntoPreviousLayerTest, DataType::QAsymmS8> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} + +// TanH fused into Receiver Layers Float32 +BOOST_AUTO_TEST_CASE(FuseTanHIntoConvFloat32GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::TanH; FuseActivationIntoPreviousLayerTest, DataType::Float32> (activationDescriptor, 0.0001f, Compute::GpuAcc); } -BOOST_AUTO_TEST_CASE(FuseHardSwishIntoMulFloat32GpuAccTest) +BOOST_AUTO_TEST_CASE(FuseTanHIntoMulFloat32GpuAccTest) { ActivationDescriptor activationDescriptor; - activationDescriptor.m_Function = ActivationFunction::HardSwish; + activationDescriptor.m_Function = ActivationFunction::TanH; FuseActivationIntoPreviousLayerTest, DataType::Float32> (activationDescriptor, 0.0001f, Compute::GpuAcc); } -BOOST_AUTO_TEST_CASE(FuseHardSwishIntoAddFloat32GpuAccTest) +BOOST_AUTO_TEST_CASE(FuseTanHIntoAddFloat32GpuAccTest) { ActivationDescriptor activationDescriptor; - activationDescriptor.m_Function = ActivationFunction::HardSwish; + activationDescriptor.m_Function = ActivationFunction::TanH; FuseActivationIntoPreviousLayerTest, DataType::Float32> (activationDescriptor, 0.0001f, Compute::GpuAcc); } -BOOST_AUTO_TEST_CASE(FuseHardSwishIntoSubFloat32GpuAccTest) +BOOST_AUTO_TEST_CASE(FuseTanHIntoSubFloat32GpuAccTest) { ActivationDescriptor activationDescriptor; - activationDescriptor.m_Function = ActivationFunction::HardSwish; + activationDescriptor.m_Function = ActivationFunction::TanH; FuseActivationIntoPreviousLayerTest, DataType::Float32> (activationDescriptor, 0.0001f, Compute::GpuAcc); } -BOOST_AUTO_TEST_CASE(FuseHardSwishIntoDivFloat32GpuAccTest) +BOOST_AUTO_TEST_CASE(FuseTanHIntoDivFloat32GpuAccTest) { ActivationDescriptor activationDescriptor; - activationDescriptor.m_Function = ActivationFunction::HardSwish; + activationDescriptor.m_Function = ActivationFunction::TanH; FuseActivationIntoPreviousLayerTest, DataType::Float32> (activationDescriptor, 0.0001f, Compute::GpuAcc); } -// TanH fused into Receiver Layers Float32 -BOOST_AUTO_TEST_CASE(FuseTanHIntoConvFloat32GpuAccTest) +// HardSwish fused into Receiver Layers Float32 +BOOST_AUTO_TEST_CASE(FuseHardSwishIntoConvFloat32GpuAccTest) { ActivationDescriptor activationDescriptor; - activationDescriptor.m_Function = ActivationFunction::TanH; + activationDescriptor.m_Function = ActivationFunction::HardSwish; FuseActivationIntoPreviousLayerTest, DataType::Float32> (activationDescriptor, 0.0001f, Compute::GpuAcc); } -BOOST_AUTO_TEST_CASE(FuseTanHIntoMulFloat32GpuAccTest) +BOOST_AUTO_TEST_CASE(FuseHardSwishIntoMulFloat32GpuAccTest) { ActivationDescriptor activationDescriptor; - activationDescriptor.m_Function = ActivationFunction::TanH; + activationDescriptor.m_Function = ActivationFunction::HardSwish; FuseActivationIntoPreviousLayerTest, DataType::Float32> (activationDescriptor, 0.0001f, Compute::GpuAcc); } -BOOST_AUTO_TEST_CASE(FuseTanHIntoAddFloat32GpuAccTest) +BOOST_AUTO_TEST_CASE(FuseHardSwishIntoAddFloat32GpuAccTest) { ActivationDescriptor activationDescriptor; - activationDescriptor.m_Function = ActivationFunction::TanH; + activationDescriptor.m_Function = ActivationFunction::HardSwish; FuseActivationIntoPreviousLayerTest, DataType::Float32> (activationDescriptor, 0.0001f, Compute::GpuAcc); } -BOOST_AUTO_TEST_CASE(FuseTanHIntoSubFloat32GpuAccTest) +BOOST_AUTO_TEST_CASE(FuseHardSwishIntoSubFloat32GpuAccTest) { ActivationDescriptor activationDescriptor; - activationDescriptor.m_Function = ActivationFunction::TanH; + activationDescriptor.m_Function = ActivationFunction::HardSwish; FuseActivationIntoPreviousLayerTest, DataType::Float32> (activationDescriptor, 0.0001f, Compute::GpuAcc); } -BOOST_AUTO_TEST_CASE(FuseTanHIntoDivFloat32GpuAccTest) +BOOST_AUTO_TEST_CASE(FuseHardSwishIntoDivFloat32GpuAccTest) { ActivationDescriptor activationDescriptor; - activationDescriptor.m_Function = ActivationFunction::TanH; + activationDescriptor.m_Function = ActivationFunction::HardSwish; FuseActivationIntoPreviousLayerTest, DataType::Float32> (activationDescriptor, 0.0001f, Compute::GpuAcc); -- cgit v1.2.1