From: @tangqunzhang Reviewed-by: @xchu42,@ji_chen Signed-off-by: @ji_chentags/v1.3.0
| @@ -430,17 +430,14 @@ void SetLastUsedInputMemAttr(NodePtr &node, int input_index) { | |||||
| } | } | ||||
| auto node_op_desc = node->GetOpDesc(); | auto node_op_desc = node->GetOpDesc(); | ||||
| if (node_op_desc != nullptr) { | if (node_op_desc != nullptr) { | ||||
| auto input_desc = node_op_desc->GetInputDesc(input_index); | |||||
| if (!ge::AttrUtils::SetInt(input_desc, ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE, true)) { | |||||
| auto input_desc = node_op_desc->MutableInputDesc(input_index); | |||||
| if (!ge::AttrUtils::SetInt(*input_desc, ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE, true)) { | |||||
| GELOGW("Set %s input[%d] ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE to true failed.", node_op_desc->GetName().c_str(), | GELOGW("Set %s input[%d] ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE to true failed.", node_op_desc->GetName().c_str(), | ||||
| input_index); | input_index); | ||||
| return; | return; | ||||
| } | } | ||||
| GELOGD("Set %s input[%d] ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE to true success.", node_op_desc->GetName().c_str(), | GELOGD("Set %s input[%d] ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE to true success.", node_op_desc->GetName().c_str(), | ||||
| input_index); | input_index); | ||||
| if (node_op_desc->UpdateInputDesc(input_index, input_desc) != GRAPH_SUCCESS) { | |||||
| GELOGW("Update %s input[%d] desc failed.", node_op_desc->GetName().c_str(), input_index); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -593,9 +590,9 @@ void BlockMemAssigner::GetOutAndWorkSpaceMem(vector<int64_t> &all_memory_size) { | |||||
| } | } | ||||
| for (auto &out_anchor : n->GetAllOutDataAnchors()) { | for (auto &out_anchor : n->GetAllOutDataAnchors()) { | ||||
| GeTensorDesc output_desc = node_op_desc->GetOutputDesc(out_anchor->GetIdx()); | |||||
| auto output_desc = node_op_desc->GetOutputDescPtr(out_anchor->GetIdx()); | |||||
| int64_t size = 0; | int64_t size = 0; | ||||
| GE_IF_BOOL_EXEC(ge::TensorUtils::GetSize(output_desc, size) != SUCCESS, GELOGI("Get size failed")); | |||||
| GE_IF_BOOL_EXEC(ge::TensorUtils::GetSize(*output_desc, size) != SUCCESS, GELOGI("Get size failed")); | |||||
| GE_IF_BOOL_EXEC(size < 0, | GE_IF_BOOL_EXEC(size < 0, | ||||
| GELOGE(FAILED, "[Check][TensorSize]tensor_size:%ld is invalid, " | GELOGE(FAILED, "[Check][TensorSize]tensor_size:%ld is invalid, " | ||||
| "maybe it is unknown shape node, Node_name:%s", | "maybe it is unknown shape node, Node_name:%s", | ||||
| @@ -201,8 +201,7 @@ void ModelBuilder::SetInputIsConst(const ge::NodePtr &n) { | |||||
| } | } | ||||
| } | } | ||||
| std::string input_const_info = ToString(is_input_const); | |||||
| GELOGD("update opdesc:%s InputConst:%s", node_op_desc->GetName().c_str(), input_const_info.c_str()); | |||||
| GELOGD("update opdesc:%s InputConst:%s", node_op_desc->GetName().c_str(), ToString(is_input_const).c_str()); | |||||
| node_op_desc->SetIsInputConst(is_input_const); | node_op_desc->SetIsInputConst(is_input_const); | ||||
| } | } | ||||
| @@ -3683,33 +3683,34 @@ Status DavinciModel::NnExecute(rtStream_t stream, bool async_mode, const InputDa | |||||
| GE_CHK_STATUS_RET(InitModelStream(stream), "Init model stream failed."); | GE_CHK_STATUS_RET(InitModelStream(stream), "Init model stream failed."); | ||||
| is_dynamic_ = input_data.is_dynamic_batch; | is_dynamic_ = input_data.is_dynamic_batch; | ||||
| GE_IF_BOOL_EXEC(ProfilingManager::Instance().ProfilingModelExecuteOn(), SetProfileTime(MODEL_PRE_PROC_START)); | |||||
| bool profiling_model_execute_on = ProfilingManager::Instance().ProfilingModelExecuteOn(); | |||||
| GE_IF_BOOL_EXEC(profiling_model_execute_on, SetProfileTime(MODEL_PRE_PROC_START)); | |||||
| Status ret = CopyModelData(input_data, output_data, is_dynamic_); | Status ret = CopyModelData(input_data, output_data, is_dynamic_); | ||||
| GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(ret != SUCCESS, return ret, "Copy input data to model failed. model id: %u", | GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(ret != SUCCESS, return ret, "Copy input data to model failed. model id: %u", | ||||
| model_id_); | model_id_); | ||||
| GELOGD("current_data.index=%u", input_data.index); | GELOGD("current_data.index=%u", input_data.index); | ||||
| GE_IF_BOOL_EXEC(ProfilingManager::Instance().ProfilingModelExecuteOn(), SetProfileTime(MODEL_PRE_PROC_END)); | |||||
| GE_IF_BOOL_EXEC(profiling_model_execute_on, SetProfileTime(MODEL_PRE_PROC_END)); | |||||
| if (!task_list_.empty()) { | if (!task_list_.empty()) { | ||||
| GELOGD("rtModelExecute do"); | GELOGD("rtModelExecute do"); | ||||
| GE_IF_BOOL_EXEC(ProfilingManager::Instance().ProfilingModelExecuteOn(), SetProfileTime(MODEL_INFER_START)); | |||||
| GE_IF_BOOL_EXEC(profiling_model_execute_on, SetProfileTime(MODEL_INFER_START)); | |||||
| rtError_t rt_ret = rtModelExecute(rt_model_handle_, rt_model_stream_, 0); | rtError_t rt_ret = rtModelExecute(rt_model_handle_, rt_model_stream_, 0); | ||||
| GE_CHK_RT_EXEC(rt_ret, return RT_ERROR_TO_GE_STATUS(rt_ret)); | GE_CHK_RT_EXEC(rt_ret, return RT_ERROR_TO_GE_STATUS(rt_ret)); | ||||
| GE_IF_BOOL_EXEC(ProfilingManager::Instance().ProfilingModelExecuteOn(), SetProfileTime(MODEL_INFER_END)); | |||||
| GE_IF_BOOL_EXEC(profiling_model_execute_on, SetProfileTime(MODEL_INFER_END)); | |||||
| GELOGD("rtModelExecute end"); | GELOGD("rtModelExecute end"); | ||||
| } | } | ||||
| if (!is_async_mode_) { | if (!is_async_mode_) { | ||||
| GE_IF_BOOL_EXEC(ProfilingManager::Instance().ProfilingModelExecuteOn(), SetProfileTime(MODEL_AFTER_PROC_START)); | |||||
| GE_IF_BOOL_EXEC(profiling_model_execute_on, SetProfileTime(MODEL_AFTER_PROC_START)); | |||||
| ret = CopyOutputData(input_data.index, output_data, RT_MEMCPY_DEVICE_TO_DEVICE); | ret = CopyOutputData(input_data.index, output_data, RT_MEMCPY_DEVICE_TO_DEVICE); | ||||
| GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(ret != SUCCESS, return ACL_ERROR_GE_INTERNAL_ERROR, | GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(ret != SUCCESS, return ACL_ERROR_GE_INTERNAL_ERROR, | ||||
| "Copy Output data to user failed."); | "Copy Output data to user failed."); | ||||
| GE_IF_BOOL_EXEC(ProfilingManager::Instance().ProfilingModelExecuteOn(), SetProfileTime(MODEL_AFTER_PROC_END)); | |||||
| GE_IF_BOOL_EXEC(profiling_model_execute_on, SetProfileTime(MODEL_AFTER_PROC_END)); | |||||
| } | } | ||||
| // report model time data | // report model time data | ||||
| GE_IF_BOOL_EXEC(ProfilingManager::Instance().ProfilingModelExecuteOn(), (void)SinkTimeProfile(input_data)); | |||||
| GE_IF_BOOL_EXEC(profiling_model_execute_on, (void)SinkTimeProfile(input_data)); | |||||
| GELOGD("Model run end, model id:%u", model_id_); | GELOGD("Model run end, model id:%u", model_id_); | ||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| @@ -58,15 +58,15 @@ class ZeroCopyOffset { | |||||
| uint32_t GetDataCount() const { return data_count_; } | uint32_t GetDataCount() const { return data_count_; } | ||||
| uint32_t GetAddrCount() const { return addr_count_; } | uint32_t GetAddrCount() const { return addr_count_; } | ||||
| // value of *data_info_ from davinci_model | // value of *data_info_ from davinci_model | ||||
| std::vector<std::pair<int64_t, void *>> GetDataInfo() const { return data_info_; } | |||||
| const std::vector<std::pair<int64_t, void *>> &GetDataInfo() const { return data_info_; } | |||||
| // relative_offset from zero_copy_relative_offset_ | // relative_offset from zero_copy_relative_offset_ | ||||
| std::vector<int64_t> GetRelativeOffset() const { return relative_offset_; } | |||||
| const std::vector<int64_t> &GetRelativeOffset() const { return relative_offset_; } | |||||
| // data_size of Data/Netoutput | // data_size of Data/Netoutput | ||||
| int64_t GetDataSize() const { return data_size_; } | int64_t GetDataSize() const { return data_size_; } | ||||
| // value of *outside_addrs_ from davinci_model | // value of *outside_addrs_ from davinci_model | ||||
| const std::vector<std::map<const void *, std::vector<void *>>> &GetOutsideAddrs() const { return outside_addrs_; } | const std::vector<std::map<const void *, std::vector<void *>>> &GetOutsideAddrs() const { return outside_addrs_; } | ||||
| // name of op | // name of op | ||||
| std::string GetOpName() const { return op_name_; } | |||||
| const std::string &GetOpName() const { return op_name_; } | |||||
| const bool IsRelativeOffsetValid() const { return valid_relative_offset_; } | const bool IsRelativeOffsetValid() const { return valid_relative_offset_; } | ||||
| private: | private: | ||||
| @@ -764,6 +764,7 @@ set(MULTI_PARTS_TEST_FILES | |||||
| "common/ge_format_util_unittest.cc" | "common/ge_format_util_unittest.cc" | ||||
| "graph/variable_accelerate_ctrl_unittest.cc" | "graph/variable_accelerate_ctrl_unittest.cc" | ||||
| "graph/build/logical_stream_allocator_unittest.cc" | "graph/build/logical_stream_allocator_unittest.cc" | ||||
| "graph/build/model_builder_unittest.cc" | |||||
| "graph/build/mem_assigner_unittest.cc" | "graph/build/mem_assigner_unittest.cc" | ||||
| "graph/preprocess/graph_preprocess_unittest.cc" | "graph/preprocess/graph_preprocess_unittest.cc" | ||||
| "graph/manager/hcom_util_unittest.cc" | "graph/manager/hcom_util_unittest.cc" | ||||
| @@ -249,3 +249,17 @@ TEST_F(UtestMemoryAssignerTest, graph_memory_assign_continuous_input) { | |||||
| EXPECT_EQ(addn1->GetOpDesc()->GetOutputOffset()[0], 500); | EXPECT_EQ(addn1->GetOpDesc()->GetOutputOffset()[0], 500); | ||||
| EXPECT_EQ(addn2->GetOpDesc()->GetOutputOffset()[0], 600); | EXPECT_EQ(addn2->GetOpDesc()->GetOutputOffset()[0], 600); | ||||
| } | } | ||||
| TEST_F(UtestMemoryAssignerTest, graph_memory_set_last_used_attr) { | |||||
| ge::ComputeGraphPtr graph = make_shared<ge::ComputeGraph>(""); | |||||
| MakeGraph(graph); | |||||
| auto node_f = graph->FindNode("F"); | |||||
| MemoryAssigner memory_assigner(graph); | |||||
| map<int64_t, size_t> mem_offset; | |||||
| size_t zero_memory_size = 0; | |||||
| EXPECT_EQ(memory_assigner.AssignMemory(false, mem_offset, zero_memory_size), GRAPH_SUCCESS); | |||||
| int32_t flag = 0; | |||||
| (void) ge::AttrUtils::GetInt(node_f->GetOpDesc()->GetInputDesc(0), ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE, flag); | |||||
| EXPECT_EQ(flag, 1); | |||||
| } | |||||
| @@ -0,0 +1,146 @@ | |||||
| /** | |||||
| * 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 <gtest/gtest.h> | |||||
| #include <memory> | |||||
| #include "graph/anchor.h" | |||||
| #include "graph/attr_value.h" | |||||
| #include "graph/debug/ge_attr_define.h" | |||||
| #include "graph/utils/graph_utils.h" | |||||
| #include "graph/utils/node_utils.h" | |||||
| #include "graph/utils/op_desc_utils.h" | |||||
| #include "graph/utils/tensor_utils.h" | |||||
| #include "omg/omg_inner_types.h" | |||||
| #include "../passes/graph_builder_utils.h" | |||||
| #define protected public | |||||
| #define private public | |||||
| #include "graph/build/model_builder.h" | |||||
| #undef protected | |||||
| #undef private | |||||
| using namespace std; | |||||
| using namespace testing; | |||||
| using namespace ge; | |||||
| using domi::GetContext; | |||||
| class UtestModelBuilderTest : public testing::Test { | |||||
| public: | |||||
| ge::OpDescPtr CreateOpWithWsSize(const string &name, int64_t wsByte, const string &type = "some") { | |||||
| ge::OpDescPtr op_def = make_shared<ge::OpDesc>(name, type); | |||||
| auto desc_temp_ptr = make_shared<ge::GeTensorDesc>(); | |||||
| auto desc_temp = *desc_temp_ptr; | |||||
| TensorUtils::SetSize(desc_temp, 1024); | |||||
| op_def->AddInputDesc(desc_temp); | |||||
| op_def->AddOutputDesc(desc_temp); | |||||
| std::vector<int64_t> workspace_bytes; | |||||
| workspace_bytes.push_back(wsByte); | |||||
| op_def->SetWorkspaceBytes(workspace_bytes); | |||||
| return op_def; | |||||
| } | |||||
| ge::OpDescPtr CreateRefOpWithWsSize(const string &name, int64_t wsByte, const string &type = "some") { | |||||
| ge::OpDescPtr op_def = make_shared<ge::OpDesc>(name, type); | |||||
| auto desc_temp_ptr = make_shared<ge::GeTensorDesc>(); | |||||
| auto desc_temp = *desc_temp_ptr; | |||||
| TensorUtils::SetSize(desc_temp, 1024); | |||||
| op_def->AddInputDesc(desc_temp); | |||||
| auto desc_output_ptr = make_shared<ge::GeTensorDesc>(); | |||||
| auto desc_output = *desc_output_ptr; | |||||
| TensorUtils::SetSize(desc_output, 6500); | |||||
| ge::TensorUtils::SetReuseInput(desc_output, true); | |||||
| ge::TensorUtils::SetReuseInputIndex(desc_output, 0); | |||||
| op_def->AddOutputDesc(desc_output); | |||||
| std::vector<int64_t> workspace_bytes; | |||||
| workspace_bytes.push_back(wsByte); | |||||
| op_def->SetWorkspaceBytes(workspace_bytes); | |||||
| return op_def; | |||||
| } | |||||
| void MakeGraph(ge::ComputeGraphPtr &graph) { | |||||
| ge::OpDescPtr op_def_a = CreateOpWithWsSize("A", 6000); | |||||
| op_def_a->SetStreamId(0); | |||||
| ge::OpDescPtr op_def_b = CreateOpWithWsSize("B", 120000); | |||||
| op_def_b->SetStreamId(0); | |||||
| ge::OpDescPtr op_def_c = CreateOpWithWsSize("C", 16000); | |||||
| op_def_c->SetStreamId(1); | |||||
| ge::OpDescPtr op_def_d = CreateOpWithWsSize("D", 24000); | |||||
| op_def_d->SetStreamId(2); | |||||
| ge::OpDescPtr op_def_e = CreateOpWithWsSize("E", 24000); | |||||
| op_def_e->SetStreamId(3); | |||||
| ge::OpDescPtr op_def_f = CreateOpWithWsSize("F", 30000); | |||||
| op_def_f->SetStreamId(2); | |||||
| ge::OpDescPtr op_def_g = CreateOpWithWsSize("G", 32000); | |||||
| op_def_g->SetStreamId(3); | |||||
| ge::OpDescPtr op_def_h = CreateOpWithWsSize("H", 48000); | |||||
| op_def_h->SetStreamId(2); | |||||
| ge::OpDescPtr op_def_i = CreateOpWithWsSize("I", 60000); | |||||
| op_def_i->SetStreamId(2); | |||||
| ge::OpDescPtr op_def_j = CreateOpWithWsSize("J", 256000, NETOUTPUT); | |||||
| op_def_j->SetStreamId(3); | |||||
| // add node | |||||
| ge::NodePtr node_a = graph->AddNode(op_def_a); | |||||
| ge::NodePtr node_b = graph->AddNode(op_def_b); | |||||
| ge::NodePtr node_c = graph->AddNode(op_def_c); | |||||
| ge::NodePtr node_d = graph->AddNode(op_def_d); | |||||
| ge::NodePtr node_e = graph->AddNode(op_def_e); | |||||
| ge::NodePtr node_f = graph->AddNode(op_def_f); | |||||
| ge::NodePtr node_g = graph->AddNode(op_def_g); | |||||
| ge::NodePtr node_h = graph->AddNode(op_def_h); | |||||
| ge::NodePtr node_i = graph->AddNode(op_def_i); | |||||
| ge::NodePtr node_j = graph->AddNode(op_def_j); | |||||
| // add edge | |||||
| ge::GraphUtils::AddEdge(node_a->GetOutDataAnchor(0), node_b->GetInDataAnchor(0)); | |||||
| ge::GraphUtils::AddEdge(node_a->GetOutDataAnchor(0), node_c->GetInDataAnchor(0)); | |||||
| ge::GraphUtils::AddEdge(node_b->GetOutDataAnchor(0), node_d->GetInDataAnchor(0)); | |||||
| ge::GraphUtils::AddEdge(node_b->GetOutDataAnchor(0), node_e->GetInDataAnchor(0)); | |||||
| ge::GraphUtils::AddEdge(node_c->GetOutDataAnchor(0), node_g->GetInDataAnchor(0)); | |||||
| ge::GraphUtils::AddEdge(node_d->GetOutDataAnchor(0), node_f->GetInDataAnchor(0)); | |||||
| ge::GraphUtils::AddEdge(node_e->GetOutDataAnchor(0), node_g->GetInDataAnchor(1)); | |||||
| ge::GraphUtils::AddEdge(node_f->GetOutDataAnchor(0), node_h->GetInDataAnchor(0)); | |||||
| ge::GraphUtils::AddEdge(node_g->GetOutDataAnchor(0), node_j->GetInDataAnchor(0)); | |||||
| ge::GraphUtils::AddEdge(node_h->GetOutDataAnchor(0), node_i->GetInDataAnchor(0)); | |||||
| ge::GraphUtils::AddEdge(node_i->GetOutDataAnchor(0), node_j->GetInDataAnchor(1)); | |||||
| GetContext().out_nodes_map["H"] = {0}; | |||||
| GetContext().out_nodes_map["I"] = {0}; | |||||
| GetContext().out_nodes_map["J"] = {0}; | |||||
| graph->TopologicalSorting(); | |||||
| } | |||||
| protected: | |||||
| void SetUp() {} | |||||
| void TearDown() { GetContext().out_nodes_map.clear(); } | |||||
| }; | |||||
| // when check GetMemoryRanges return fail, Assign return fail | |||||
| TEST_F(UtestModelBuilderTest, SetInputIsConst) { | |||||
| Graph2SubGraphInfoList subgraphs; | |||||
| std::map<std::string, int> stream_max_parallel_num; | |||||
| ge::ComputeGraphPtr graph = make_shared<ge::ComputeGraph>(""); | |||||
| MakeGraph(graph); | |||||
| graph->TopologicalSorting(); | |||||
| ge::ModelBuilder builder(0, graph, subgraphs, stream_max_parallel_num, false); | |||||
| EXPECT_EQ(builder.PreBuildModel(), SUCCESS); | |||||
| } | |||||
| @@ -942,4 +942,52 @@ TEST_F(UtestDavinciModel, simple_test_gmock) { | |||||
| EXPECT_EQ(mock_stub.func2(2, 5), 1023); | EXPECT_EQ(mock_stub.func2(2, 5), 1023); | ||||
| EXPECT_EQ(mock_stub.func2(3, 5), 1023); | EXPECT_EQ(mock_stub.func2(3, 5), 1023); | ||||
| } | } | ||||
| TEST_F(UtestDavinciModel, NnExecute) { | |||||
| DavinciModel model(0, nullptr); | |||||
| ComputeGraphPtr graph = make_shared<ComputeGraph>("default"); | |||||
| ProfilingManager::Instance().is_load_profiling_ = true; | |||||
| GeModelPtr ge_model = make_shared<GeModel>(); | |||||
| ge_model->SetGraph(GraphUtils::CreateGraphFromComputeGraph(graph)); | |||||
| AttrUtils::SetInt(ge_model, ATTR_MODEL_MEMORY_SIZE, 10240); | |||||
| AttrUtils::SetInt(ge_model, ATTR_MODEL_STREAM_NUM, 1); | |||||
| shared_ptr<domi::ModelTaskDef> model_task_def = make_shared<domi::ModelTaskDef>(); | |||||
| ge_model->SetModelTaskDef(model_task_def); | |||||
| GeTensorDesc tensor(GeShape({1,4,128,128}), FORMAT_NCHW, DT_FLOAT); | |||||
| TensorUtils::SetSize(tensor, 512); | |||||
| { | |||||
| OpDescPtr op_desc = CreateOpDesc("data", DATA); | |||||
| op_desc->AddInputDesc(tensor); | |||||
| op_desc->AddOutputDesc(tensor); | |||||
| op_desc->SetInputOffset({1024}); | |||||
| op_desc->SetOutputOffset({1024}); | |||||
| NodePtr node = graph->AddNode(op_desc); // op_index = 0 | |||||
| } | |||||
| { | |||||
| OpDescPtr op_desc = CreateOpDesc("output", NETOUTPUT); | |||||
| op_desc->AddInputDesc(tensor); | |||||
| op_desc->SetInputOffset({5120}); | |||||
| op_desc->SetSrcName( { "memcpy" } ); | |||||
| op_desc->SetSrcIndex( { 0 } ); | |||||
| NodePtr node = graph->AddNode(op_desc); // op_index = 3 | |||||
| } | |||||
| EXPECT_EQ(model.Assign(ge_model), SUCCESS); | |||||
| EXPECT_EQ(model.Init(), SUCCESS); | |||||
| rtStream_t stream = nullptr; | |||||
| InputData input_data; | |||||
| OutputData output_data; | |||||
| vector<OutputTensorInfo> outputs; | |||||
| EXPECT_EQ(model.GenOutputTensorInfo(&output_data, outputs), SUCCESS); | |||||
| EXPECT_EQ(output_data.blobs.size(), 1); | |||||
| EXPECT_EQ(outputs.size(), 1); | |||||
| input_data.blobs = output_data.blobs; | |||||
| EXPECT_EQ(input_data.blobs.size(), 1); | |||||
| EXPECT_EQ(model.NnExecute(stream, false, input_data, output_data), SUCCESS); | |||||
| } | |||||
| } // namespace ge | } // namespace ge | ||||