From 9b8fb3ecc3d1a05fe852f9cf16576b8e31d68f3c Mon Sep 17 00:00:00 2001 From: Keith Davis Date: Mon, 23 May 2022 12:16:50 +0100 Subject: IVGCVSW-6967 Add Optimizer Test for FullyConnected in Fp32ToBf16 * Test already existed but bias was not enabled so yielded false positive * Updated Conv2d and FC to have const layers as inputs Signed-off-by: Keith Davis Change-Id: Id4193adef2ac67b3a4681345e4dc01414cbbbad7 --- .../Fp32NetworkToBf16ConverterTests.cpp | 58 +++++++++++++++++----- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/src/armnn/test/optimizations/Fp32NetworkToBf16ConverterTests.cpp b/src/armnn/test/optimizations/Fp32NetworkToBf16ConverterTests.cpp index 37d770190a..d3a6932a48 100644 --- a/src/armnn/test/optimizations/Fp32NetworkToBf16ConverterTests.cpp +++ b/src/armnn/test/optimizations/Fp32NetworkToBf16ConverterTests.cpp @@ -71,34 +71,50 @@ TEST_CASE("Fp32NetworkToBf16OptimizationConv2DTest") input->GetOutputSlot().SetTensorInfo(infoFP32); armnn::Convolution2dDescriptor descriptor; - + descriptor.m_BiasEnabled = true; auto conv = graph.AddLayer(descriptor, "conv2d"); - conv->m_Weight = std::make_unique(weights); - conv->m_Bias = std::make_unique(bias); conv->GetOutputSlot().SetTensorInfo(infoFP32); + auto weightsLayer = graph.AddLayer("Weights"); + weightsLayer->m_LayerOutput = std::make_shared(weights); + weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsLayer->m_LayerOutput->GetTensorInfo()); + + auto biasLayer = graph.AddLayer("Bias"); + biasLayer->m_LayerOutput = std::make_shared(bias); + biasLayer->GetOutputSlot(0).SetTensorInfo(biasLayer->m_LayerOutput->GetTensorInfo()); + auto output = graph.AddLayer(1, "output"); // Connect up the layers input->GetOutputSlot().Connect(conv->GetInputSlot(0)); + weightsLayer->GetOutputSlot(0).Connect(conv->GetInputSlot(1)); + biasLayer->GetOutputSlot(0).Connect(conv->GetInputSlot(2)); conv->GetOutputSlot().Connect(output->GetInputSlot(0)); CHECK(CheckSequence(graph.cbegin(), graph.cend(), &IsLayerOfType, - &IsLayerOfType, &IsLayerOfType)); + &IsLayerOfType, &IsLayerOfType, + &IsLayerOfType, &IsLayerOfType)); // Run the optimizer - armnn::Optimizer::Pass(graph, armnn::MakeOptimizations(Fp32NetworkToBf16Converter())); + armnn::Optimizer::Pass(graph, armnn::MakeOptimizations(RedirectMembersToConstantInputs(), + Fp32NetworkToBf16Converter())); CHECK(CheckSequence(graph.cbegin(), graph.cend(), &IsLayerOfType, - &IsLayerOfType, &IsLayerOfType, - &IsLayerOfType)); + &IsLayerOfType, + &IsLayerOfType, &IsLayerOfType, + &IsLayerOfType, &IsLayerOfType, + &IsLayerOfType)); armnn::TensorInfo inputTensor = conv->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(); + armnn::TensorInfo weightTensor = conv->GetInputSlot(1).GetConnectedOutputSlot()->GetTensorInfo(); + armnn::TensorInfo biasTensor = conv->GetInputSlot(2).GetConnectedOutputSlot()->GetTensorInfo(); armnn::TensorInfo outputTensor = conv->GetOutputSlot(0).GetTensorInfo(); CHECK((conv->GetDataType() == armnn::DataType::BFloat16)); CHECK((conv->m_Weight->GetTensorInfo().GetDataType() == armnn::DataType::BFloat16)); CHECK((conv->m_Bias->GetTensorInfo().GetDataType() == armnn::DataType::Float32)); CHECK((inputTensor.GetDataType() == armnn::DataType::BFloat16)); + CHECK((weightTensor.GetDataType() == armnn::DataType::BFloat16)); + CHECK((biasTensor.GetDataType() == armnn::DataType::Float32)); CHECK((outputTensor.GetDataType() == armnn::DataType::Float32)); // Check whether data matches expected Bf16 data @@ -141,34 +157,50 @@ TEST_CASE("Fp32NetworkToBf16OptimizationFullyConnectedTest") input->GetOutputSlot().SetTensorInfo(infoFP32); armnn::FullyConnectedDescriptor descriptor; + descriptor.m_BiasEnabled = true; auto fc = graph.AddLayer(descriptor, "fully"); - fc->m_Weight = std::make_unique(weights); - fc->m_Bias = std::make_unique(bias); fc->GetOutputSlot().SetTensorInfo(infoFP32); + auto weightsLayer = graph.AddLayer("Weights"); + weightsLayer->m_LayerOutput = std::make_shared(weights); + weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsLayer->m_LayerOutput->GetTensorInfo()); + + auto biasLayer = graph.AddLayer("Bias"); + biasLayer->m_LayerOutput = std::make_shared(bias); + biasLayer->GetOutputSlot(0).SetTensorInfo(biasLayer->m_LayerOutput->GetTensorInfo()); + auto output = graph.AddLayer(1, "output"); // Connect up the layers input->GetOutputSlot().Connect(fc->GetInputSlot(0)); + weightsLayer->GetOutputSlot(0).Connect(fc->GetInputSlot(1)); + biasLayer->GetOutputSlot(0).Connect(fc->GetInputSlot(2)); fc->GetOutputSlot().Connect(output->GetInputSlot(0)); CHECK(CheckSequence(graph.cbegin(), graph.cend(), &IsLayerOfType, - &IsLayerOfType, &IsLayerOfType)); + &IsLayerOfType, &IsLayerOfType, + &IsLayerOfType, &IsLayerOfType)); // Run the optimizer - armnn::Optimizer::Pass(graph, armnn::MakeOptimizations(Fp32NetworkToBf16Converter())); + armnn::Optimizer::Pass(graph, armnn::MakeOptimizations(RedirectMembersToConstantInputs(), + Fp32NetworkToBf16Converter())); CHECK(CheckSequence(graph.cbegin(), graph.cend(), &IsLayerOfType, - &IsLayerOfType, &IsLayerOfType, - &IsLayerOfType)); + &IsLayerOfType, &IsLayerOfType, + &IsLayerOfType, &IsLayerOfType, + &IsLayerOfType, &IsLayerOfType)); armnn::TensorInfo inputTensor = fc->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(); + armnn::TensorInfo weightTensor = fc->GetInputSlot(1).GetConnectedOutputSlot()->GetTensorInfo(); + armnn::TensorInfo biasTensor = fc->GetInputSlot(2).GetConnectedOutputSlot()->GetTensorInfo(); armnn::TensorInfo outputTensor = fc->GetOutputSlot(0).GetTensorInfo(); CHECK((fc->GetDataType() == armnn::DataType::BFloat16)); CHECK((fc->m_Weight->GetTensorInfo().GetDataType() == armnn::DataType::BFloat16)); CHECK((fc->m_Bias->GetTensorInfo().GetDataType() == armnn::DataType::Float32)); CHECK((inputTensor.GetDataType() == armnn::DataType::BFloat16)); + CHECK((weightTensor.GetDataType() == armnn::DataType::BFloat16)); + CHECK((biasTensor.GetDataType() == armnn::DataType::Float32)); CHECK((outputTensor.GetDataType() == armnn::DataType::Float32)); // Check whether data matches expected Bf16 data -- cgit v1.2.1