diff --git a/ge/graph/load/model_manager/data_dumper.cc b/ge/graph/load/model_manager/data_dumper.cc index f74272a5..0f23fa2e 100644 --- a/ge/graph/load/model_manager/data_dumper.cc +++ b/ge/graph/load/model_manager/data_dumper.cc @@ -309,14 +309,6 @@ Status DataDumper::DumpRefOutput(const DataDumper::InnerDumpInfo &inner_dump_inf Status DataDumper::DumpOutputWithTask(const InnerDumpInfo &inner_dump_info, aicpu::dump::Task &task) { const auto &output_descs = inner_dump_info.op->GetAllOutputsDesc(); const std::vector output_addrs = ModelUtils::GetOutputDataAddrs(*runtime_param_, inner_dump_info.op); - if (output_descs.size() != output_addrs.size()) { - REPORT_INNER_ERROR("E19999", "output_desc size:%zu != output addr size:%zu in op:%s(%s)", - output_descs.size(), output_addrs.size(), - inner_dump_info.op->GetName().c_str(), inner_dump_info.op->GetType().c_str()); - GELOGE(PARAM_INVALID, "Invalid output desc addrs size %zu, op %s has %zu output desc.", output_addrs.size(), - inner_dump_info.op->GetName().c_str(), output_descs.size()); - return PARAM_INVALID; - } std::vector v_memory_type; bool has_mem_type_attr = ge::AttrUtils::GetListInt(inner_dump_info.op, ATTR_NAME_OUTPUT_MEM_TYPE_LIST, v_memory_type); GE_RT_PARAM_INVALID_WITH_LOG_IF_TRUE(has_mem_type_attr && (v_memory_type.size() != output_descs.size()), @@ -324,10 +316,33 @@ Status DataDumper::DumpOutputWithTask(const InnerDumpInfo &inner_dump_info, aicp inner_dump_info.op->GetName().c_str(), output_descs.size(), v_memory_type.size()); + size_t no_need_dump_output_num = 0; for (size_t i = 0; i < output_descs.size(); ++i) { aicpu::dump::Output output; std::string node_name_index; const auto &output_desc = output_descs.at(i); + int32_t calc_type = 0; + bool has_calc_type = ge::AttrUtils::GetInt(output_desc, ATTR_NAME_MEMORY_SIZE_CALC_TYPE, calc_type); + if (has_calc_type && (calc_type == static_cast(ge::MemorySizeCalcType::ALWAYS_EMPTY))) { + GELOGD("Node[%s] output[index:%zu] [name:%s] is an optional output, don't need to dump this output.", + inner_dump_info.op->GetName().c_str(), i, output_desc.GetName().c_str()); + ++no_need_dump_output_num; + continue; + } + + if (output_descs.size() - no_need_dump_output_num < output_addrs.size()) { + REPORT_INNER_ERROR("E19999", "The number of output does not match in op:%s(%s). The size[%zu] of output which is " + "no need to dump should not greater than the size[%zu] of output descs minus the size[%zu] of " + "output which is need to dump.", inner_dump_info.op->GetName().c_str(), + inner_dump_info.op->GetType().c_str(), no_need_dump_output_num, output_descs.size(), + output_addrs.size()); + GELOGE(PARAM_INVALID, "The number of output does not match in op:%s(%s). The size[%zu] of output which is no need" + " to dump should not greater than the size[%zu] of output descs minus the size[%zu] of output which is " + "need to dump.", inner_dump_info.op->GetName().c_str(), inner_dump_info.op->GetType().c_str(), + no_need_dump_output_num, output_descs.size(), output_addrs.size()); + return PARAM_INVALID; + } + // check dump output tensor desc is redirected by attr ATTR_DATA_DUMP_REF if (AttrUtils::GetStr(&output_desc, ATTR_DATA_DUMP_REF, node_name_index)) { GE_CHK_STATUS_RET(DumpRefOutput(inner_dump_info, output, i, node_name_index), "DumpRefOutput failed"); diff --git a/tests/ut/ge/graph/load/data_dumper_unittest.cc b/tests/ut/ge/graph/load/data_dumper_unittest.cc index 68040bf1..8f46e989 100644 --- a/tests/ut/ge/graph/load/data_dumper_unittest.cc +++ b/tests/ut/ge/graph/load/data_dumper_unittest.cc @@ -38,6 +38,19 @@ std::vector stub_get_output_addrs(const RuntimeParam &model_param, Const res.emplace_back(reinterpret_cast(23333)); return res; } + +static ge::OpDescPtr CreateOpDesc(string name = "", string type = "") { + auto op_desc = std::make_shared(name, type); + op_desc->SetStreamId(0); + op_desc->SetId(0); + + op_desc->SetWorkspace({}); + op_desc->SetWorkspaceBytes({}); + op_desc->SetInputOffset({}); + op_desc->SetOutputOffset({100, 200}); + return op_desc; +} + /* TEST_F(UtestDataDumper, LoadDumpInfo_no_output_addrs_fail) { RuntimeParam rts_param; @@ -63,4 +76,24 @@ TEST_F(UtestDataDumper, UnloadDumpInfo_success) { Status ret = data_dumper.UnloadDumpInfo(); EXPECT_EQ(ret, SUCCESS); } + +TEST_F(UtestDataDumper, DumpOutputWithTask_success) { + RuntimeParam rts_param; + DataDumper data_dumper(&rts_param); + data_dumper.SetModelName("test"); + data_dumper.SetModelId(2333); + + aicpu::dump::Task task; + OpDescPtr op_desc = CreateOpDesc("conv", CONVOLUTION); + GeTensorDesc tensor_0(GeShape(), FORMAT_NCHW, DT_FLOAT); + GeTensorDesc tensor_1(GeShape(), FORMAT_NCHW, DT_FLOAT); + int32_t calc_type = 1; + ge::AttrUtils::SetInt(tensor_1, ATTR_NAME_MEMORY_SIZE_CALC_TYPE, calc_type); + op_desc->AddOutputDesc(tensor_0); + op_desc->AddOutputDesc(tensor_1); + DataDumper::InnerDumpInfo inner_dump_info; + inner_dump_info.op = op_desc; + Status ret = data_dumper.DumpOutputWithTask(inner_dump_info, task); + EXPECT_EQ(ret, SUCCESS); +} } // namespace ge