From 472286d8169d548addd7cb2693c0e8f0c2df0766 Mon Sep 17 00:00:00 2001 From: anbaolei Date: Thu, 11 Aug 2022 20:06:48 +0800 Subject: [PATCH 1/2] fix dynamic shape get output dim issue --- msame/inc/model_process.h | 2 +- msame/src/model_process.cpp | 54 ++++++++++++++++++++++++------------- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/msame/inc/model_process.h b/msame/inc/model_process.h index 30a6fb07..7b9aa456 100644 --- a/msame/inc/model_process.h +++ b/msame/inc/model_process.h @@ -188,7 +188,7 @@ public: /** * @brief get current output dims mul */ - Result GetCurOutputDimsMul(size_t index, std::vector& curOutputDimsMul); + Result GetCurOutputDimsMul(size_t index, std::vector& curOutputDimsMul, bool is_dymshape); private: uint32_t modelId_; diff --git a/msame/src/model_process.cpp b/msame/src/model_process.cpp index 80277866..5dac4e98 100644 --- a/msame/src/model_process.cpp +++ b/msame/src/model_process.cpp @@ -306,20 +306,39 @@ Result ModelProcess::GetMaxBatchSize(uint64_t &maxBatchSize) return SUCCESS; } -Result ModelProcess::GetCurOutputDimsMul(size_t index, vector& curOutputDimsMul) +Result ModelProcess::GetCurOutputDimsMul(size_t index, vector& curOutputDimsMul, bool is_dymshape) { aclError ret; aclmdlIODims ioDims; int64_t tmp_dim = 1; - ret = aclmdlGetCurOutputDims(modelDesc_, index, &ioDims); - if (ret != ACL_SUCCESS) { - cout << aclGetRecentErrMsg() << endl; - WARN_LOG("aclmdlGetCurOutputDims failed ret[%d], maybe the modle has dynamic shape", ret); - return FAILED; - } - for (int i = 1; i < ioDims.dimCount; i++) { - tmp_dim *= ioDims.dims[ioDims.dimCount - i]; - curOutputDimsMul.push_back(tmp_dim); + if (!is_dymshape) { + ret = aclmdlGetCurOutputDims(modelDesc_, index, &ioDims); + if (ret != ACL_SUCCESS) { + cout << aclGetRecentErrMsg() << endl; + WARN_LOG("aclmdlGetCurOutputDims failed ret[%d], maybe the modle has dynamic shape", ret); + return FAILED; + } + for (int i = 1; i < ioDims.dimCount; i++) { + tmp_dim *= ioDims.dims[ioDims.dimCount - i]; + curOutputDimsMul.push_back(tmp_dim); + } + } else { + aclTensorDesc *outputDesc = aclmdlGetDatasetTensorDesc(output_, index); + size_t dims_num = aclmdlGetTensorDescNumDims(outputDesc); + int64_t dim_value = 0; + for (int i = 0; i < dims_num; i++) { + ret = aclGetTensorDescDimV2(outputDesc, i, &dim_value); + if ((ret != ACL_SUCCESS) || (dim_value == -1)) { + WARN_LOG("aclGetTensorDescDimV2 failed ret[%d]", ret); + return FAILED; + } + if (i == 0) { + tmp_dim = dim_value; + } else { + tmp_dim *= dim_value; + curOutputDimsMul.push_back(tmp_dim); + } + } } return SUCCESS; } @@ -728,16 +747,15 @@ void ModelProcess::OutputModelResult(std::string& s, std::string& modelName, std aclDataBuffer* dataBuffer = aclmdlGetDatasetBuffer(output_, i); data = aclGetDataBufferAddr(dataBuffer); if (is_dymshape){ - aclTensorDesc *outputDesc = aclmdlGetDatasetTensorDesc(output_, i); - len = aclGetTensorDescSize(outputDesc); - } - else - { - len = aclGetDataBufferSizeV2(dataBuffer); + aclTensorDesc *outputDesc = aclmdlGetDatasetTensorDesc(output_, i); + len = aclGetTensorDescSize(outputDesc); + } else { + len = aclGetDataBufferSizeV2(dataBuffer); if (dymbatch_size > 0 && maxBatchSize > 0){ len = len / (maxBatchSize / dymbatch_size); } - } + } + aclDataType datatype = aclmdlGetOutputDataType(modelDesc_, i); if (!g_is_device) { ret = aclrtMallocHost(&outHostData, len); @@ -799,7 +817,7 @@ void ModelProcess::OutputModelResult(std::string& s, std::string& modelName, std } if (g_is_txt) { vector curOutputDimsMul; - ret = GetCurOutputDimsMul(i, curOutputDimsMul); + ret = GetCurOutputDimsMul(i, curOutputDimsMul, is_dymshape); ofstream outstr(s + "/" + modelName + "_output_" + to_string(i) + ".txt", ios::out); switch (datatype) { case 0: -- Gitee From bf2955078f040d261f66eed46218b8720af22b6a Mon Sep 17 00:00:00 2001 From: anbaolei Date: Thu, 11 Aug 2022 20:12:20 +0800 Subject: [PATCH 2/2] fix dynamic shape get output dim issue --- msame/src/model_process.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msame/src/model_process.cpp b/msame/src/model_process.cpp index 5dac4e98..2934f542 100644 --- a/msame/src/model_process.cpp +++ b/msame/src/model_process.cpp @@ -324,7 +324,7 @@ Result ModelProcess::GetCurOutputDimsMul(size_t index, vector& curOutpu } } else { aclTensorDesc *outputDesc = aclmdlGetDatasetTensorDesc(output_, index); - size_t dims_num = aclmdlGetTensorDescNumDims(outputDesc); + size_t dims_num = aclGetTensorDescNumDims(outputDesc); int64_t dim_value = 0; for (int i = 0; i < dims_num; i++) { ret = aclGetTensorDescDimV2(outputDesc, i, &dim_value); -- Gitee