|
|
|
@ -111,6 +111,9 @@ const char *const kWorkSpaceSize = "workspace_size";
|
|
|
|
|
const char *const kTotalSize = "total_size";
|
|
|
|
|
const char *const kTaskCount = "task_count";
|
|
|
|
|
const char *const kTaskId = "task_id";
|
|
|
|
|
const char *const kIndexId = "index_id";
|
|
|
|
|
const char *const kTimeStamp = "time_stamp";
|
|
|
|
|
const char *const kTagId = "tag_id";
|
|
|
|
|
const char* const kRequestId = "request_id";
|
|
|
|
|
const char* const kThreadId = "thread_id";
|
|
|
|
|
const char* const kInputBeginTime = "input_begin_time";
|
|
|
|
@ -152,6 +155,10 @@ inline bool IsNoTaskAndDumpNeeded(const OpDescPtr &op_desc) {
|
|
|
|
|
(void)ge::AttrUtils::GetBool(op_desc, ATTR_NO_TASK_AND_DUMP_NEEDED, save_dump_info);
|
|
|
|
|
return save_dump_info;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RTS_API rtError_t rtProfilerTraceEx(uint64_t id, uint64_t modelId, uint16_t tagId, rtStream_t stream) {
|
|
|
|
|
return RT_ERROR_NONE;
|
|
|
|
|
}
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
std::mutex DavinciModel::tvm_bin_mutex_;
|
|
|
|
@ -2305,6 +2312,59 @@ Status DavinciModel::SinkTimeProfile(const InputData ¤t_data) {
|
|
|
|
|
return SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status DavinciModel::ProfileStepInfo(DavinciModel *model, uint16_t tag_id) {
|
|
|
|
|
auto &prof_mgr = ProfilingManager::Instance();
|
|
|
|
|
if (prof_mgr.ProfilingModelExecuteOn()) {
|
|
|
|
|
uint64_t index_id = model->iterator_count_ + 1;
|
|
|
|
|
uint64_t model_id = static_cast<uint64_t>(model->Id());
|
|
|
|
|
rtStream_t stream = model->rt_model_stream_;
|
|
|
|
|
GELOGD("Profiling Step Info TraceTask execute async start, index_id = %lu, model_id = %lu, tag_id = %u",
|
|
|
|
|
index_id, model_id, tag_id);
|
|
|
|
|
rtError_t rt_ret = rtProfilerTraceEx(index_id, model_id, tag_id, stream);
|
|
|
|
|
if (rt_ret != RT_ERROR_NONE) {
|
|
|
|
|
GELOGE(RT_FAILED, "[Call][rtProfilerTraceEx] failed, ret: 0x%X", rt_ret);
|
|
|
|
|
return RT_ERROR_TO_GE_STATUS(rt_ret);
|
|
|
|
|
}
|
|
|
|
|
GELOGD("Profiling Step Info TraceTask execute async success, index_id = %lu, model_id = %lu, tag_id = %u",
|
|
|
|
|
index_id, model_id, tag_id);
|
|
|
|
|
|
|
|
|
|
mmTimespec timespec = mmGetTickCount();
|
|
|
|
|
// 1000 ^ 3 converts second to nanosecond
|
|
|
|
|
int64_t time = timespec.tv_sec * 1000 * 1000 * 1000 + timespec.tv_nsec;
|
|
|
|
|
uint32_t task_id = 0;
|
|
|
|
|
uint32_t stream_id = 0;
|
|
|
|
|
rt_ret = rtGetTaskIdAndStreamID(&task_id, &stream_id);
|
|
|
|
|
if (rt_ret != RT_ERROR_NONE) {
|
|
|
|
|
GELOGE(RT_FAILED, "[Get][RtsInfo] task_id and stream_id failed, ret: 0x%X.", rt_ret);
|
|
|
|
|
return RT_ERROR_TO_GE_STATUS(rt_ret);
|
|
|
|
|
}
|
|
|
|
|
GELOGD("Get profiling args, task_id[%u], stream_id[%u]", task_id, stream_id);
|
|
|
|
|
uint32_t device_id = model->GetDeviceId();
|
|
|
|
|
|
|
|
|
|
Json step_info;
|
|
|
|
|
step_info[kIndexId] = index_id;
|
|
|
|
|
step_info[kModeleId] = model_id;
|
|
|
|
|
step_info[kTimeStamp] = time;
|
|
|
|
|
step_info[kTagId] = tag_id;
|
|
|
|
|
step_info[kTaskId] = task_id;
|
|
|
|
|
step_info[kStreamId] = stream_id;
|
|
|
|
|
step_info[kThreadId] = mmGetTid();
|
|
|
|
|
|
|
|
|
|
std::string reported_data;
|
|
|
|
|
try {
|
|
|
|
|
reported_data = step_info.dump(kInteval, ' ', false, Json::error_handler_t::ignore);
|
|
|
|
|
} catch (std::exception &e) {
|
|
|
|
|
GELOGE(FAILED, "Failed to convert JSON to string, reason: %s.", e.what());
|
|
|
|
|
} catch (...) {
|
|
|
|
|
GELOGE(FAILED, "Failed to convert JSON to string.");
|
|
|
|
|
}
|
|
|
|
|
reported_data.append(",")
|
|
|
|
|
.append("\n");
|
|
|
|
|
prof_mgr.ReportData(device_id, reported_data, "step_info");
|
|
|
|
|
}
|
|
|
|
|
return SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DavinciModel::SetProfileTime(ModelProcStage stage, int64_t endTime) {
|
|
|
|
|
int64_t time = endTime;
|
|
|
|
|
|
|
|
|
@ -2599,6 +2659,8 @@ void *DavinciModel::Run(DavinciModel *model) {
|
|
|
|
|
GELOGI("data_wrapper is null!");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
// tag_id 0 means step begin, 1 meas step end.
|
|
|
|
|
(void)DavinciModel::ProfileStepInfo(model, 0);
|
|
|
|
|
GELOGI("Getting the input data, model_id:%u", model_id);
|
|
|
|
|
GE_IF_BOOL_EXEC(!model->RunFlag(), break);
|
|
|
|
|
|
|
|
|
@ -2678,6 +2740,8 @@ void *DavinciModel::Run(DavinciModel *model) {
|
|
|
|
|
GE_IF_BOOL_EXEC(ProfilingManager::Instance().ProfilingModelExecuteOn(),
|
|
|
|
|
model->SetProfileTime(MODEL_AFTER_PROC_END));
|
|
|
|
|
GE_IF_BOOL_EXEC(ProfilingManager::Instance().ProfilingModelExecuteOn(), (void)model->SinkTimeProfile(current_data));
|
|
|
|
|
// tag_id 0 means step begin, 1 meas step end.
|
|
|
|
|
(void)DavinciModel::ProfileStepInfo(model, 1);
|
|
|
|
|
|
|
|
|
|
model->iterator_count_++;
|
|
|
|
|
model->is_first_execute_ = false;
|
|
|
|
@ -3691,6 +3755,8 @@ Status DavinciModel::NnExecute(rtStream_t stream, bool async_mode, const InputDa
|
|
|
|
|
GELOGD("current_data.index=%u", input_data.index);
|
|
|
|
|
GE_IF_BOOL_EXEC(ProfilingManager::Instance().ProfilingModelExecuteOn(), SetProfileTime(MODEL_PRE_PROC_END));
|
|
|
|
|
|
|
|
|
|
// tag_id 0 means step begin, 1 meas step end.
|
|
|
|
|
GE_CHK_STATUS_RET_NOLOG(ProfileStepInfo(this, 0));
|
|
|
|
|
if (!task_list_.empty()) {
|
|
|
|
|
GELOGD("rtModelExecute do");
|
|
|
|
|
GE_IF_BOOL_EXEC(ProfilingManager::Instance().ProfilingModelExecuteOn(), SetProfileTime(MODEL_INFER_START));
|
|
|
|
@ -3698,7 +3764,9 @@ Status DavinciModel::NnExecute(rtStream_t stream, bool async_mode, const InputDa
|
|
|
|
|
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));
|
|
|
|
|
GELOGD("rtModelExecute end");
|
|
|
|
|
iterator_count_++;
|
|
|
|
|
}
|
|
|
|
|
GE_CHK_STATUS_RET_NOLOG(ProfileStepInfo(this, 1));
|
|
|
|
|
|
|
|
|
|
if (!is_async_mode_) {
|
|
|
|
|
GE_IF_BOOL_EXEC(ProfilingManager::Instance().ProfilingModelExecuteOn(), SetProfileTime(MODEL_AFTER_PROC_START));
|
|
|
|
|