diff --git a/inference-engine/src/mkldnn_plugin/bf16transformer.h b/inference-engine/src/mkldnn_plugin/bf16transformer.h index 947f6ebab02..811c0fa5bd4 100644 --- a/inference-engine/src/mkldnn_plugin/bf16transformer.h +++ b/inference-engine/src/mkldnn_plugin/bf16transformer.h @@ -14,7 +14,8 @@ namespace MKLDNNPlugin { class BF16Transformer { const InferenceEngine::details::caseless_set _initbf16 = - { "convolution", "fullyconnected", "innerproduct", "gemm", "RegionYolo", "Interpolate", "PSROIPooling" }; + { "convolution", "fullyconnected", "innerproduct", "gemm", "RegionYolo", "Interpolate", "PSROIPooling", "Deconvolution" }; + const InferenceEngine::details::caseless_set _complementbf16 = { "relu", "tanh", "elu", "square", "abs", "sqrt", "linear", "bounded_relu", "soft_relu", "normalize", "sigmoid", "ReLU6", "not", "activation", "HSwish", "mish", "logistic", "mod", "resample", diff --git a/inference-engine/src/mkldnn_plugin/nodes/log_softmax.cpp b/inference-engine/src/mkldnn_plugin/nodes/log_softmax.cpp index d95309afc47..01872db73d7 100644 --- a/inference-engine/src/mkldnn_plugin/nodes/log_softmax.cpp +++ b/inference-engine/src/mkldnn_plugin/nodes/log_softmax.cpp @@ -26,9 +26,6 @@ public: if (layer->insData.size() != 1) THROW_IE_EXCEPTION << layer->name << " Incorrect number of input edges!"; - if (layer->insData[0].lock()->getTensorDesc().getPrecision() != Precision::FP32) - THROW_IE_EXCEPTION << layer->name << " Incorrect input data tensor precision. Only FP32 is supported!"; - SizeVector dims = layer->insData[0].lock()->getTensorDesc().getDims(); if (!dims.size()) dims = SizeVector(1, 1); diff --git a/inference-engine/src/mkldnn_plugin/nodes/mkldnn_deconv_node.cpp b/inference-engine/src/mkldnn_plugin/nodes/mkldnn_deconv_node.cpp index 94d2fc6b87b..caf74aa8595 100644 --- a/inference-engine/src/mkldnn_plugin/nodes/mkldnn_deconv_node.cpp +++ b/inference-engine/src/mkldnn_plugin/nodes/mkldnn_deconv_node.cpp @@ -29,13 +29,15 @@ void MKLDNNDeconvolutionNode::getSupportedDescriptors() { return; InferenceEngine::Precision precision = getCnnLayer()->insData[0].lock()->getPrecision(); - if (precision != InferenceEngine::Precision::FP32) + if (precision != InferenceEngine::Precision::FP32 && precision != InferenceEngine::Precision::BF16) precision = InferenceEngine::Precision::FP32; auto inputDataType = MKLDNNExtensionUtils::IEPrecisionToDataType(precision); precision = getCnnLayer()->outData[0]->getPrecision(); - if (precision != InferenceEngine::Precision::FP32) + if (precision != InferenceEngine::Precision::FP32 && precision != InferenceEngine::Precision::BF16) precision = InferenceEngine::Precision::FP32; auto outputDataType = MKLDNNExtensionUtils::IEPrecisionToDataType(precision); + if (inputDataType == memory::data_type::bf16 || outputDataType == memory::data_type::bf16) + inputDataType = outputDataType = memory::data_type::bf16; if (getParentEdges().empty() || getParentEdges().size() > 3) THROW_IE_EXCEPTION << "Incorrect number of input edges for layer " << getName(); diff --git a/inference-engine/tests/functional/plugin/cpu/single_layer_tests/convolution_backprop_data.cpp b/inference-engine/tests/functional/plugin/cpu/single_layer_tests/convolution_backprop_data.cpp new file mode 100755 index 00000000000..90ef29a9cc2 --- /dev/null +++ b/inference-engine/tests/functional/plugin/cpu/single_layer_tests/convolution_backprop_data.cpp @@ -0,0 +1,352 @@ +// Copyright (C) 2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "test_utils/cpu_test_utils.hpp" +#include "test_utils/fusing_test_utils.hpp" +#include "shared_test_classes/base/layer_test_utils.hpp" +#include "ngraph_functions/utils/ngraph_helpers.hpp" +#include "ngraph_functions/builders.hpp" +#include + + +using namespace InferenceEngine; +using namespace CPUTestUtils; + +namespace CPULayerTestsDefinitions { +using LayerTestsDefinitions::convBackpropDataSpecificParams; +using LayerTestsDefinitions::convBackpropDataLayerTestParamsSet; + +typedef std::tuple< + convBackpropDataLayerTestParamsSet, + CPUSpecificParams, + fusingSpecificParams, + std::map > deconvLayerCPUTestParamsSet; + +class DeconvolutionLayerCPUTest : public testing::WithParamInterface, + virtual public LayerTestsUtils::LayerTestsCommon, public CpuTestWithFusing { +public: + static std::string getTestCaseName(testing::TestParamInfo obj) { + convBackpropDataLayerTestParamsSet basicParamsSet; + CPUSpecificParams cpuParams; + fusingSpecificParams fusingParams; + std::map additionalConfig; + std::tie(basicParamsSet, cpuParams, fusingParams, additionalConfig) = obj.param; + + std::ostringstream result; + result << LayerTestsDefinitions::ConvolutionBackpropDataLayerTest::getTestCaseName(testing::TestParamInfo( + basicParamsSet, 0)); + + result << CPUTestsBase::getTestCaseName(cpuParams); + result << CpuTestWithFusing::getTestCaseName(fusingParams); + + if (!additionalConfig.empty()) { + result << "_PluginConf"; + for (auto& item : additionalConfig) { + result << "_" << item.first << "=" << item.second; + } + } + + return result.str(); + } +protected: + void SetUp() override { + convBackpropDataLayerTestParamsSet basicParamsSet; + CPUSpecificParams cpuParams; + fusingSpecificParams fusingParams; + std::map additionalConfig; + std::tie(basicParamsSet, cpuParams, fusingParams, additionalConfig) = this->GetParam(); + + configuration.insert(additionalConfig.begin(), additionalConfig.end()); + + std::tie(inFmts, outFmts, priority, selectedType) = cpuParams; + std::tie(postOpMgrPtr, fusedOps) = fusingParams; + + convBackpropDataSpecificParams convParams; + std::vector inputShape; + auto netPrecision = InferenceEngine::Precision::UNSPECIFIED; + std::tie(convParams, netPrecision, inPrc, outPrc, inLayout, outLayout, inputShape, targetDevice) = basicParamsSet; + + if (inPrc == Precision::UNSPECIFIED) { + selectedType += std::string("_") + Precision(Precision::FP32).name(); + } else { + selectedType += std::string("_") + inPrc.name(); + } + + ngraph::op::PadType padType; + InferenceEngine::SizeVector kernel, stride, dilation; + std::vector padBegin, padEnd; + size_t convOutChannels; + std::tie(kernel, stride, padBegin, padEnd, dilation, convOutChannels, padType) = convParams; + auto ngPrc = FuncTestUtils::PrecisionUtils::convertIE2nGraphPrc(netPrecision); + + auto inputParams = ngraph::builder::makeParams(ngraph::element::f32, { inputShape }); + auto paramOuts = ngraph::helpers::convert2OutputVector(ngraph::helpers::castOps2Nodes(inputParams)); + + auto deconvolutionNode = ngraph::builder::makeConvolutionBackpropData(paramOuts.front(), ngPrc, kernel, stride, padBegin, + padEnd, dilation, padType, convOutChannels); + + function = makeNgraphFunction(ngPrc, inputParams, deconvolutionNode, "convolutionBackpropData"); + } +}; + +TEST_P(DeconvolutionLayerCPUTest, CompareWithRefs) { + SKIP_IF_CURRENT_TEST_IS_DISABLED() + + Run(); + CheckPluginRelatedResults(executableNetwork, "Deconvolution"); +} + +namespace { + +/* COMMON PARAMS */ +const std::vector fusingParamsSet{ + emptyFusingSpec, + fusingScaleShift +}; + +const std::map cpuEmptyPluginConfig; +const std::map cpuBF16PluginConfig = { { PluginConfigParams::KEY_ENFORCE_BF16, PluginConfigParams::YES } }; + +/* ============= Deconvolution params (planar layout) ============= */ +const SizeVector numOutChannels_Planar = { 6 }; + +/* ============= Deconvolution params (blocked layout) ============= */ +const SizeVector numOutChannels_Blocked = { 64 }; + +/* ============= Deconvolution params (2D) ============= */ +const std::vector kernels2d = { {3, 3}, {1, 1} }; +const std::vector strides2d = { {1, 1}, {2, 2} }; +const std::vector> padBegins2d = { {0, 0} }; +const std::vector> padEnds2d = { {0, 0} }; +const std::vector dilations2d = { {1, 1} }; + +/* ============= Deconvolution params (3D) ============= */ +const std::vector kernels3d = { {3, 3, 3}, {1, 1, 1} }; +const std::vector strides3d = { {1, 1, 1}, {2, 2, 2} }; +const std::vector> padBegins3d = { {0, 0, 0} }; +const std::vector> padEnds3d = { {0, 0, 0} }; +const std::vector dilations3d = { {1, 1, 1} }; +/* ============= */ + +/* INSTANCES */ +/* ============= Deconvolution (Planar 2D) ============= */ +const auto convParams_ExplicitPadding_Planar_2D = ::testing::Combine( + ::testing::ValuesIn(kernels2d), + ::testing::ValuesIn(strides2d), + ::testing::ValuesIn(padBegins2d), + ::testing::ValuesIn(padEnds2d), + ::testing::ValuesIn(dilations2d), + ::testing::ValuesIn(numOutChannels_Planar), + ::testing::Values(ngraph::op::PadType::EXPLICIT) +); + +INSTANTIATE_TEST_CASE_P(smoke_Deconv_2D_Planar_FP32, DeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + convParams_ExplicitPadding_Planar_2D, + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::UNSPECIFIED), + ::testing::Values(Precision::UNSPECIFIED), + ::testing::Values(Layout::ANY), + ::testing::Values(Layout::ANY), + ::testing::Values(std::vector({ 2, 12, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_gemm_2D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuEmptyPluginConfig)), + DeconvolutionLayerCPUTest::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(smoke_Deconv_2D_Planar_BF16, DeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + convParams_ExplicitPadding_Planar_2D, + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::BF16), + ::testing::Values(Precision::BF16), + ::testing::Values(Layout::ANY), + ::testing::Values(Layout::ANY), + ::testing::Values(std::vector({ 2, 12, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_gemm_2D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuBF16PluginConfig)), + DeconvolutionLayerCPUTest::getTestCaseName); + +/* ============= GroupDeconvolution (Planar 3D) ============= */ +const auto convParams_ExplicitPadding_Planar_3D = ::testing::Combine( + ::testing::ValuesIn(kernels3d), + ::testing::ValuesIn(strides3d), + ::testing::ValuesIn(padBegins3d), + ::testing::ValuesIn(padEnds3d), + ::testing::ValuesIn(dilations3d), + ::testing::ValuesIn(numOutChannels_Planar), + ::testing::Values(ngraph::op::PadType::EXPLICIT) +); + +INSTANTIATE_TEST_CASE_P(smoke_Deconv_3D_Planar_FP32, DeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + convParams_ExplicitPadding_Planar_3D, + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::UNSPECIFIED), + ::testing::Values(Precision::UNSPECIFIED), + ::testing::Values(Layout::ANY), + ::testing::Values(Layout::ANY), + ::testing::Values(std::vector({ 2, 12, 7, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_gemm_3D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuEmptyPluginConfig)), + DeconvolutionLayerCPUTest::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(smoke_Deconv_3D_Planar_BF16, DeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + convParams_ExplicitPadding_Planar_3D, + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::BF16), + ::testing::Values(Precision::BF16), + ::testing::Values(Layout::ANY), + ::testing::Values(Layout::ANY), + ::testing::Values(std::vector({ 2, 12, 7, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_gemm_3D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuBF16PluginConfig)), + DeconvolutionLayerCPUTest::getTestCaseName); + +/* ============= GroupDeconvolution (Blocked 2D) ============= */ +const auto convParams_ExplicitPadding_Blocked_2D = ::testing::Combine( + ::testing::ValuesIn(kernels2d), + ::testing::ValuesIn(strides2d), + ::testing::ValuesIn(padBegins2d), + ::testing::ValuesIn(padEnds2d), + ::testing::ValuesIn(dilations2d), + ::testing::ValuesIn(numOutChannels_Blocked), + ::testing::Values(ngraph::op::PadType::EXPLICIT) +); + +INSTANTIATE_TEST_CASE_P(smoke_Deconv_2D_Blocked_FP32, DeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + convParams_ExplicitPadding_Blocked_2D, + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::UNSPECIFIED), + ::testing::Values(Precision::UNSPECIFIED), + ::testing::Values(Layout::ANY), + ::testing::Values(Layout::ANY), + ::testing::Values(std::vector({ 2, 67, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_avx512_2D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuEmptyPluginConfig)), + DeconvolutionLayerCPUTest::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(smoke_Deconv_2D_Blocked_BF16, DeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + convParams_ExplicitPadding_Blocked_2D, + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::BF16), + ::testing::Values(Precision::BF16), + ::testing::Values(Layout::ANY), + ::testing::Values(Layout::ANY), + ::testing::Values(std::vector({ 2, 67, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_avx512_2D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuBF16PluginConfig)), + DeconvolutionLayerCPUTest::getTestCaseName); + +/* ============= GroupDeconvolution (Blocked 3D) ============= */ +const auto convParams_ExplicitPadding_Blocked_3D = ::testing::Combine( + ::testing::ValuesIn(kernels3d), + ::testing::ValuesIn(strides3d), + ::testing::ValuesIn(padBegins3d), + ::testing::ValuesIn(padEnds3d), + ::testing::ValuesIn(dilations3d), + ::testing::ValuesIn(numOutChannels_Blocked), + ::testing::Values(ngraph::op::PadType::EXPLICIT) +); + +INSTANTIATE_TEST_CASE_P(smoke_Deconv_3D_Blocked_FP32, DeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + convParams_ExplicitPadding_Blocked_3D, + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::UNSPECIFIED), + ::testing::Values(Precision::UNSPECIFIED), + ::testing::Values(Layout::ANY), + ::testing::Values(Layout::ANY), + ::testing::Values(std::vector({ 2, 67, 7, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_avx512_3D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuEmptyPluginConfig)), + DeconvolutionLayerCPUTest::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(smoke_Deconv_3D_Blocked_BF16, DeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + convParams_ExplicitPadding_Blocked_3D, + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::BF16), + ::testing::Values(Precision::BF16), + ::testing::Values(Layout::ANY), + ::testing::Values(Layout::ANY), + ::testing::Values(std::vector({ 2, 67, 7, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_avx512_3D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuBF16PluginConfig)), + DeconvolutionLayerCPUTest::getTestCaseName); + +/* ============= Kernel_1x1 (2D) ============= */ + +const auto convParams_ExplicitPadding_1x1_2D = ::testing::Combine( + ::testing::Values(SizeVector({1, 1})), + ::testing::Values(SizeVector({1, 1})), + ::testing::Values(std::vector({0, 0})), + ::testing::Values(std::vector({0, 0})), + ::testing::Values(SizeVector({1, 1})), + ::testing::ValuesIn(numOutChannels_Blocked), + ::testing::Values(ngraph::op::PadType::EXPLICIT) +); + +INSTANTIATE_TEST_CASE_P(smoke_Deconv_2D_1x1_FP32, DeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + convParams_ExplicitPadding_1x1_2D, + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::UNSPECIFIED), + ::testing::Values(Precision::UNSPECIFIED), + ::testing::Values(Layout::ANY), + ::testing::Values(Layout::ANY), + ::testing::Values(std::vector({ 2, 67, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_avx512_2D_1x1})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuEmptyPluginConfig)), + DeconvolutionLayerCPUTest::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(smoke_Deconv_2D_1x1_BF16, DeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + convParams_ExplicitPadding_1x1_2D, + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::BF16), + ::testing::Values(Precision::BF16), + ::testing::Values(Layout::ANY), + ::testing::Values(Layout::ANY), + ::testing::Values(std::vector({ 2, 67, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_avx512_2D_1x1})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuBF16PluginConfig)), + DeconvolutionLayerCPUTest::getTestCaseName); + +/* ========= */ + +} // namespace +} // namespace CPULayerTestsDefinitions diff --git a/inference-engine/tests/functional/plugin/cpu/single_layer_tests/group_convolution_backprop_data.cpp b/inference-engine/tests/functional/plugin/cpu/single_layer_tests/group_convolution_backprop_data.cpp new file mode 100755 index 00000000000..f4f512d8988 --- /dev/null +++ b/inference-engine/tests/functional/plugin/cpu/single_layer_tests/group_convolution_backprop_data.cpp @@ -0,0 +1,380 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include "test_utils/cpu_test_utils.hpp" +#include "test_utils/fusing_test_utils.hpp" + +using namespace InferenceEngine; +using namespace CPUTestUtils; + +namespace CPULayerTestsDefinitions { + +using groupConvBackpropDataLayerTestParamsSet = LayerTestsDefinitions::groupConvBackpropDataLayerTestParamsSet; +using groupConvBackpropDataSpecificParams = LayerTestsDefinitions::groupConvBackpropDataSpecificParams; + +typedef std::tuple< + groupConvBackpropDataLayerTestParamsSet, + CPUSpecificParams, + fusingSpecificParams, + std::map> groupDeconvLayerCPUTestParamsSet; + +class GroupDeconvolutionLayerCPUTest : public testing::WithParamInterface, + virtual public LayerTestsUtils::LayerTestsCommon, public CpuTestWithFusing { +public: + static std::string getTestCaseName(testing::TestParamInfo obj) { + groupConvBackpropDataLayerTestParamsSet basicParamsSet; + CPUSpecificParams cpuParams; + fusingSpecificParams fusingParams; + std::map additionalConfig; + std::tie(basicParamsSet, cpuParams, fusingParams, additionalConfig) = obj.param; + + std::ostringstream result; + result << LayerTestsDefinitions::GroupConvBackpropDataLayerTest::getTestCaseName(testing::TestParamInfo( + basicParamsSet, 0)); + + result << CPUTestsBase::getTestCaseName(cpuParams); + result << CpuTestWithFusing::getTestCaseName(fusingParams); + + if (!additionalConfig.empty()) { + result << "_PluginConf"; + for (auto& item : additionalConfig) { + result << "_" << item.first << "=" << item.second; + } + } + + return result.str(); + } + +protected: + void SetUp() { + groupConvBackpropDataLayerTestParamsSet basicParamsSet; + CPUSpecificParams cpuParams; + fusingSpecificParams fusingParams; + std::map additionalConfig; + std::tie(basicParamsSet, cpuParams, fusingParams, additionalConfig) = this->GetParam(); + + configuration.insert(additionalConfig.begin(), additionalConfig.end()); + + std::tie(inFmts, outFmts, priority, selectedType) = cpuParams; + std::tie(postOpMgrPtr, fusedOps) = fusingParams; + + groupConvBackpropDataSpecificParams groupConvParams; + std::vector inputShape; + auto netPrecision = InferenceEngine::Precision::UNSPECIFIED; + std::tie(groupConvParams, netPrecision, inPrc, outPrc, inLayout, outLayout, inputShape, targetDevice) = basicParamsSet; + + if (inPrc == Precision::UNSPECIFIED) { + selectedType += std::string("_") + Precision(Precision::FP32).name(); + } else { + selectedType += std::string("_") + inPrc.name(); + } + + ngraph::op::PadType padType; + InferenceEngine::SizeVector kernel, stride, dilation; + std::vector padBegin, padEnd; + size_t convOutChannels, numGroups; + std::tie(kernel, stride, padBegin, padEnd, dilation, convOutChannels, numGroups, padType) = groupConvParams; + + auto ngPrc = FuncTestUtils::PrecisionUtils::convertIE2nGraphPrc(netPrecision); + auto params = ngraph::builder::makeParams(ngPrc, {inputShape}); + auto paramOuts = ngraph::helpers::convert2OutputVector( + ngraph::helpers::castOps2Nodes(params)); + auto groupConv = std::dynamic_pointer_cast( + ngraph::builder::makeGroupConvolutionBackpropData(paramOuts[0], ngPrc, kernel, stride, padBegin, + padEnd, dilation, padType, convOutChannels, numGroups)); + function = makeNgraphFunction(ngPrc, params, groupConv, "groupConvolutionBackpropData"); + } +}; + +TEST_P(GroupDeconvolutionLayerCPUTest, CompareWithRefs) { + SKIP_IF_CURRENT_TEST_IS_DISABLED() + + Run(); + CheckPluginRelatedResults(executableNetwork, "Deconvolution"); +} + +namespace { + +/* GROUP CONV TEST UTILS */ +std::vector filterParamsSetForDevice(std::vector paramsSet) { + std::vector resParamsSet; + const int cpuParamsIndex = 1; + const int selectedTypeIndex = 3; + + for (auto param : paramsSet) { + auto cpuParams = std::get(param); + auto selectedTypeStr = std::get(cpuParams); + + if (selectedTypeStr.find("jit") != std::string::npos && !with_cpu_x86_sse42()) + continue; + if (selectedTypeStr.find("avx512") != std::string::npos && !with_cpu_x86_avx512f()) + continue; + + resParamsSet.push_back(param); + } + + return resParamsSet; +} +/* ===================== */ + +/* COMMON PARAMS */ +std::vector fusingParamsSet { + emptyFusingSpec, + fusingScaleShift, +}; +const std::map cpuEmptyPluginConfig; +const std::map cpuBF16PluginConfig = { { PluginConfigParams::KEY_ENFORCE_BF16, PluginConfigParams::YES } }; + +/* ============= GroupConvolution params (planar layout) ============= */ +const SizeVector numOutChannels_Planar = {6}; +const SizeVector numGroups_Planar = {2, 3}; + +/* ============= GroupConvolution params (blocked layout) ============= */ +const SizeVector numOutChannels_Blocked = {64}; +const SizeVector numGroups_Blocked = {2, 4}; + +/* ============= GroupConvolution params (DW) ============= */ +const SizeVector numOutChannels_DW = {32}; +const SizeVector numGroups_DW = {32}; + +/* ============= GroupConvolution params (2D) ============= */ +const std::vector kernels2d = {{3, 3}, {1, 1}}; +const std::vector strides2d = {{1, 1}, {2, 2}}; +const std::vector> padBegins2d = {{0, 0}}; +const std::vector> padEnds2d = {{0, 0}}; +const std::vector dilations2d = {{1, 1}}; + +/* ============= GroupConvolution params (3D) ============= */ +const std::vector kernels3d = {{3, 3, 3}, {1, 1, 1}}; +const std::vector strides3d = {{1, 1, 1}, {2, 2, 2}}; +const std::vector> padBegins3d = {{0, 0, 0}}; +const std::vector> padEnds3d = {{0, 0, 0}}; +const std::vector dilations3d = {{1, 1, 1}}; +/* ============= */ + + +/* INSTANCES */ +/* ============= GroupConvolution (Planar 2D) ============= */ +const auto groupConvParams_ExplicitPadding_Planar_2D = ::testing::Combine( + ::testing::ValuesIn(kernels2d), + ::testing::ValuesIn(strides2d), + ::testing::ValuesIn(padBegins2d), + ::testing::ValuesIn(padEnds2d), + ::testing::ValuesIn(dilations2d), + ::testing::ValuesIn(numOutChannels_Planar), + ::testing::ValuesIn(numGroups_Planar), + ::testing::Values(ngraph::op::PadType::EXPLICIT) +); + +INSTANTIATE_TEST_CASE_P(smoke_GroupDeconv_2D_Planar_FP32, GroupDeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + groupConvParams_ExplicitPadding_Planar_2D, + ::testing::Values(Precision::FP32), + ::testing::Values(InferenceEngine::Precision::UNSPECIFIED), + ::testing::Values(InferenceEngine::Precision::UNSPECIFIED), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(std::vector({ 2, 12, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_gemm_2D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuEmptyPluginConfig)), + GroupDeconvolutionLayerCPUTest::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(smoke_GroupDeconv_2D_Planar_BF16, GroupDeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + groupConvParams_ExplicitPadding_Planar_2D, + ::testing::Values(Precision::FP32), + ::testing::Values(InferenceEngine::Precision::BF16), + ::testing::Values(InferenceEngine::Precision::BF16), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(std::vector({ 2, 12, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_gemm_2D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuBF16PluginConfig)), + GroupDeconvolutionLayerCPUTest::getTestCaseName); + +/* ============= GroupConvolution (Planar 3D) ============= */ +const auto groupConvParams_ExplicitPadding_Planar_3D = ::testing::Combine( + ::testing::ValuesIn(kernels3d), + ::testing::ValuesIn(strides3d), + ::testing::ValuesIn(padBegins3d), + ::testing::ValuesIn(padEnds3d), + ::testing::ValuesIn(dilations3d), + ::testing::ValuesIn(numOutChannels_Planar), + ::testing::ValuesIn(numGroups_Planar), + ::testing::Values(ngraph::op::PadType::EXPLICIT) +); + +INSTANTIATE_TEST_CASE_P(smoke_GroupDeconv_3D_Planar_FP32, GroupDeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + groupConvParams_ExplicitPadding_Planar_3D, + ::testing::Values(Precision::FP32), + ::testing::Values(InferenceEngine::Precision::UNSPECIFIED), + ::testing::Values(InferenceEngine::Precision::UNSPECIFIED), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(std::vector({ 2, 12, 7, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_gemm_3D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuEmptyPluginConfig)), + GroupDeconvolutionLayerCPUTest::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(smoke_GroupDeconv_3D_Planar_BF16, GroupDeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + groupConvParams_ExplicitPadding_Planar_3D, + ::testing::Values(Precision::FP32), + ::testing::Values(InferenceEngine::Precision::BF16), + ::testing::Values(InferenceEngine::Precision::BF16), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(std::vector({ 2, 12, 7, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_gemm_3D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuBF16PluginConfig)), + GroupDeconvolutionLayerCPUTest::getTestCaseName); + +/* ============= GroupConvolution (Blocked 2D) ============= */ +const auto groupConvParams_ExplicitPadding_Blocked_2D = ::testing::Combine( + ::testing::ValuesIn(kernels2d), + ::testing::ValuesIn(strides2d), + ::testing::ValuesIn(padBegins2d), + ::testing::ValuesIn(padEnds2d), + ::testing::ValuesIn(dilations2d), + ::testing::ValuesIn(numOutChannels_Blocked), + ::testing::ValuesIn(numGroups_Blocked), + ::testing::Values(ngraph::op::PadType::EXPLICIT) +); + +INSTANTIATE_TEST_CASE_P(smoke_GroupDeconv_2D_Blocked_FP32, GroupDeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + groupConvParams_ExplicitPadding_Blocked_2D, + ::testing::Values(Precision::FP32), + ::testing::Values(InferenceEngine::Precision::UNSPECIFIED), + ::testing::Values(InferenceEngine::Precision::UNSPECIFIED), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(std::vector({ 2, 64, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_avx512_2D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuEmptyPluginConfig)), + GroupDeconvolutionLayerCPUTest::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(smoke_GroupDeconv_2D_Blocked_BF16, GroupDeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + groupConvParams_ExplicitPadding_Blocked_2D, + ::testing::Values(Precision::FP32), + ::testing::Values(InferenceEngine::Precision::BF16), + ::testing::Values(InferenceEngine::Precision::BF16), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(std::vector({ 2, 64, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_avx512_2D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuBF16PluginConfig)), + GroupDeconvolutionLayerCPUTest::getTestCaseName); + +/* ============= GroupConvolution (Blocked 3D) ============= */ +const auto groupConvParams_ExplicitPadding_Blocked_3D = ::testing::Combine( + ::testing::ValuesIn(kernels3d), + ::testing::ValuesIn(strides3d), + ::testing::ValuesIn(padBegins3d), + ::testing::ValuesIn(padEnds3d), + ::testing::ValuesIn(dilations3d), + ::testing::ValuesIn(numOutChannels_Blocked), + ::testing::ValuesIn(numGroups_Blocked), + ::testing::Values(ngraph::op::PadType::EXPLICIT) +); + +INSTANTIATE_TEST_CASE_P(smoke_GroupDeconv_3D_Blocked_FP32, GroupDeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + groupConvParams_ExplicitPadding_Blocked_3D, + ::testing::Values(Precision::FP32), + ::testing::Values(InferenceEngine::Precision::UNSPECIFIED), + ::testing::Values(InferenceEngine::Precision::UNSPECIFIED), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(std::vector({ 2, 64, 7, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_avx512_3D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuEmptyPluginConfig)), + GroupDeconvolutionLayerCPUTest::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(smoke_GroupDeconv_3D_Blocked_BF16, GroupDeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + groupConvParams_ExplicitPadding_Blocked_3D, + ::testing::Values(Precision::FP32), + ::testing::Values(InferenceEngine::Precision::BF16), + ::testing::Values(InferenceEngine::Precision::BF16), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(std::vector({ 2, 64, 7, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_avx512_3D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuBF16PluginConfig)), + GroupDeconvolutionLayerCPUTest::getTestCaseName); + +/* ============= GroupConvolution (DW 2D) ============= */ +const auto groupConvParams_ExplicitPadding_DW_2D = ::testing::Combine( + ::testing::ValuesIn(kernels2d), + ::testing::ValuesIn(strides2d), + ::testing::ValuesIn(padBegins2d), + ::testing::ValuesIn(padEnds2d), + ::testing::ValuesIn(dilations2d), + ::testing::ValuesIn(numOutChannels_DW), + ::testing::ValuesIn(numGroups_DW), + ::testing::Values(ngraph::op::PadType::EXPLICIT) +); + +INSTANTIATE_TEST_CASE_P(smoke_GroupDeconv_2D_DW_FP32, GroupDeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + groupConvParams_ExplicitPadding_DW_2D, + ::testing::Values(Precision::FP32), + ::testing::Values(InferenceEngine::Precision::UNSPECIFIED), + ::testing::Values(InferenceEngine::Precision::UNSPECIFIED), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(std::vector({ 2, 32, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_avx512_dw_2D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuEmptyPluginConfig)), + GroupDeconvolutionLayerCPUTest::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(smoke_GroupDeconv_2D_DW_BF16, GroupDeconvolutionLayerCPUTest, + ::testing::Combine( + ::testing::Combine( + groupConvParams_ExplicitPadding_DW_2D, + ::testing::Values(Precision::FP32), + ::testing::Values(InferenceEngine::Precision::BF16), + ::testing::Values(InferenceEngine::Precision::BF16), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(InferenceEngine::Layout::ANY), + ::testing::Values(std::vector({ 2, 32, 7, 7 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ::testing::ValuesIn(filterCPUInfoForDevice({conv_avx512_dw_2D})), + ::testing::ValuesIn(fusingParamsSet), + ::testing::Values(cpuBF16PluginConfig)), + GroupDeconvolutionLayerCPUTest::getTestCaseName); +} // namespace + +} // namespace CPULayerTestsDefinitions diff --git a/inference-engine/tests/functional/plugin/cpu/test_utils/fusing_test_utils.cpp b/inference-engine/tests/functional/plugin/cpu/test_utils/fusing_test_utils.cpp index ce7b4f037e8..93fa14d9a99 100644 --- a/inference-engine/tests/functional/plugin/cpu/test_utils/fusing_test_utils.cpp +++ b/inference-engine/tests/functional/plugin/cpu/test_utils/fusing_test_utils.cpp @@ -56,8 +56,9 @@ void CpuTestWithFusing::CheckPluginRelatedResults(InferenceEngine::ExecutableNet auto layerType = getExecValue("layerType", rtInfo); if (layerType == nodeType) { auto originalLayersNames = getExecValue("originalLayersNames", rtInfo); - auto pos = originalLayersNames.find(nodeType); - ASSERT_TRUE(pos != std::string::npos) << "Node type " << nodeType << " has not been found!"; + std::string opFriendlyName = op->get_friendly_name(); + auto pos = originalLayersNames.find(opFriendlyName); + ASSERT_TRUE(pos != std::string::npos) << "Operation name " << op->get_friendly_name() << " has not been found in originalLayersNames!"; for (auto fusedOp : fusedOps) { pos = originalLayersNames.find(fusedOp, checkFusingPosition ? pos : 0); ASSERT_TRUE(pos != std::string::npos) << "Fused op " << fusedOp << " has not been found!"; diff --git a/inference-engine/tests/functional/plugin/cpu/test_utils/fusing_test_utils.hpp b/inference-engine/tests/functional/plugin/cpu/test_utils/fusing_test_utils.hpp index 241110482d9..f7e22884ea8 100644 --- a/inference-engine/tests/functional/plugin/cpu/test_utils/fusing_test_utils.hpp +++ b/inference-engine/tests/functional/plugin/cpu/test_utils/fusing_test_utils.hpp @@ -127,6 +127,25 @@ const auto fusingReluScaleShift = fusingSpecificParams{std::make_shared(ngraph::element::f32, newShape, {}, true); return std::make_shared(inpNode, constNode); }, "Add(PerChannel)"}}), {"Relu", "Add"}}; +const auto fusingScaleShift = fusingSpecificParams{ std::make_shared(std::vector{ + {[](std::shared_ptr inpNode, const ngraph::element::Type& ngPrc, ngraph::ParameterVector& params) { + auto shape = inpNode->get_shape(); + if (shape.size() == 1) + THROW_IE_EXCEPTION << "If shape.size() == 1 then Granularity can be PerTensor only"; + ngraph::Shape newShape(shape.size(), 1); + newShape[1] = shape[1]; + auto constNode = ngraph::builder::makeConstant(ngraph::element::f32, newShape, {}, true); + return std::make_shared(inpNode, constNode); + }, "Multiply(PerChannel)"}, + {[](std::shared_ptr inpNode, const ngraph::element::Type& ngPrc, ngraph::ParameterVector& params) { + auto shape = inpNode->get_shape(); + if (shape.size() == 1) + THROW_IE_EXCEPTION << "If shape.size() == 1 then Granularity can be PerTensor only"; + ngraph::Shape newShape(shape.size(), 1); + newShape[1] = shape[1]; + auto constNode = ngraph::builder::makeConstant(ngraph::element::f32, newShape, {}, true); + return std::make_shared(inpNode, constNode); + }, "Add(PerChannel)"}}), {"Add"} }; const auto fusingFakeQuantizePerChannelRelu = fusingSpecificParams{std::make_shared(std::vector{ {[](std::shared_ptr inpNode, const ngraph::element::Type& ngPrc, ngraph::ParameterVector& params){ auto localPrc = inpNode->get_element_type(); diff --git a/inference-engine/thirdparty/mkl-dnn b/inference-engine/thirdparty/mkl-dnn index 0d8def33381..5fda5037935 160000 --- a/inference-engine/thirdparty/mkl-dnn +++ b/inference-engine/thirdparty/mkl-dnn @@ -1 +1 @@ -Subproject commit 0d8def33381fe359781b036b1da840178973cb0d +Subproject commit 5fda5037935e43d716eb359edfa6125048e386e7