/** * Copyright 2019-2020 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #define protected public #define private public #include "graph/passes/folding_kernel/expanddims_kernel.h" #include "common/debug/log.h" #include "common/debug/memory_dumper.h" #include "common/fp16_t.h" #include "common/ge_inner_error_codes.h" #include "common/op/ge_op_utils.h" #include "common/types.h" #include "graph/types.h" #include "graph/utils/graph_utils.h" #include "graph/utils/op_desc_utils.h" #include "inc/kernel_factory.h" #undef protected #undef private using namespace testing; using namespace ge; class UtestGraphPassesFoldingKernelExpandDimsKernel : public testing::Test { protected: void SetUp() {} void TearDown() {} template void TestExpandDims(vector &data_vec, vector &dim_value_vec, vector &result) { ge::ComputeGraphPtr graph = std::make_shared("default"); ge::OpDescPtr data_op_desc = std::make_shared("data", CONSTANTOP); int64_t dims_size = 1; for_each(data_vec.begin(), data_vec.end(), [&](int64_t &data) { dims_size *= data; }); vector data_value_vec(dims_size, 1); GeTensorDesc data_tensor_desc(GeShape(data_vec), FORMAT_NCHW, data_type); GeTensorPtr data_tensor = std::make_shared(data_tensor_desc, (uint8_t *)data_value_vec.data(), data_value_vec.size() * sizeof(inner_data_type)); OpDescUtils::SetWeights(data_op_desc, data_tensor); data_op_desc->AddOutputDesc(data_tensor_desc); NodePtr data_node = graph->AddNode(data_op_desc); data_node->Init(); // add dim node ge::OpDescPtr dim_op_desc = std::make_shared("dim", CONSTANTOP); GeTensorDesc dim_tensor_desc(ge::GeShape(), FORMAT_NCHW, dim_type); GeTensorPtr dim_tensor = std::make_shared(dim_tensor_desc, (uint8_t *)dim_value_vec.data(), dim_value_vec.size() * sizeof(inner_dim_type)); OpDescUtils::SetWeights(dim_op_desc, dim_tensor); dim_op_desc->AddOutputDesc(dim_tensor_desc); NodePtr dim_node = graph->AddNode(dim_op_desc); dim_node->Init(); // add expanddims node OpDescPtr expanddim_op_desc = std::make_shared("Expanddims", EXPANDDIMS); expanddim_op_desc->AddInputDesc(data_tensor_desc); expanddim_op_desc->AddInputDesc(dim_tensor_desc); NodePtr op_node = graph->AddNode(expanddim_op_desc); op_node->Init(); // add edge GraphUtils::AddEdge(data_node->GetOutDataAnchor(0), op_node->GetInDataAnchor(0)); GraphUtils::AddEdge(dim_node->GetOutDataAnchor(0), op_node->GetInDataAnchor(1)); shared_ptr kernel = KernelFactory::Instance().Create(EXPANDDIMS); Status status = kernel->Compute(op_node); EXPECT_EQ(ge::SUCCESS, status); } template void TestInvalidExpandDims(vector &data_vec, vector &dim_value_vec, vector &result) { ge::ComputeGraphPtr graph = std::make_shared("default"); ge::OpDescPtr data_op_desc = std::make_shared("data", CONSTANTOP); int64_t dims_size = 1; for_each(data_vec.begin(), data_vec.end(), [&](int64_t &data) { dims_size *= data; }); vector data_value_vec(dims_size, 1); GeTensorDesc data_tensor_desc(GeShape(data_vec), format, data_type); GeTensorPtr data_tensor = std::make_shared(data_tensor_desc, (uint8_t *)data_value_vec.data(), data_value_vec.size() * sizeof(inner_data_type)); OpDescUtils::SetWeights(data_op_desc, data_tensor); data_op_desc->AddOutputDesc(data_tensor_desc); NodePtr data_node = graph->AddNode(data_op_desc); data_node->Init(); // add dim node ge::OpDescPtr dim_op_desc = std::make_shared("dim", CONSTANTOP); GeTensorDesc dim_tensor_desc(ge::GeShape(), format, dim_type); GeTensorPtr dim_tensor = std::make_shared(dim_tensor_desc, (uint8_t *)dim_value_vec.data(), dim_value_vec.size() * sizeof(inner_dim_type)); OpDescUtils::SetWeights(dim_op_desc, dim_tensor); dim_op_desc->AddOutputDesc(dim_tensor_desc); NodePtr dim_node = graph->AddNode(dim_op_desc); dim_node->Init(); // add expanddims node OpDescPtr expanddim_op_desc = std::make_shared("Expanddims", EXPANDDIMS); expanddim_op_desc->AddInputDesc(data_tensor_desc); expanddim_op_desc->AddInputDesc(dim_tensor_desc); NodePtr op_node = graph->AddNode(expanddim_op_desc); op_node->Init(); // add edge GraphUtils::AddEdge(data_node->GetOutDataAnchor(0), op_node->GetInDataAnchor(0)); GraphUtils::AddEdge(dim_node->GetOutDataAnchor(0), op_node->GetInDataAnchor(1)); shared_ptr kernel = KernelFactory::Instance().Create(EXPANDDIMS); Status status = kernel->Compute(op_node); EXPECT_NE(ge::SUCCESS, status); vector input = {data_tensor}; vector outputs; status = kernel->Compute(op_node->GetOpDesc(), input, outputs); EXPECT_EQ(NOT_CHANGED, status); } }; TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, Int8Int32Case0) { vector data_vec = {2, 3}; vector dim_value_vec = {0}; vector result = {1, 2, 3}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, Int8Int32Case1) { vector data_vec = {2, 3}; vector dim_value_vec = {1}; vector result = {2, 1, 3}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, Int8Int32Case2) { vector data_vec = {2, 3}; vector dim_value_vec = {2}; vector result = {2, 3, 1}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, Int8Int32NegativeCase1) { vector data_vec = {2, 3}; vector dim_value_vec = {-3}; vector result = {1, 2, 3}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, Int8Int32NegativeCase2) { vector data_vec = {2, 3}; vector dim_value_vec = {-2}; vector result = {2, 1, 3}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, Int8Int32NegativeCase3) { vector data_vec = {2, 3}; vector dim_value_vec = {-1}; vector result = {2, 3, 1}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, Int16Int32) { vector data_vec = {3}; vector dim_value_vec = {-1}; vector result = {3, 1}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, Int32Int32) { vector data_vec = {3, 3, 3, 5, 6}; vector dim_value_vec = {3}; vector result = {3, 3, 3, 1, 5, 6}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, Int64Int32) { vector data_vec = {6, 1, 12, 3, 4, 56, 7}; vector dim_value_vec = {7}; vector result = {6, 1, 12, 3, 4, 56, 7, 1}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, Uint8Int32) { vector data_vec = {2, 3}; vector dim_value_vec = {-1}; vector result = {2, 3, 1}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, Uint16Int32) { vector data_vec = {3}; vector dim_value_vec = {-1}; vector result = {3, 1}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, Uint32Int32) { vector data_vec = {3, 3, 3, 5, 6}; vector dim_value_vec = {3}; vector result = {3, 3, 3, 1, 5, 6}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, Uint64Int32) { vector data_vec = {6, 1, 12, 3, 4, 56, 7}; vector dim_value_vec = {7}; vector result = {6, 1, 12, 3, 4, 56, 7, 1}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, Fp16Int32) { vector data_vec = {6, 1, 12, 3, 4, 56, 7}; vector dim_value_vec = {7}; vector result = {6, 1, 12, 3, 4, 56, 7, 1}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, FloatInt32) { vector data_vec = {1, 1, 1, 11, 1, 1, 1}; vector dim_value_vec = {7}; vector result = {1, 1, 1, 11, 1, 1, 1, 1}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, DoubleInt32) { vector data_vec = {1, 1, 1, 11, 1, 1, 1}; vector dim_value_vec = {7}; vector result = {1, 1, 1, 11, 1, 1, 1, 1}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, DoubleInt64) { vector data_vec = {1, 1, 1, 11, 1, 1, 1}; vector dim_value_vec = {7}; vector result = {1, 1, 1, 11, 1, 1, 1, 1}; TestExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, BoolInt64) { vector data_vec = {1, 1, 1, 11, 1, 1, 1}; vector dim_value_vec = {7}; vector result = {1, 1, 1, 11, 1, 1, 1, 1}; ge::ComputeGraphPtr graph = std::make_shared("default"); ge::OpDescPtr data_op_desc = std::make_shared("data", CONSTANTOP); int64_t dims_size = 1; for_each(data_vec.begin(), data_vec.end(), [&](int64_t &data) { dims_size *= data; }); vector data_value_vec(dims_size, 1); GeTensorDesc data_tensor_desc(GeShape(data_vec), FORMAT_NCHW, DT_BOOL); GeTensorPtr data_tensor = std::make_shared(data_tensor_desc, (uint8_t *)data_value_vec.data(), data_value_vec.size() * sizeof(uint8_t)); OpDescUtils::SetWeights(data_op_desc, data_tensor); data_op_desc->AddOutputDesc(data_tensor_desc); NodePtr data_node = graph->AddNode(data_op_desc); data_node->Init(); // add dim node ge::OpDescPtr dim_op_desc = std::make_shared("dim", CONSTANTOP); GeTensorDesc dim_tensor_desc(ge::GeShape(), FORMAT_NCHW, DT_INT64); GeTensorPtr dim_tensor = std::make_shared(dim_tensor_desc, (uint8_t *)dim_value_vec.data(), dim_value_vec.size() * sizeof(int64_t)); OpDescUtils::SetWeights(dim_op_desc, dim_tensor); dim_op_desc->AddOutputDesc(dim_tensor_desc); NodePtr dim_node = graph->AddNode(dim_op_desc); dim_node->Init(); // add expanddims node OpDescPtr expanddim_op_desc = std::make_shared("Expanddims", EXPANDDIMS); expanddim_op_desc->AddInputDesc(data_tensor_desc); expanddim_op_desc->AddInputDesc(dim_tensor_desc); NodePtr op_node = graph->AddNode(expanddim_op_desc); op_node->Init(); // add edge GraphUtils::AddEdge(data_node->GetOutDataAnchor(0), op_node->GetInDataAnchor(0)); GraphUtils::AddEdge(dim_node->GetOutDataAnchor(0), op_node->GetInDataAnchor(1)); shared_ptr kernel = KernelFactory::Instance().Create(EXPANDDIMS); Status status = kernel->Compute(op_node); EXPECT_EQ(ge::SUCCESS, status); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, InvalidFormat) { vector data_vec = {2, 3, 4}; vector dim_value_vec = {0}; vector result = {1, 2, 3, 4}; TestInvalidExpandDims(data_vec, dim_value_vec, result); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, NodeIsNull) { NodePtr op_node = nullptr; shared_ptr kernel = KernelFactory::Instance().Create(EXPANDDIMS); Status status = kernel->Compute(op_node); EXPECT_NE(domi::PARAM_INVALID, status); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, InvalidInputNodeSize) { vector data_vec = {1, 1, 1, 11, 1, 1, 1}; vector dim_value_vec = {7}; vector result = {1, 1, 1, 11, 1, 1, 1, 1}; ge::ComputeGraphPtr graph = std::make_shared("default"); ge::OpDescPtr data_op_desc = std::make_shared("data", CONSTANTOP); int64_t dims_size = 1; for_each(data_vec.begin(), data_vec.end(), [&](int64_t &data) { dims_size *= data; }); vector data_value_vec(dims_size, 1); GeTensorDesc data_tensor_desc(GeShape(data_vec), FORMAT_NCHW, DT_BOOL); GeTensorPtr data_tensor = std::make_shared(data_tensor_desc, (uint8_t *)data_value_vec.data(), data_value_vec.size() * sizeof(uint8_t)); OpDescUtils::SetWeights(data_op_desc, data_tensor); data_op_desc->AddOutputDesc(data_tensor_desc); NodePtr data_node = graph->AddNode(data_op_desc); data_node->Init(); // add dim node ge::OpDescPtr dim_op_desc = std::make_shared("dim", CONSTANTOP); GeTensorDesc dim_tensor_desc(ge::GeShape(), FORMAT_NCHW, DT_INT64); GeTensorPtr dim_tensor = std::make_shared(dim_tensor_desc, (uint8_t *)dim_value_vec.data(), dim_value_vec.size() * sizeof(int64_t)); OpDescUtils::SetWeights(dim_op_desc, dim_tensor); dim_op_desc->AddOutputDesc(dim_tensor_desc); NodePtr dim_node = graph->AddNode(dim_op_desc); dim_node->Init(); // add expanddims node OpDescPtr expanddim_op_desc = std::make_shared("Expanddims", EXPANDDIMS); expanddim_op_desc->AddInputDesc(data_tensor_desc); expanddim_op_desc->AddInputDesc(dim_tensor_desc); NodePtr op_node = graph->AddNode(expanddim_op_desc); op_node->Init(); // add edge GraphUtils::AddEdge(data_node->GetOutDataAnchor(0), op_node->GetInDataAnchor(0)); shared_ptr kernel = KernelFactory::Instance().Create(EXPANDDIMS); Status status = kernel->Compute(op_node); EXPECT_NE(ge::SUCCESS, status); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, DimNodeNotContainWeight) { vector data_vec = {1, 1, 1, 11, 1, 1, 1}; vector dim_value_vec = {7}; vector result = {1, 1, 1, 11, 1, 1, 1, 1}; ge::ComputeGraphPtr graph = std::make_shared("default"); ge::OpDescPtr data_op_desc = std::make_shared("data", CONSTANTOP); int64_t dims_size = 1; for_each(data_vec.begin(), data_vec.end(), [&](int64_t &data) { dims_size *= data; }); vector data_value_vec(dims_size, 1); GeTensorDesc data_tensor_desc(GeShape(data_vec), FORMAT_NCHW, DT_INT32); GeTensorPtr data_tensor = std::make_shared(data_tensor_desc, (uint8_t *)data_value_vec.data(), data_value_vec.size() * sizeof(int32_t)); OpDescUtils::SetWeights(data_op_desc, data_tensor); data_op_desc->AddOutputDesc(data_tensor_desc); NodePtr data_node = graph->AddNode(data_op_desc); data_node->Init(); // add dim node ge::OpDescPtr dim_op_desc = std::make_shared("dim", "dim"); GeTensorDesc dim_tensor_desc(ge::GeShape(), FORMAT_NCHW, DT_INT32); GeTensorPtr dim_tensor = std::make_shared(dim_tensor_desc, (uint8_t *)dim_value_vec.data(), dim_value_vec.size() * sizeof(int32_t)); OpDescUtils::SetWeights(dim_op_desc, dim_tensor); dim_op_desc->AddOutputDesc(dim_tensor_desc); NodePtr dim_node = graph->AddNode(dim_op_desc); dim_node->Init(); // add expanddims node OpDescPtr expanddim_op_desc = std::make_shared("Expanddims", EXPANDDIMS); expanddim_op_desc->AddInputDesc(data_tensor_desc); expanddim_op_desc->AddInputDesc(dim_tensor_desc); NodePtr op_node = graph->AddNode(expanddim_op_desc); op_node->Init(); // add edge GraphUtils::AddEdge(data_node->GetOutDataAnchor(0), op_node->GetInDataAnchor(0)); GraphUtils::AddEdge(dim_node->GetOutDataAnchor(0), op_node->GetInDataAnchor(1)); shared_ptr kernel = KernelFactory::Instance().Create(EXPANDDIMS); Status status = kernel->Compute(op_node); EXPECT_NE(ge::SUCCESS, status); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, FoldingInt64Success) { vector data_vec = {1, 1, 1, 11, 1, 1, 1}; vector dim_value_vec = {7}; vector result = {1, 1, 1, 11, 1, 1, 1, 1}; ge::ComputeGraphPtr graph = std::make_shared("default"); ge::OpDescPtr data_op_desc = std::make_shared("data", CONSTANTOP); int64_t dims_size = 1; for_each(data_vec.begin(), data_vec.end(), [&](int64_t &data) { dims_size *= data; }); vector data_value_vec(dims_size, 1); GeTensorDesc data_tensor_desc(GeShape(data_vec), FORMAT_NCHW, DT_BOOL); GeTensorPtr data_tensor = std::make_shared(data_tensor_desc, (uint8_t *)data_value_vec.data(), data_value_vec.size() * sizeof(uint8_t)); OpDescUtils::SetWeights(data_op_desc, data_tensor); data_op_desc->AddOutputDesc(data_tensor_desc); NodePtr data_node = graph->AddNode(data_op_desc); data_node->Init(); // add dim node ge::OpDescPtr dim_op_desc = std::make_shared("dim", CONSTANTOP); GeTensorDesc dim_tensor_desc(ge::GeShape(), FORMAT_NCHW, DT_INT64); GeTensorPtr dim_tensor = std::make_shared(dim_tensor_desc, (uint8_t *)dim_value_vec.data(), dim_value_vec.size() * sizeof(int64_t)); OpDescUtils::SetWeights(dim_op_desc, dim_tensor); dim_op_desc->AddOutputDesc(dim_tensor_desc); NodePtr dim_node = graph->AddNode(dim_op_desc); dim_node->Init(); // add expanddims node OpDescPtr expanddim_op_desc = std::make_shared("Expanddims", EXPANDDIMS); expanddim_op_desc->AddInputDesc(data_tensor_desc); expanddim_op_desc->AddInputDesc(dim_tensor_desc); expanddim_op_desc->AddOutputDesc(data_tensor_desc); NodePtr op_node = graph->AddNode(expanddim_op_desc); op_node->Init(); // add edge GraphUtils::AddEdge(data_node->GetOutDataAnchor(0), op_node->GetInDataAnchor(0)); GraphUtils::AddEdge(dim_node->GetOutDataAnchor(0), op_node->GetInDataAnchor(1)); shared_ptr kernel = KernelFactory::Instance().Create(EXPANDDIMS); vector input = {data_tensor, dim_tensor}; vector outputs; Status status = kernel->Compute(op_node->GetOpDesc(), input, outputs); EXPECT_EQ(ge::SUCCESS, status); } TEST_F(UtestGraphPassesFoldingKernelExpandDimsKernel, OpdescInvalidCauseFailure) { ge::OpDescPtr null_op_desc = nullptr; vector input = {}; vector outputs; shared_ptr kernel = KernelFactory::Instance().Create(EXPANDDIMS); Status status = kernel->Compute(null_op_desc, input, outputs); EXPECT_EQ(ge::PARAM_INVALID, status); }