From 20e4df34ffac19bc65223dc0899ce63987bad09c Mon Sep 17 00:00:00 2001 From: l00444296 Date: Tue, 1 Dec 2020 17:12:39 +0800 Subject: [PATCH] Feature: Support single op profiling --- ge/single_op/single_op.cc | 37 ++++++++++++++++++++++++++++++++++--- ge/single_op/single_op.h | 2 ++ ge/single_op/single_op_model.cc | 8 ++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/ge/single_op/single_op.cc b/ge/single_op/single_op.cc index 9b74039e..2dc3bb41 100755 --- a/ge/single_op/single_op.cc +++ b/ge/single_op/single_op.cc @@ -171,9 +171,7 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status SingleOp::ExecuteAsync(c if (ret != SUCCESS) { return ret; } - if (ProfilingManager::Instance().ProfilingModelExecuteOn()) { - GE_CHK_STATUS_RET_NOLOG(ProfilingTaskInfo(index)); - } + GE_CHK_STATUS_RET_NOLOG(ProfilingTaskInfo(index)); index++; } @@ -181,6 +179,9 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status SingleOp::ExecuteAsync(c } Status SingleOp::ProfilingTaskInfo(uint32_t index) { + if (!ProfilingManager::Instance().ProfilingModelExecuteOn()) { + return SUCCESS; + } if (op_name_.size() <= index) { GELOGE(ACL_ERROR_GE_PARAM_INVALID, "index[%d] is out of range of op_name_ size[%d].", index, op_name_.size()); return ACL_ERROR_GE_PARAM_INVALID; @@ -300,6 +301,36 @@ Status DynamicSingleOp::ExecuteTbeTask(const vector &input_desc, return op_task_->LaunchKernel(inputs, outputs, workspace_buffers, stream_); } +Status DynamicSingleOp::ProfilingTaskInfo() { + if (!ProfilingManager::Instance().ProfilingModelExecuteOn()) { + return SUCCESS; + } + GELOGD("ProfilingReport of op[%s] model[%s] start.", op_name_.c_str(), model_name_.c_str()); + std::vector task_desc_info; + uint32_t task_id = 0; + uint32_t stream_id = 0; + if (rtGetTaskIdAndStreamID(&task_id, &stream_id) != RT_ERROR_NONE) { + GELOGE(ACL_ERROR_GE_PARAM_INVALID, "Get task_id and stream_id failed."); + return ACL_ERROR_GE_PARAM_INVALID; + } + + TaskDescInfo tmp_task_desc_info; + tmp_task_desc_info.model_name = model_name_; + tmp_task_desc_info.op_name = op_name_; + tmp_task_desc_info.block_dim = 0; + tmp_task_desc_info.task_id = task_id; + tmp_task_desc_info.stream_id = stream_id; + GELOGD("GetTaskDescInfo of op [%s] end, task_id[%u], stream_id[%u]", op_name_.c_str(), task_id, stream_id); + task_desc_info.emplace_back(tmp_task_desc_info); + + std::vector compute_graph_info; + + auto &profiling_manager = ProfilingManager::Instance(); + profiling_manager.ReportProfilingData(model_id_, task_desc_info, compute_graph_info, + !profiling_manager.IsAclApiMode()); + return SUCCESS; +} + Status DynamicSingleOp::ExecuteAsync(const vector &input_desc, const vector &input_buffers, vector &output_desc, diff --git a/ge/single_op/single_op.h b/ge/single_op/single_op.h index ecc532de..770e6530 100755 --- a/ge/single_op/single_op.h +++ b/ge/single_op/single_op.h @@ -91,6 +91,8 @@ class DynamicSingleOp { size_t num_inputs_ = 0; size_t num_outputs_ = 0; std::string model_name_; + std::string op_name_; + uint32_t model_id_ = 0; }; } // namespace ge #endif // GE_SINGLE_OP_SINGLE_OP_H_ diff --git a/ge/single_op/single_op_model.cc b/ge/single_op/single_op_model.cc index 2439a82b..f69a273c 100755 --- a/ge/single_op/single_op_model.cc +++ b/ge/single_op/single_op_model.cc @@ -401,6 +401,8 @@ Status SingleOpModel::BuildModelTaskKernel(const TaskDef &task_def, DynamicSingl GELOGD("Building TBE task"); TbeOpTask *tbe_task = nullptr; GE_CHK_STATUS_RET_NOLOG(BuildKernelTask(task_def.kernel(), &tbe_task)); + string te_op_name = op_list_[context.op_index()]->GetName(); + single_op.op_name_ = te_op_name; single_op.op_task_.reset(tbe_task); } else if (kernel_type == cce::ccKernelType::AI_CPU || kernel_type == cce::ccKernelType::CUST_AI_CPU) { GELOGD("Building AICPU_CC task"); @@ -408,6 +410,8 @@ Status SingleOpModel::BuildModelTaskKernel(const TaskDef &task_def, DynamicSingl uint64_t dynamic_singleop_kernel_id = aicpu_kernel_id++; GELOGI("Build dynamic singleOp CCTask, kernel_id = %lu", dynamic_singleop_kernel_id); GE_CHK_STATUS_RET_NOLOG(BuildCpuKernelTask(task_def.kernel(), &task, dynamic_singleop_kernel_id)); + string aicpu_op_name = op_list_[context.op_index()]->GetName(); + single_op.op_name_ = aicpu_op_name; single_op.op_task_.reset(task); } else { GELOGE(ACL_ERROR_GE_OP_KERNEL_TYPE_INVALID, @@ -454,6 +458,8 @@ Status SingleOpModel::BuildTaskListForDynamicOp(DynamicSingleOp &single_op) { const TaskDef ©_task_def = tasks[i]; GE_CHK_STATUS_RET_NOLOG(aicpu_task->SetMemCopyTask(copy_task_def.kernel_ex())); } + string op_name = op_list_[task_def.kernel_ex().op_index()]->GetName(); + single_op.op_name_ = op_name; single_op.op_task_.reset(aicpu_task); } else { // skip @@ -466,6 +472,8 @@ Status SingleOpModel::BuildTaskListForDynamicOp(DynamicSingleOp &single_op) { Status SingleOpModel::BuildDynamicOp(DynamicSingleOp &single_op) { single_op.num_inputs_ = data_ops_.size(); single_op.num_outputs_ = netoutput_op_->GetAllInputsSize(); + single_op.model_name_ = model_name_; + single_op.model_id_ = model_id_; ParseOpModelParams(model_helper_, model_params_); return BuildTaskListForDynamicOp(single_op); }