From 0ff3f1e17746a3746927b964aeccaa58cc71b4ec Mon Sep 17 00:00:00 2001 From: chen68 <501339635@qq.com> Date: Tue, 28 Jul 2020 16:40:48 +0800 Subject: [PATCH] add profiler --- amexec/inc/model_process.h | 15 ++- amexec/inc/sample_process.h | 1 + amexec/inc/utils.h | 9 ++ amexec/out/amexec | Bin 124736 -> 117288 bytes amexec/src/main.cpp | 47 ++++++++-- amexec/src/model_process.cpp | 169 +++++++++++++++++++++++++++++++--- amexec/src/sample_process.cpp | 161 +++++++++++++++++++++++--------- amexec/src/utils.cpp | 123 ++++++++++++++++++++++--- 8 files changed, 445 insertions(+), 80 deletions(-) diff --git a/amexec/inc/model_process.h b/amexec/inc/model_process.h index de2bc48..c0fa939 100755 --- a/amexec/inc/model_process.h +++ b/amexec/inc/model_process.h @@ -46,6 +46,11 @@ public: * @return result */ Result CreateDesc(); + + /** + * @brief PrintDesc + */ + Result PrintDesc(); /** * @brief destroy desc @@ -59,7 +64,13 @@ public: * @return result */ Result CreateInput(void *inputDataBuffer, size_t bufferSize); - + + /** + * @brief create model input + * @return result + */ + Result CreateZeroInput(); + /** * @brief destroy input resource */ @@ -103,4 +114,6 @@ private: aclmdlDesc *modelDesc_; aclmdlDataset *input_; aclmdlDataset *output_; + size_t numInputs_; + size_t numOutputs_; }; \ No newline at end of file diff --git a/amexec/inc/sample_process.h b/amexec/inc/sample_process.h index 425b45f..95b1d21 100755 --- a/amexec/inc/sample_process.h +++ b/amexec/inc/sample_process.h @@ -12,6 +12,7 @@ #pragma once #include "utils.h" #include "acl/acl.h" +#include using namespace std; /** diff --git a/amexec/inc/utils.h b/amexec/inc/utils.h index 6fc942c..d14cef9 100755 --- a/amexec/inc/utils.h +++ b/amexec/inc/utils.h @@ -21,8 +21,13 @@ #include #include #include +#include +#include +#include +#include #define INFO_LOG(fmt, args...) fprintf(stdout, "[INFO] " fmt "\n", ##args) +#define DEBUG_LOG(fmt, args...) fprintf(stdout, "[DEBUG] " fmt "\n", ##args) #define WARN_LOG(fmt, args...) fprintf(stdout, "[WARN] " fmt "\n", ##args) #define ERROR_LOG(fmt, args...) fprintf(stdout, "[ERROR] " fmt "\n", ##args) @@ -72,6 +77,10 @@ public: static double InferenceTimeAverage(double *x, int len); static double InferenceTimeAverageWithoutFirst(double *x, int len); + + static void ProfilerJson(bool isprof, map& params); + + static void DumpJson(bool isdump, map& params); }; #pragma once diff --git a/amexec/out/amexec b/amexec/out/amexec index aa42e9e9916bab076b8f6157f247ee1ebf5d711b..273dd3760e84e27cee3d7e6cef7e9dd03539de67 100755 GIT binary patch literal 117288 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≠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

