diff options
author | Teresa Charlin <teresa.charlinreyes@arm.com> | 2020-11-30 17:10:21 +0000 |
---|---|---|
committer | Jim Flynn <jim.flynn@arm.com> | 2020-12-17 11:58:20 +0000 |
commit | df82f3abc8acc90acfd56f18744a8cae201a759a (patch) | |
tree | 710c9ea06484bc5de51bb031a500f37730fdb78d /src | |
parent | 8719d2247fab4ba0e3936c86e3043da3da1b573c (diff) | |
download | armnn-df82f3abc8acc90acfd56f18744a8cae201a759a.tar.gz |
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 <teresa.charlinreyes@arm.com>
Change-Id: I930c7a04d8d904f370f1b40c62cf9311c172bbdf
Diffstat (limited to 'src')
-rw-r--r-- | src/armnn/test/optimizations/FuseActivationTests.cpp | 193 |
1 files changed, 157 insertions, 36 deletions
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<DataType ArmnnType, typename T = ResolveType<ArmnnType>> 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<DataType ArmnnType, typename T = ResolveType<ArmnnType>> 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<DataType ArmnnType, typename T = ResolveType<ArmnnType>> 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<DataType ArmnnType, typename T = ResolveType<ArmnnType>> 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<DataType ArmnnType, typename T = ResolveType<ArmnnType>> 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<InputLayer>, @@ -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<Convolution2dTest<DataType::Float32>, DataType::Float32> + FuseActivationIntoPreviousLayerTest<Convolution2dTest<DataType::QAsymmS8>, 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<FullyConnectedTest<DataType::QAsymmS8>, 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<Convolution2dTest<DataType::Float32>, 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<Convolution2dTest<DataType::Float16>, DataType::Float16> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseReLUIntoDWConvFloat16GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::ReLu; + + FuseActivationIntoPreviousLayerTest<DWConvolution2dTest<DataType::Float16>, DataType::Float16> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseReLUIntoFullyConnectedFloat16GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::ReLu; + + FuseActivationIntoPreviousLayerTest<FullyConnectedTest<DataType::Float16>, DataType::Float16> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseReLUIntoBatchNormFloat16GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::ReLu; + + FuseActivationIntoPreviousLayerTest<BatchNormTest<DataType::Float16>, DataType::Float16> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseReLUIntoMulFloat16GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::ReLu; + + FuseActivationIntoPreviousLayerTest<MultiplicationTest<DataType::Float16>, DataType::Float16> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseReLUIntoAddFloat16GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::ReLu; + + FuseActivationIntoPreviousLayerTest<AdditionTest<DataType::Float16>, DataType::Float16> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseReLUIntoSubFloat16GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::ReLu; + + FuseActivationIntoPreviousLayerTest<SubtractionTest<DataType::Float16>, DataType::Float16> + (activationDescriptor, 0.0001f, Compute::GpuAcc); +} +BOOST_AUTO_TEST_CASE(FuseReLUIntoDivFloat16GpuAccTest) +{ + ActivationDescriptor activationDescriptor; + activationDescriptor.m_Function = ActivationFunction::ReLu; + + FuseActivationIntoPreviousLayerTest<DivisionTest<DataType::Float16>, 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<Convolution2dTest<DataType::QAsymmS8>, 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<FullyConnectedTest<DataType::QAsymmS8>, 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<Convolution2dTest<DataType::Float32>, 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<MultiplicationTest<DataType::Float32>, 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<AdditionTest<DataType::Float32>, 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<SubtractionTest<DataType::Float32>, 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<DivisionTest<DataType::Float32>, 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<Convolution2dTest<DataType::Float32>, 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<MultiplicationTest<DataType::Float32>, 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<AdditionTest<DataType::Float32>, 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<SubtractionTest<DataType::Float32>, 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<DivisionTest<DataType::Float32>, DataType::Float32> (activationDescriptor, 0.0001f, Compute::GpuAcc); |