/** * 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 private public #define protected public #include "graph/utils/graph_utils.h" #include "common/profiling/profiling_manager.h" #include "graph/load/new_model_manager/davinci_model.h" using namespace std; namespace ge { extern OpDescPtr CreateOpDesc(string name, string type); class UtestDavinciModel : public testing::Test { protected: void SetUp() {} void TearDown() {} }; TEST_F(UtestDavinciModel, init_success) { DavinciModel model(0, nullptr); ComputeGraphPtr graph = make_shared("default"); ProfilingManager::Instance().is_load_profiling_ = true; GeModelPtr ge_model = make_shared(); ge_model->SetGraph(GraphUtils::CreateGraphFromComputeGraph(graph)); AttrUtils::SetInt(ge_model, ATTR_MODEL_MEMORY_SIZE, 5120000); AttrUtils::SetInt(ge_model, ATTR_MODEL_STREAM_NUM, 1); shared_ptr model_task_def = make_shared(); ge_model->SetModelTaskDef(model_task_def); GeTensorDesc tensor(GeShape(), FORMAT_NCHW, DT_FLOAT); TensorUtils::SetSize(tensor, 512); OpDescPtr op_input = CreateOpDesc("data", DATA); op_input->AddInputDesc(tensor); op_input->AddOutputDesc(tensor); op_input->SetInputOffset({1024}); op_input->SetOutputOffset({1024}); NodePtr node_input = graph->AddNode(op_input); // op_index = 0 OpDescPtr op_kernel = CreateOpDesc("square", "Square"); op_kernel->AddInputDesc(tensor); op_kernel->AddOutputDesc(tensor); op_kernel->SetInputOffset({1024}); op_kernel->SetOutputOffset({1024}); NodePtr node_kernel = graph->AddNode(op_kernel); // op_index = 1 OpDescPtr op_memcpy = CreateOpDesc("memcpy", MEMCPYASYNC); op_memcpy->AddInputDesc(tensor); op_memcpy->AddOutputDesc(tensor); op_memcpy->SetInputOffset({1024}); op_memcpy->SetOutputOffset({5120}); NodePtr node_memcpy = graph->AddNode(op_memcpy); // op_index = 2 OpDescPtr op_output = CreateOpDesc("output", NETOUTPUT); op_output->AddInputDesc(tensor); op_output->SetInputOffset({5120}); op_output->SetSrcName( { "memcpy" } ); op_output->SetSrcIndex( { 0 } ); NodePtr node_output = graph->AddNode(op_output); // op_index = 3 domi::TaskDef *task_def1 = model_task_def->add_task(); task_def1->set_stream_id(0); task_def1->set_type(RT_MODEL_TASK_KERNEL); domi::KernelDef *kernel_def = task_def1->mutable_kernel(); kernel_def->set_stub_func("stub_func"); kernel_def->set_args_size(64); string args(64, '1'); kernel_def->set_args(args.data(), 64); domi::KernelContext *context = kernel_def->mutable_context(); context->set_op_index(1); context->set_kernel_type(2); // ccKernelType::TE uint16_t args_offset[9] = {0}; context->set_args_offset(args_offset, 9 * sizeof(uint16_t)); domi::TaskDef *task_def2 = model_task_def->add_task(); task_def2->set_stream_id(0); task_def2->set_type(RT_MODEL_TASK_MEMCPY_ASYNC); domi::MemcpyAsyncDef *memcpy_async = task_def2->mutable_memcpy_async(); memcpy_async->set_src(1024); memcpy_async->set_dst(5120); memcpy_async->set_dst_max(512); memcpy_async->set_count(1); memcpy_async->set_kind(RT_MEMCPY_DEVICE_TO_DEVICE); memcpy_async->set_op_index(2); EXPECT_EQ(model.Assign(ge_model), SUCCESS); EXPECT_EQ(model.Init(), SUCCESS); EXPECT_EQ(model.input_addrs_list_.size(), 1); EXPECT_EQ(model.output_addrs_list_.size(), 1); EXPECT_EQ(model.task_list_.size(), 2); OutputData output_data; vector outputs; EXPECT_EQ(model.GenOutputTensorInfo(&output_data, outputs), SUCCESS); EXPECT_EQ(output_data.blobs.size(), 1); EXPECT_EQ(outputs.size(), 1); ProfilingManager::Instance().is_load_profiling_ = false; } TEST_F(UtestDavinciModel, init_data_op) { DavinciModel model(0, nullptr); model.ge_model_ = make_shared(); model.runtime_param_.mem_base = (uint8_t *)0x08000000; model.runtime_param_.mem_size = 5120000; ComputeGraphPtr graph = make_shared("default"); OpDescPtr op_input = CreateOpDesc("data", DATA); GeTensorDesc tensor(GeShape(), FORMAT_NCHW, DT_FLOAT); TensorUtils::SetSize(tensor, 512); op_input->AddInputDesc(tensor); op_input->AddOutputDesc(tensor); op_input->SetInputOffset({1024}); op_input->SetOutputOffset({5120}); NodePtr node_input = graph->AddNode(op_input); OpDescPtr op_output = CreateOpDesc("output", NETOUTPUT); op_output->AddInputDesc(tensor); op_output->SetInputOffset({1024}); op_output->SetSrcName( { "data" } ); op_output->SetSrcIndex( { 0 } ); NodePtr node_output = graph->AddNode(op_output); EXPECT_EQ(model.InitNodes(graph), SUCCESS); EXPECT_EQ(model.input_addrs_list_.size(), 1); EXPECT_EQ(model.output_addrs_list_.size(), 1); EXPECT_EQ(model.op_list_.size(), 2); } TEST_F(UtestDavinciModel, init_data_op_subgraph) { DavinciModel model(0, nullptr); model.runtime_param_.mem_base = (uint8_t *)0x08000000; model.runtime_param_.mem_size = 5120000; ComputeGraphPtr graph = make_shared("default"); OpDescPtr op_input = CreateOpDesc("data", DATA); GeTensorDesc tensor(GeShape(), FORMAT_NCHW, DT_FLOAT); op_input->AddInputDesc(tensor); op_input->AddOutputDesc(tensor); op_input->SetInputOffset({1024}); op_input->SetOutputOffset({5120}); NodePtr node = graph->AddNode(op_input); uint32_t data_op_index = 0; map data_by_index; EXPECT_EQ(model.InitDataOp(nullptr, node, data_op_index, data_by_index), SUCCESS); EXPECT_EQ(model.input_addrs_list_.size(), 0); EXPECT_EQ(model.output_addrs_list_.size(), 0); EXPECT_EQ(data_op_index, 0); EXPECT_TRUE(data_by_index.empty()); } TEST_F(UtestDavinciModel, init_netoutput_op_subgraph) { DavinciModel model(0, nullptr); model.runtime_param_.mem_base = (uint8_t *)0x08000000; model.runtime_param_.mem_size = 5120000; ComputeGraphPtr graph = make_shared("default"); OpDescPtr op_output = CreateOpDesc("output", NETOUTPUT); GeTensorDesc tensor(GeShape(), FORMAT_NCHW, DT_FLOAT); op_output->AddInputDesc(tensor); op_output->SetInputOffset({1024}); op_output->SetSrcName( { "data" } ); op_output->SetSrcIndex( { 0 } ); NodePtr node = graph->AddNode(op_output); std::vector output_op_list; EXPECT_EQ(model.InitNetOutput(nullptr, node, output_op_list), SUCCESS); EXPECT_EQ(model.input_addrs_list_.size(), 0); EXPECT_EQ(model.output_addrs_list_.size(), 0); EXPECT_TRUE(output_op_list.empty()); } TEST_F(UtestDavinciModel, init_unknown) { DavinciModel model(0, nullptr); model.SetKnownNode(true); ComputeGraphPtr graph = make_shared("default"); GeModelPtr ge_model = make_shared(); ge_model->SetGraph(GraphUtils::CreateGraphFromComputeGraph(graph)); AttrUtils::SetInt(ge_model, ATTR_MODEL_MEMORY_SIZE, 5120000); AttrUtils::SetInt(ge_model, ATTR_MODEL_STREAM_NUM, 1); shared_ptr model_task_def = make_shared(); ge_model->SetModelTaskDef(model_task_def); GeTensorDesc tensor(GeShape(), FORMAT_NCHW, DT_FLOAT); TensorUtils::SetSize(tensor, 512); OpDescPtr op_input = CreateOpDesc("data", DATA); op_input->AddInputDesc(tensor); op_input->AddOutputDesc(tensor); op_input->SetInputOffset({1024}); op_input->SetOutputOffset({1024}); NodePtr node_input = graph->AddNode(op_input); // op_index = 0 OpDescPtr op_kernel = CreateOpDesc("square", "Square"); op_kernel->AddInputDesc(tensor); op_kernel->AddOutputDesc(tensor); op_kernel->SetInputOffset({1024}); op_kernel->SetOutputOffset({1024}); NodePtr node_kernel = graph->AddNode(op_kernel); // op_index = 1 OpDescPtr op_memcpy = CreateOpDesc("memcpy", MEMCPYASYNC); op_memcpy->AddInputDesc(tensor); op_memcpy->AddOutputDesc(tensor); op_memcpy->SetInputOffset({1024}); op_memcpy->SetOutputOffset({5120}); NodePtr node_memcpy = graph->AddNode(op_memcpy); // op_index = 2 OpDescPtr op_output = CreateOpDesc("output", NETOUTPUT); op_output->AddInputDesc(tensor); op_output->SetInputOffset({5120}); op_output->SetSrcName( { "memcpy" } ); op_output->SetSrcIndex( { 0 } ); NodePtr node_output = graph->AddNode(op_output); // op_index = 3 domi::TaskDef *task_def1 = model_task_def->add_task(); task_def1->set_stream_id(0); task_def1->set_type(RT_MODEL_TASK_KERNEL); domi::KernelDef *kernel_def = task_def1->mutable_kernel(); kernel_def->set_stub_func("stub_func"); kernel_def->set_args_size(64); string args(64, '1'); kernel_def->set_args(args.data(), 64); domi::KernelContext *context = kernel_def->mutable_context(); context->set_op_index(1); context->set_kernel_type(2); // ccKernelType::TE uint16_t args_offset[9] = {0}; context->set_args_offset(args_offset, 9 * sizeof(uint16_t)); domi::TaskDef *task_def2 = model_task_def->add_task(); task_def2->set_stream_id(0); task_def2->set_type(RT_MODEL_TASK_MEMCPY_ASYNC); domi::MemcpyAsyncDef *memcpy_async = task_def2->mutable_memcpy_async(); memcpy_async->set_src(1024); memcpy_async->set_dst(5120); memcpy_async->set_dst_max(512); memcpy_async->set_count(1); memcpy_async->set_kind(RT_MEMCPY_DEVICE_TO_DEVICE); memcpy_async->set_op_index(2); EXPECT_EQ(model.Assign(ge_model), SUCCESS); EXPECT_EQ(model.Init(), SUCCESS); EXPECT_EQ(model.input_addrs_list_.size(), 1); EXPECT_EQ(model.output_addrs_list_.size(), 1); EXPECT_EQ(model.task_list_.size(), 2); EXPECT_EQ(model.task_list_[0]->UpdateArgs(), SUCCESS); EXPECT_EQ(model.task_list_[1]->UpdateArgs(), SUCCESS); vector out_shape_info; model.GetModelAttr(out_shape_info); vector input_descs; vector output_descs; EXPECT_EQ(model.GetInputOutputDescInfo(input_descs, output_descs), SUCCESS); int32_t virtual_addr = 0; const vector inputs = { &virtual_addr }; const vector outputs = { &virtual_addr }; EXPECT_EQ(model.UpdateKnownNodeArgs(inputs, outputs), SUCCESS); } TEST_F(UtestDavinciModel, ReturnNoOutput_test) { DavinciModel model(0, nullptr); GeTensorDesc tensor(GeShape(), FORMAT_NCHW, DT_FLOAT); TensorUtils::SetSize(tensor, 512); OpDescPtr var1 = CreateOpDesc("var1", VARIABLE); var1->AddInputDesc(tensor); var1->AddOutputDesc(tensor); var1->SetInputOffset({1024}); var1->SetOutputOffset({1024}); model.variable_op_list_.push_back(var1); EXPECT_EQ(model.ReturnNoOutput(1), PARAM_INVALID); } TEST_F(UtestDavinciModel, SyncVarData_test) { DavinciModel model(0, nullptr); GeTensorDesc tensor(GeShape(), FORMAT_NCHW, DT_FLOAT); TensorUtils::SetSize(tensor, 512); OpDescPtr var1 = CreateOpDesc("var1", VARIABLE); var1->AddInputDesc(tensor); var1->AddOutputDesc(tensor); var1->SetInputOffset({1024}); var1->SetOutputOffset({1024}); model.variable_op_list_.push_back(var1); EXPECT_NE(model.SyncVarData(), SUCCESS); } } // namespace ge