r(0dXv&V~(wVFs9ocBb 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 params, vector& inputs) //void InitAndCheckParams(int argc, char* argv[], vector& params, vector& inputs) { - const char *optstring="m::i::o::f::hd::p::l::y::"; + const char *optstring="m::i::o::f::hd::p::l::y::e::g::"; int c,deb,index; struct option opts[]={{"model",required_argument,NULL,'m'}, {"input",required_argument,NULL,'i'}, {"output",required_argument,NULL,'o'}, {"outfmt",required_argument,NULL,'f'}, {"help",no_argument,NULL,1}, - {"dumpConf",required_argument,NULL,'d'}, - {"profConf",required_argument,NULL,'p'}, + {"dump",required_argument,NULL,'d'}, + {"profiler",required_argument,NULL,'p'}, {"loop",required_argument,NULL,'l'}, - {"dymBatch",required_argument,NULL,'y'}, + {"dymBatch",required_argument,NULL,'y'}, + {"device",required_argument,NULL,'e'}, + {"debug",required_argument,NULL,'g'}, {0,0,0,0}}; while((c=getopt_long(argc,argv,optstring,opts,&index))!=-1) { @@ -84,7 +90,7 @@ void InitAndCheckParams(int argc, char* argv[], map& params, vector break; case 'l': loop = Utils::str2num(optarg); - cout << "loop:" << loop << endl; + cout << "loop:" << loop << endl; if (loop > 100 || loop < 1) { printf("loop must in 1 to 100\n"); @@ -95,6 +101,18 @@ void InitAndCheckParams(int argc, char* argv[], map& params, vector // params.push_back(optarg); params['y'] = optarg; break; + case 'e': + device = Utils::str2num(optarg); + cout << "device:" << device << endl; + if (device > 255 || device < 0) + { + printf("device id must in 0 to 255\n"); + exit(0); + } + break; + case 'g': + params['g'] = optarg; + break; case 1: Utils::printHelpLetter(); exit(0); @@ -117,12 +135,29 @@ int main(int argc, char* argv[]) printf("Test Start!\n"); - if (params.empty() || inputs.empty()) { + if (params.empty()) { printf("Invalid params.\n"); printf("Execute sample failed.\n"); Utils::printHelpLetter(); return FAILED; } + + if (params['d'].compare("true") == 0) { + is_dump = true; + } + if (params['p'].compare("true") == 0) { + is_profi = true; + } + if (params['g'].compare("true") == 0) { + is_debug = true; + } + if (is_profi && is_dump){ + ERROR_LOG("dump and profiler can not both be true"); + return FAILED; + } + + Utils::ProfilerJson(is_profi, params); + Utils::DumpJson(is_dump, params); SampleProcess processSample; diff --git a/amexec/src/model_process.cpp b/amexec/src/model_process.cpp index d48e355..9dd3e34 100755 --- a/amexec/src/model_process.cpp +++ b/amexec/src/model_process.cpp @@ -21,7 +21,8 @@ extern bool g_isDevice; extern bool f_isTXT; ModelProcess::ModelProcess() :modelId_(0), modelMemSize_(0), modelWeightSize_(0), modelMemPtr_(nullptr), -modelWeightPtr_(nullptr), loadFlag_(false), modelDesc_(nullptr), input_(nullptr), output_(nullptr) +modelWeightPtr_(nullptr), loadFlag_(false), modelDesc_(nullptr), input_(nullptr), output_(nullptr), numInputs_(0), +numOutputs_(0) { } @@ -88,7 +89,84 @@ Result ModelProcess::CreateDesc() return SUCCESS; } - + +Result ModelProcess::PrintDesc() +{ aclError ret; + DEBUG_LOG("start print model description"); + size_t numInputs = aclmdlGetNumInputs(modelDesc_); + size_t numOutputs = aclmdlGetNumOutputs(modelDesc_); + DEBUG_LOG("NumInputs: %zu", numInputs); + DEBUG_LOG("NumOutputs: %zu", numOutputs); + + aclmdlIODims dimsInput; + aclmdlIODims dimsOutput; + aclmdlIODims dimsCurrentOutput; + for (size_t i = 0; i < numInputs; i++){ + DEBUG_LOG("the size of %zu input: %zu", i, aclmdlGetInputSizeByIndex(modelDesc_, i)); + ret = aclmdlGetInputDims(modelDesc_, i, &dimsInput); + DEBUG_LOG("the dims of %zu input:", i); + for (size_t j = 0; j < dimsInput.dimCount; j++){ + cout << dimsInput.dims[j] << " "; + } + cout << endl; + DEBUG_LOG("the name of %zu input: %s", i, aclmdlGetInputNameByIndex(modelDesc_, i)); + DEBUG_LOG("the Format of %zu input: %u", i, aclmdlGetInputFormat(modelDesc_, i)); + DEBUG_LOG("the DataType of %zu input: %u", i, aclmdlGetInputFormat(modelDesc_, i)); + } + for (size_t i = 0; i < numOutputs; i++){ + DEBUG_LOG("the size of %zu output: %zu", i, aclmdlGetOutputSizeByIndex(modelDesc_, i)); + ret = aclmdlGetOutputDims(modelDesc_, i, &dimsOutput); + DEBUG_LOG("the dims of %zu output:", i); + for (size_t j = 0; j < dimsOutput.dimCount; j++){ + cout <dimCount; j++) - { - if (i !=0 && i%dim->dims[j] == 0 && dim->dims[j] > 10) - {outstr << "\n" ;} - } - } + { + float out = *((float*)outData+i); + outstr << out << " "; + for (int j = 0; j < dim->dimCount; j++) + { + if (i !=0 && i%dim->dims[j] == 0 && dim->dims[j] > 10) + {outstr << "\n" ;} + } + } break; case 1: for (int i = 0; i < len/sizeof(aclFloat16); i++) @@ -579,5 +718,5 @@ void ModelProcess::Unload() } loadFlag_ = false; - INFO_LOG("unload model success, model Id is %u", modelId_); + INFO_LOG("unload model success, model Id is %u", modelId_); } diff --git a/amexec/src/sample_process.cpp b/amexec/src/sample_process.cpp index a4f0143..7af4a7a 100755 --- a/amexec/src/sample_process.cpp +++ b/amexec/src/sample_process.cpp @@ -17,6 +17,11 @@ using namespace std; extern bool g_isDevice; extern bool f_isTXT; extern int loop; +extern int32_t device; +extern bool is_debug; +extern bool is_profi; +extern bool is_dump; + SampleProcess::SampleProcess() :deviceId_(0), context_(nullptr), stream_(nullptr) { @@ -30,15 +35,31 @@ SampleProcess::~SampleProcess() Result SampleProcess::InitResource() { // ACL init - const char *aclConfigPath = ""; - aclError ret = aclInit(nullptr); + aclError ret; + const char *aclConfigPath = "acl.json"; + if (is_profi == true){ + ret = aclInit(aclConfigPath); + } else + { + ret = aclInit(nullptr); + } if (ret != ACL_ERROR_NONE) { +/* if (is_debug || is_profi){ + if (remove("acl.json")==0){ + INFO_LOG("delete acl.json success"); + } + else{ + ERROR_LOG("delete acl.json failed"); + } + } +*/ ERROR_LOG("acl init failed"); return FAILED; } INFO_LOG("acl init success"); // open device + deviceId_ = device; ret = aclrtSetDevice(deviceId_); if (ret != ACL_ERROR_NONE) { ERROR_LOG("acl open device %d failed", deviceId_); @@ -71,6 +92,17 @@ Result SampleProcess::InitResource() } g_isDevice = (runMode == ACL_DEVICE); INFO_LOG("get run mode success"); + +/* // dump init + if (is_dump == true){ + ret = aclmdlInitDump(); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("dump init failed"); + return FAILED; + } + INFO_LOG("dump init success"); + } +*/ return SUCCESS; } @@ -83,9 +115,6 @@ Result SampleProcess::Process(map& params, vector& input_fi const char* outfmt = params['f'].c_str(); const char* fmt_TXT = "TXT"; f_isTXT = (strcmp(outfmt,fmt_TXT)==0); - const char* dumpConf = params['d'].c_str(); - const char* profConf = params['p'].c_str(); - const char* dymBatch = params['y'].c_str(); std::string modelPath = params['m'].c_str(); std::string modelName = Utils::modelName(modelPath); @@ -104,62 +133,98 @@ Result SampleProcess::Process(map& params, vector& input_fi ERROR_LOG("create model description failed"); return FAILED; } - + /* // dump init + if (is_dump){ + const char *aclConfigPath = "acl.json"; + ret = aclmdlSetDump(aclConfigPath); + if (ret != SUCCESS) { + ERROR_LOG("dump init failed"); + return FAILED; + } + INFO_LOG("dump init success"); + } +*/ + if (is_debug){ + ret = processModel.PrintDesc(); + if (ret != SUCCESS) { + ERROR_LOG("print model descrtption failed"); + return FAILED; + } + } ret = processModel.CreateOutput(); if (ret != SUCCESS) { ERROR_LOG("create model output failed"); return FAILED; } - vector picDevBuffer(input_files.size(), nullptr); - for (size_t index = 0; index < input_files.size(); ++index) { - INFO_LOG("start to process file:%s", input_files[index].c_str()); - // model process - uint32_t devBufferSize; - picDevBuffer[index] = Utils::GetDeviceBufferOfFile(input_files[index], devBufferSize); - if (picDevBuffer[index] == nullptr) { - ERROR_LOG("get pic device buffer failed,index is %zu", index); - return FAILED; - } - - ret = processModel.CreateInput(picDevBuffer[index], devBufferSize); + if (input_files.empty() == 1) { + ret = processModel.CreateZeroInput(); if (ret != SUCCESS) { ERROR_LOG("model create input failed"); - for (size_t i = 0; i < index; i++) { - aclrtFree(picDevBuffer[i]); - } return FAILED; } } - // loop end - for (size_t t = 0; t < loop; ++t){ - gettimeofday(&begin,NULL); - ret = processModel.Execute(); - gettimeofday(&end,NULL); - inference_time[t] = 1000*(end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec)/1000.000; - std::cout << "Inference time: "< picDevBuffer(input_files.size(), nullptr); + for (size_t index = 0; index < input_files.size(); ++index) { + INFO_LOG("start to process file:%s", input_files[index].c_str()); + // model process + uint32_t devBufferSize; + picDevBuffer[index] = Utils::GetDeviceBufferOfFile(input_files[index], devBufferSize); + if (picDevBuffer[index] == nullptr) { + ERROR_LOG("get pic device buffer failed,index is %zu", index); return FAILED; } - processModel.OutputModelResult(output_path,modelName,t); + + ret = processModel.CreateInput(picDevBuffer[index], devBufferSize); + for (size_t i = 0; i < index; i++) { + aclrtFree (picDevBuffer[i]); + } + if (ret != SUCCESS) { + ERROR_LOG("model create input failed"); + return FAILED; + } + } + } + + // loop end + for (size_t t = 0; t < loop; ++t) { + gettimeofday(&begin, NULL); + ret = processModel.Execute(); + gettimeofday(&end, NULL); + inference_time[t] = 1000 * (end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) / 1000.000; + std::cout << "Inference time: " << inference_time[t] << "ms" << endl; + if (ret != SUCCESS) { + ERROR_LOG("model execute failed"); +// for (size_t i = 0; i < input_files.size(); i++) { +// aclrtFree(picDevBuffer[i]); +// } + return FAILED; + } + processModel.OutputModelResult(output_path, modelName, t); } double infer_time_ave = Utils::InferenceTimeAverage(inference_time, loop); printf("Inference average time: %f ms\n", infer_time_ave); - if (loop > 1){ - double infer_time_ave_without_first = Utils::InferenceTimeAverageWithoutFirst(inference_time, loop); - printf("Inference average time without first time: %f ms\n", infer_time_ave_without_first); - } + if (loop > 1) { + double infer_time_ave_without_first = Utils::InferenceTimeAverageWithoutFirst(inference_time, loop); + printf("Inference average time without first time: %f ms\n", infer_time_ave_without_first); + } processModel.DestroyInput(); - // release model input buffer - for (size_t i = 0; i < input_files.size(); i++) { - aclrtFree(picDevBuffer[i]); + if (is_dump || is_profi){ + if (remove("acl.json")==0){ + INFO_LOG("delete acl.json success"); + } + else{ + ERROR_LOG("delete acl.json failed"); + } } - + + // release model input buffer +// for (size_t i = 0; i < input_files.size(); i++) { +// aclrtFree(picDevBuffer[i]); +// } + return SUCCESS; } @@ -185,11 +250,19 @@ void SampleProcess::DestroyResource() INFO_LOG("end to destroy context"); ret = aclrtResetDevice(deviceId_); - if (ret != ACL_ERROR_NONE) { + if (ret != ACL_ERROR_NONE) { ERROR_LOG("reset device failed"); } INFO_LOG("end to reset device is %d", deviceId_); - + +/* if (is_dump){ + ret = aclmdlFinalizeDump(); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("finalize dump failed"); + } + } + INFO_LOG("end to finalize dump"); +*/ ret = aclFinalize(); if (ret != ACL_ERROR_NONE) { ERROR_LOG("finalize acl failed"); diff --git a/amexec/src/utils.cpp b/amexec/src/utils.cpp index 97f8947..fc0dc62 100755 --- a/amexec/src/utils.cpp +++ b/amexec/src/utils.cpp @@ -15,7 +15,10 @@ using namespace std; extern bool g_isDevice; extern bool f_isTXT; - +extern int32_t device; +extern bool is_profi; +extern bool is_dump; + void* Utils::ReadBinFile(std::string fileName, uint32_t &fileSize) { std::ifstream binFile(fileName, std::ifstream::binary); @@ -94,17 +97,37 @@ void* Utils::GetDeviceBufferOfFile(std::string fileName, uint32_t &fileSize) void Utils::SplitString(std::string& s, std::vector& v, char c) { - std::string::size_type pos1, pos2; - pos2 = s.find(c); - pos1 = 0; - while(std::string::npos != pos2) - { - v.push_back(s.substr(pos1, pos2-pos1)); - pos1 = pos2 + 1; - pos2 = s.find(c, pos1); - } - if(pos1 != s.length()) - v.push_back(s.substr(pos1)); + std::string::size_type pos1, pos2; + pos2 = s.find(c); + pos1 = 0; + while(std::string::npos != pos2) + { + std::string s1 = s.substr(pos1, pos2-pos1); + size_t n = s1.find_last_not_of(" \r\n\t"); + if (n != string::npos) { + s1.erase(n + 1, s.size() - n); + } + n = s1.find_first_not_of(" \r\n\t"); + if (n != string::npos) { + s1.erase(0, n); + } + v.push_back(s1); + pos1 = pos2 + 1; + pos2 = s.find(c, pos1); + } + if(pos1 != s.length()) + { + std::string s1 = s.substr(pos1); + size_t n = s1.find_last_not_of(" \r\n\t"); + if (n != string::npos) { + s1.erase(n + 1, s.size() - n); + } + n = s1.find_first_not_of(" \r\n\t"); + if (n != string::npos) { + s1.erase(0, n); + } + v.push_back(s1); + } } int Utils::str2num(char *str) @@ -170,8 +193,10 @@ void Utils::printHelpLetter() cout<< " --output Output path(User needs to have permission to create directories)" << endl; cout<< " --outfmt Output file format (TXT or BIN)" << endl; cout<< " --loop loop time(must in 1 to 100)" << endl; - cout<< " --dumpConf dump configure file path (Do not support now)" << endl; - cout<< " --profConf profiling configure file path (Do not support now)" << endl; + cout<< " --dump Enable dump (true or false)" << endl; + cout<< " --profiler Enable profiler (true or false)" << endl; + cout<< " --device Designated the device ID(must in 0 to 255)" << endl; + cout<< " --debug Debug switch,print model information (true or false)" << endl; cout<< " --dymBatch dynamic batch (Do not support now)" << endl << endl << endl; @@ -205,3 +230,73 @@ double Utils::InferenceTimeAverageWithoutFirst(double *x, int len) return sum / (len - 1); } + +void Utils::ProfilerJson(bool isprof, map& params) +{ + if (isprof){ + std::string out_path = params['o'].c_str(); + std::string out_profiler_path = out_path + "/profiler"; + ofstream outstr("acl.json", ios::out); + outstr << "{\n\"profiler\": {\n \"switch\": \"on\",\n \"device_id\": \""; + outstr << device << "\",\n \"result_path\": \"" << out_profiler_path << "\",\n "; + outstr << "\"ai_core_metrics\": \"\"}\n}"; + //outstr << "\"ai_core_metrics\": \"aicorePipelineStall\"}\n}"; + //outstr <<"}]n}"; + outstr.close(); + + //mkdir profiler output dir + const char* temp_s = out_path.c_str(); + if (NULL == opendir(temp_s)){ + mkdir(temp_s,0775); + } + const char* temp_s1 = out_profiler_path.c_str(); + if (NULL == opendir(temp_s1)){ + mkdir(temp_s1,0775); + } + /*{ + "profiler": { + "switch": "on", + "device_id": "all", + "result_path": "/home/HwHiAiUser", + "ai_core_metrics": "aicorePipelineStall" + } + } + */ + } +} + +void Utils::DumpJson(bool isdump, map& params) +{ + if (is_dump){ + std::string modelPath = params['m'].c_str(); + std::string modelName = Utils::modelName(modelPath); + std::string out_path = params['o'].c_str(); + std::string out_dump_path = out_path + "/dump"; + ofstream outstr("acl.json", ios::out); + outstr << "{\n\"dump\": {\n \"dump_path\": \""; + outstr << out_dump_path << "\",\n "; + outstr << "\"dump_mode\": \"output\",\n \"dump_list\": [{\n "; + outstr << " \"model_name\": \"" << modelName << "\",\n }]\n"; + outstr << " }\n}"; + outstr.close(); + + //mkdir dump output dir + const char* temp_s = out_path.c_str(); + if (NULL == opendir(temp_s)){ + mkdir(temp_s,0775); + } + const char* temp_s1 = out_dump_path.c_str(); + if (NULL == opendir(temp_s1)){ + mkdir(temp_s1,0775); + } + // { + // "dump": { + // "dump_path": "output_path", + // "dump_mode": "output", + // "dump_list": [{ + // "model_name": "model_name", + // }] + // } + // } + } +}