From e263d71b29448312bb8df41306cdf1d25853bb2c Mon Sep 17 00:00:00 2001 From: Jianxun Zhang Date: Mon, 26 Jul 2021 09:49:38 -0700 Subject: [PATCH 1/6] Remove duplicated allocation in blob objects We shouldn't need to call allocate() of a blob object if it was created with the constructor variant which already called allocate(). --- intel_nn_hal/GnaPreparedModel.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/intel_nn_hal/GnaPreparedModel.cpp b/intel_nn_hal/GnaPreparedModel.cpp index 672f9c1ab..d46aaefc7 100755 --- a/intel_nn_hal/GnaPreparedModel.cpp +++ b/intel_nn_hal/GnaPreparedModel.cpp @@ -2756,7 +2756,6 @@ IRBlob::Ptr GnaPreparedModel::GetConstWeightsOperandAsTensor(uint32_t index) else { InferenceEngine::TBlob::Ptr blob = std::make_shared>(td, (float *)buf, len); - blob->allocate(); } return blob; } else { @@ -2883,7 +2882,6 @@ IRBlob::Ptr GnaPreparedModel::GetConstOperandAsTensor(int operand_index, int ope #endif } else { blob = std::make_shared>(td, (float *)buf, len); - blob->allocate(); } if (op.lifetime == V1_3_OperandLifeTime::CONSTANT_COPY || op.lifetime == V1_3_OperandLifeTime::CONSTANT_REFERENCE) { mModelIRBlobs.push_back(blob); @@ -2987,7 +2985,6 @@ Blob::Ptr GnaPreparedModel::GetInOutOperandAsBlob(RunTimeOperandInfo& op, const #endif } else { blob = std::make_shared>(td, (float *)buf, len); - blob->allocate(); } return blob; } else { From 483a2e9c7b73c03f9e3d9f2b5cdd3a5368bed907 Mon Sep 17 00:00:00 2001 From: Jianxun Zhang Date: Mon, 26 Jul 2021 10:16:06 -0700 Subject: [PATCH 2/6] Output a log line when deallocation returns false Assuming we believe these blobs should be deallocated (likely from a true returned from allocate()), the adding log will give us a hint when the unexpected happens, and it does in runtime. --- intel_nn_hal/GnaPreparedModel.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/intel_nn_hal/GnaPreparedModel.cpp b/intel_nn_hal/GnaPreparedModel.cpp index d46aaefc7..ce53da81e 100755 --- a/intel_nn_hal/GnaPreparedModel.cpp +++ b/intel_nn_hal/GnaPreparedModel.cpp @@ -197,7 +197,8 @@ bool GnaPreparedModel::constructGNAGraph(std::pair indices) { gnaPluginPtr->loadNetwork(passed_network, isDecoderNw); #endif for (auto item:mModelIRBlobs) { - item->deallocate(); + if (item->deallocate() == false) + ALOGI("%s deallocating IR an IR blob returns false", __func__); } gnaPluginPtr->queryState(); gnaPluginPtr->reset(); From bdbf2be861b6ebf4776b0ac7c46f882df74a27ac Mon Sep 17 00:00:00 2001 From: Jianxun Zhang Date: Mon, 26 Jul 2021 12:45:50 -0700 Subject: [PATCH 3/6] refactoring: remove reset buffer ptr The 'buf' is not used anymore before the function returns,so there is no need to reset it. --- intel_nn_hal/GnaPreparedModel.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/intel_nn_hal/GnaPreparedModel.cpp b/intel_nn_hal/GnaPreparedModel.cpp index ce53da81e..494150ba6 100755 --- a/intel_nn_hal/GnaPreparedModel.cpp +++ b/intel_nn_hal/GnaPreparedModel.cpp @@ -2886,7 +2886,6 @@ IRBlob::Ptr GnaPreparedModel::GetConstOperandAsTensor(int operand_index, int ope } if (op.lifetime == V1_3_OperandLifeTime::CONSTANT_COPY || op.lifetime == V1_3_OperandLifeTime::CONSTANT_REFERENCE) { mModelIRBlobs.push_back(blob); - buf = nullptr; } return blob; } else { @@ -2917,7 +2916,6 @@ IRBlob::Ptr GnaPreparedModel::GetConstOperandAsTensor(int operand_index, int ope } if (op.lifetime == V1_3_OperandLifeTime::CONSTANT_COPY || op.lifetime == V1_3_OperandLifeTime::CONSTANT_REFERENCE) { mModelIRBlobs.push_back(blob); - buf = nullptr; } return blob; } From 8361f7c0bed8dc9813236b181bf928c033a17c65 Mon Sep 17 00:00:00 2001 From: Jianxun Zhang Date: Wed, 28 Jul 2021 12:06:52 -0700 Subject: [PATCH 4/6] remove mOpIndex2BlobMap and the closure using it The class member mOpIndex2BlobMap is not really used any more, but it holds blobs which are shared pointers. There is a potential case of failing to release the blob resource because of the useless mOpIndex2BlobMap is still holding it. We'd better get rid of such unnecessary reference before it becomes a real obscure bug later. --- intel_nn_hal/GnaPreparedModel.cpp | 152 +++++++++--------------------- intel_nn_hal/PreparedModel.h | 1 - 2 files changed, 46 insertions(+), 107 deletions(-) diff --git a/intel_nn_hal/GnaPreparedModel.cpp b/intel_nn_hal/GnaPreparedModel.cpp index 494150ba6..3ac9c4527 100755 --- a/intel_nn_hal/GnaPreparedModel.cpp +++ b/intel_nn_hal/GnaPreparedModel.cpp @@ -1594,23 +1594,11 @@ bool GnaPreparedModel::operationAdd(const Operation& operation) { return (int)op.lifetime; }; - auto getIRBlobFromOperand = [&](uint32_t idx, uint32_t offset) { - const auto op = mModel.main.operands[idx]; - - auto blob = GetConstOperandAsTensor(idx, offset); - if (op.lifetime == V1_3_OperandLifeTime::SUBGRAPH_INPUT) - { - mOpIndex2BlobMap[idx] = blob; - } - - return blob; - }; - IRBuilder::BuilderADDLayer::AddParams params; - params.input1.data = getIRBlobFromOperand(operation.inputs[0], 0); + params.input1.data = GetConstOperandAsTensor(operation.inputs[0], 0); params.input1.lifeTime = getV1_3_OperandLifeTime(operation.inputs[0]); - params.input2.data = getIRBlobFromOperand(operation.inputs[1], 1); + params.input2.data = GetConstOperandAsTensor(operation.inputs[1], 1); params.input2.lifeTime = getV1_3_OperandLifeTime(operation.inputs[1]); auto input1Dims = params.input1.data->getTensorDesc().getDims(); @@ -1692,20 +1680,8 @@ bool GnaPreparedModel::operationTANH(const Operation& operation) { return (int)op.lifetime; }; - auto getIRBlobFromOperand = [&](uint32_t idx, uint32_t offset) { - const auto op = mModel.main.operands[idx]; - - auto blob = GetConstOperandAsTensor(idx, offset); - if (op.lifetime == V1_3_OperandLifeTime::SUBGRAPH_INPUT) - { - mOpIndex2BlobMap[idx] = blob; - } - - return blob; - }; - IRBuilder::BuilderTANHLayer::TanhParams params; - params.input.data = getIRBlobFromOperand(operation.inputs[0], 0); + params.input.data = GetConstOperandAsTensor(operation.inputs[0], 0); params.input.lifeTime = getV1_3_OperandLifeTime(operation.inputs[0]); auto inputDims = params.input.data->getTensorDesc().getDims(); @@ -1784,17 +1760,6 @@ bool GnaPreparedModel::operationFullyConnected(const Operation& operation) { return (int)op.lifetime; }; - auto getIRBlobFromOperand = [&](uint32_t idx, uint32_t offset) { - const auto op = mModel.main.operands[idx]; - auto blob = GetConstOperandAsTensor(idx, offset); - if (op.lifetime == V1_3_OperandLifeTime::SUBGRAPH_INPUT) - { - mOpIndex2BlobMap[idx] = blob; - } - - return blob; - }; - auto validateOperand = [&](uint32_t idx, uint32_t offset) { const auto op = mModel.main.operands[idx]; auto len_out = op.location.length; @@ -1806,12 +1771,12 @@ bool GnaPreparedModel::operationFullyConnected(const Operation& operation) { IRBuilder::BuilderFCLayer::FCParams params; params.input.lifeTime = getV1_3_OperandLifeTime(operation.inputs[0]); - params.input.data = getIRBlobFromOperand(operation.inputs[0], 0); + params.input.data = GetConstOperandAsTensor(operation.inputs[0], 0); - params.weights.data = getIRBlobFromOperand(operation.inputs[1], 1); + params.weights.data = GetConstOperandAsTensor(operation.inputs[1], 1); params.weights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[1]); - params.bias.data = getIRBlobFromOperand(operation.inputs[2], 2); + params.bias.data = GetConstOperandAsTensor(operation.inputs[2], 2); params.bias.lifeTime = getV1_3_OperandLifeTime(operation.inputs[2]); uint32_t len; @@ -1975,19 +1940,6 @@ bool GnaPreparedModel::operationLSTM(const Operation& operation) return (int)op.lifetime; }; - auto getIRBlobFromOperand = [&](uint32_t idx, uint32_t offset) { - const auto op = mModel.main.operands[idx]; - - auto blob = GetConstOperandAsTensor(idx, offset); - if (op.lifetime == V1_3_OperandLifeTime::SUBGRAPH_INPUT) - { - mOpIndex2BlobMap[idx] = blob; - VLOG(L1, "blob idx=%d (model_input) ptr=%p", idx, blob.get()); - } - - return blob; - }; - IRBuilder::LstmLayer::LstmCellDescription lstmDesc; lstmDesc.clippingThresholdCellState = 0; lstmDesc.clippingThresholdProjState = 0; @@ -2044,65 +1996,65 @@ bool GnaPreparedModel::operationLSTM(const Operation& operation) VLOG(L1, "Lstm cell description %s", lstmDescription.c_str()); - params.input.data = getIRBlobFromOperand(operation.inputs[0], 0); + params.input.data = GetConstOperandAsTensor(operation.inputs[0], 0); params.input.lifeTime = getV1_3_OperandLifeTime(operation.inputs[0]); - params.outputState.data = getIRBlobFromOperand(operation.inputs[18], 18); + params.outputState.data = GetConstOperandAsTensor(operation.inputs[18], 18); params.outputState.lifeTime = getV1_3_OperandLifeTime(operation.inputs[18]); - params.cellState.data = getIRBlobFromOperand(operation.inputs[19], 19); + params.cellState.data = GetConstOperandAsTensor(operation.inputs[19], 19); params.cellState.lifeTime = getV1_3_OperandLifeTime(operation.inputs[19]); - params.input2inputWeights.data = getIRBlobFromOperand(operation.inputs[1], 1); + params.input2inputWeights.data = GetConstOperandAsTensor(operation.inputs[1], 1); params.input2inputWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[1]); - params.input2ForgetWeights.data = getIRBlobFromOperand(operation.inputs[2], 2); + params.input2ForgetWeights.data = GetConstOperandAsTensor(operation.inputs[2], 2); params.input2ForgetWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[2]); - params.input2CellWeights.data = getIRBlobFromOperand(operation.inputs[3], 3); + params.input2CellWeights.data = GetConstOperandAsTensor(operation.inputs[3], 3); params.input2CellWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[3]); - params.input2OutputWeights.data = getIRBlobFromOperand(operation.inputs[4], 4); + params.input2OutputWeights.data = GetConstOperandAsTensor(operation.inputs[4], 4); params.input2OutputWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[4]); - params.recurrant2inputWeights.data = getIRBlobFromOperand(operation.inputs[5], 5); + params.recurrant2inputWeights.data = GetConstOperandAsTensor(operation.inputs[5], 5); params.recurrant2inputWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[5]); - params.recurrant2ForgetWeights.data = getIRBlobFromOperand(operation.inputs[6], 6); + params.recurrant2ForgetWeights.data = GetConstOperandAsTensor(operation.inputs[6], 6); params.recurrant2ForgetWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[6]); - params.recurrant2CellWeights.data = getIRBlobFromOperand(operation.inputs[7], 7); + params.recurrant2CellWeights.data = GetConstOperandAsTensor(operation.inputs[7], 7); params.recurrant2CellWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[7]); - params.recurrant2OutputWeights.data = getIRBlobFromOperand(operation.inputs[8], 8); + params.recurrant2OutputWeights.data = GetConstOperandAsTensor(operation.inputs[8], 8); params.recurrant2OutputWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[8]); - params.cell2InputWeights.data = getIRBlobFromOperand(operation.inputs[9], 9); + params.cell2InputWeights.data = GetConstOperandAsTensor(operation.inputs[9], 9); params.cell2InputWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[9]); - params.cell2ForgetWeights.data = getIRBlobFromOperand(operation.inputs[10], 10); + params.cell2ForgetWeights.data = GetConstOperandAsTensor(operation.inputs[10], 10); params.cell2ForgetWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[10]); - params.cell2OutputWeights.data = getIRBlobFromOperand(operation.inputs[11], 11); + params.cell2OutputWeights.data = GetConstOperandAsTensor(operation.inputs[11], 11); params.cell2OutputWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[11]); - params.inputGateBias.data = getIRBlobFromOperand(operation.inputs[12], 12); + params.inputGateBias.data = GetConstOperandAsTensor(operation.inputs[12], 12); params.inputGateBias.lifeTime = getV1_3_OperandLifeTime(operation.inputs[12]); - params.forgetGateBias.data = getIRBlobFromOperand(operation.inputs[13], 13); + params.forgetGateBias.data = GetConstOperandAsTensor(operation.inputs[13], 13); params.forgetGateBias.lifeTime = getV1_3_OperandLifeTime(operation.inputs[13]); - params.cellBias.data = getIRBlobFromOperand(operation.inputs[14], 14); + params.cellBias.data = GetConstOperandAsTensor(operation.inputs[14], 14); params.cellBias.lifeTime = getV1_3_OperandLifeTime(operation.inputs[14]); - params.outputGateBias.data = getIRBlobFromOperand(operation.inputs[15], 15); + params.outputGateBias.data = GetConstOperandAsTensor(operation.inputs[15], 15); params.outputGateBias.lifeTime = getV1_3_OperandLifeTime(operation.inputs[15]); if (lstmDesc.projectionLayerEnabled) { - params.projectionWeights.data = getIRBlobFromOperand(operation.inputs[16], 16); + params.projectionWeights.data = GetConstOperandAsTensor(operation.inputs[16], 16); params.projectionWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[16]); - params.projectionBias.data = getIRBlobFromOperand(operation.inputs[17], 17); + params.projectionBias.data = GetConstOperandAsTensor(operation.inputs[17], 17); params.projectionBias.lifeTime = getV1_3_OperandLifeTime(operation.inputs[17]); } @@ -2202,18 +2154,6 @@ bool GnaPreparedModel::operationQuantizedLSTM(const Operation& operation) return (int)op.lifetime; }; - auto getIRBlobFromOperand = [&](uint32_t idx, uint32_t offset) { - const auto op = mModel.main.operands[idx]; - - auto blob = GetConstOperandAsTensor(idx, offset); - if (op.lifetime == V1_3_OperandLifeTime::SUBGRAPH_INPUT) - { - mOpIndex2BlobMap[idx] = blob; - } - - return blob; - }; - IRBuilder::LstmLayer::LstmCellDescription lstmDesc; lstmDesc.clippingThresholdCellState = 0; lstmDesc.clippingThresholdProjState = 0; @@ -2255,67 +2195,67 @@ bool GnaPreparedModel::operationQuantizedLSTM(const Operation& operation) params.useLayerNorm = true; params.useBatchedLayerNorm = true; - params.input.data = getIRBlobFromOperand(operation.inputs[0], 0); + params.input.data = GetConstOperandAsTensor(operation.inputs[0], 0); params.input.lifeTime = getV1_3_OperandLifeTime(operation.inputs[0]); - params.outputState.data = getIRBlobFromOperand(operation.inputs[18], 18); + params.outputState.data = GetConstOperandAsTensor(operation.inputs[18], 18); params.outputState.lifeTime = getV1_3_OperandLifeTime(operation.inputs[18]); - params.cellState.data = getIRBlobFromOperand(operation.inputs[19], 19); + params.cellState.data = GetConstOperandAsTensor(operation.inputs[19], 19); params.cellState.lifeTime = getV1_3_OperandLifeTime(operation.inputs[19]); if (!lstmDesc.cifgEnabled) { - params.input2inputWeights.data = getIRBlobFromOperand(operation.inputs[1], 1); + params.input2inputWeights.data = GetConstOperandAsTensor(operation.inputs[1], 1); params.input2inputWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[1]); - params.recurrant2inputWeights.data = getIRBlobFromOperand(operation.inputs[5], 5); + params.recurrant2inputWeights.data = GetConstOperandAsTensor(operation.inputs[5], 5); params.recurrant2inputWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[5]); - params.inputGateBias.data = getIRBlobFromOperand(operation.inputs[12], 12); + params.inputGateBias.data = GetConstOperandAsTensor(operation.inputs[12], 12); params.inputGateBias.lifeTime = getV1_3_OperandLifeTime(operation.inputs[12]); } - params.input2ForgetWeights.data = getIRBlobFromOperand(operation.inputs[2], 2); + params.input2ForgetWeights.data = GetConstOperandAsTensor(operation.inputs[2], 2); params.input2ForgetWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[2]); - params.input2CellWeights.data = getIRBlobFromOperand(operation.inputs[3], 3); + params.input2CellWeights.data = GetConstOperandAsTensor(operation.inputs[3], 3); params.input2CellWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[3]); - params.input2OutputWeights.data = getIRBlobFromOperand(operation.inputs[4], 4); + params.input2OutputWeights.data = GetConstOperandAsTensor(operation.inputs[4], 4); params.input2OutputWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[4]); - params.recurrant2ForgetWeights.data = getIRBlobFromOperand(operation.inputs[6], 6); + params.recurrant2ForgetWeights.data = GetConstOperandAsTensor(operation.inputs[6], 6); params.recurrant2ForgetWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[6]); - params.recurrant2CellWeights.data = getIRBlobFromOperand(operation.inputs[7], 7); + params.recurrant2CellWeights.data = GetConstOperandAsTensor(operation.inputs[7], 7); params.recurrant2CellWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[7]); - params.recurrant2OutputWeights.data = getIRBlobFromOperand(operation.inputs[8], 8); + params.recurrant2OutputWeights.data = GetConstOperandAsTensor(operation.inputs[8], 8); params.recurrant2OutputWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[8]); - params.cell2InputWeights.data = getIRBlobFromOperand(operation.inputs[9], 9); + params.cell2InputWeights.data = GetConstOperandAsTensor(operation.inputs[9], 9); params.cell2InputWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[9]); - params.cell2ForgetWeights.data = getIRBlobFromOperand(operation.inputs[10], 10); + params.cell2ForgetWeights.data = GetConstOperandAsTensor(operation.inputs[10], 10); params.cell2ForgetWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[10]); - params.cell2OutputWeights.data = getIRBlobFromOperand(operation.inputs[11], 11); + params.cell2OutputWeights.data = GetConstOperandAsTensor(operation.inputs[11], 11); params.cell2OutputWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[11]); - params.forgetGateBias.data = getIRBlobFromOperand(operation.inputs[13], 13); + params.forgetGateBias.data = GetConstOperandAsTensor(operation.inputs[13], 13); params.forgetGateBias.lifeTime = getV1_3_OperandLifeTime(operation.inputs[13]); - params.cellBias.data = getIRBlobFromOperand(operation.inputs[14], 14); + params.cellBias.data = GetConstOperandAsTensor(operation.inputs[14], 14); params.cellBias.lifeTime = getV1_3_OperandLifeTime(operation.inputs[14]); - params.outputGateBias.data = getIRBlobFromOperand(operation.inputs[15], 15); + params.outputGateBias.data = GetConstOperandAsTensor(operation.inputs[15], 15); params.outputGateBias.lifeTime = getV1_3_OperandLifeTime(operation.inputs[15]); if (lstmDesc.projectionLayerEnabled) { - params.projectionWeights.data = getIRBlobFromOperand(operation.inputs[16], 16); + params.projectionWeights.data = GetConstOperandAsTensor(operation.inputs[16], 16); params.projectionWeights.lifeTime = getV1_3_OperandLifeTime(operation.inputs[16]); - params.projectionBias.data = getIRBlobFromOperand(operation.inputs[17], 17); + params.projectionBias.data = GetConstOperandAsTensor(operation.inputs[17], 17); params.projectionBias.lifeTime = getV1_3_OperandLifeTime(operation.inputs[17]); } diff --git a/intel_nn_hal/PreparedModel.h b/intel_nn_hal/PreparedModel.h index 3faab3735..fd157c615 100644 --- a/intel_nn_hal/PreparedModel.h +++ b/intel_nn_hal/PreparedModel.h @@ -259,7 +259,6 @@ class PreparedModel : public V1_3::IPreparedModel { uint32_t mPadreq; InferenceEngine::ICNNNetwork *mCnnNetbuilder; - std::map mOpIndex2BlobMap; }; class VpuPreparedModel : public PreparedModel { From afe114ac7f65e878e5de6ec0858be638f989996c Mon Sep 17 00:00:00 2001 From: Jianxun Zhang Date: Wed, 28 Jul 2021 12:57:38 -0700 Subject: [PATCH 5/6] remove unused helper function addToBlobLayerMap() This function is not used... --- intel_nn_hal/graphAPI/IRBuilder.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/intel_nn_hal/graphAPI/IRBuilder.h b/intel_nn_hal/graphAPI/IRBuilder.h index b0e461b1f..ce6da1fab 100755 --- a/intel_nn_hal/graphAPI/IRBuilder.h +++ b/intel_nn_hal/graphAPI/IRBuilder.h @@ -166,10 +166,6 @@ class ModelBuilder std::vector& inputLayerNames); std::shared_ptr convertBuilder(); - void addToBlobLayerMap(IRBlob::Ptr blob, int index) - { - mBlob2LayerIdxMap[blob] = index; - } int layer_name_count = 0; std::map mBlob2LayerIdxMap; From 29e9215dbe0784446e615837e07fcc410c9412d1 Mon Sep 17 00:00:00 2001 From: Jianxun Zhang Date: Fri, 30 Jul 2021 09:58:53 -0700 Subject: [PATCH 6/6] amend logic in GnaPreparedModel::operationTANH() We cannot dereference mBuilderModel when it is null. That surely will crash the process. --- intel_nn_hal/GnaPreparedModel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intel_nn_hal/GnaPreparedModel.cpp b/intel_nn_hal/GnaPreparedModel.cpp index 3ac9c4527..93f8da092 100755 --- a/intel_nn_hal/GnaPreparedModel.cpp +++ b/intel_nn_hal/GnaPreparedModel.cpp @@ -1694,7 +1694,7 @@ bool GnaPreparedModel::operationTANH(const Operation& operation) { if (mBuilderModel == nullptr) { VLOG(L1, "mBuilder = nullptr !!!"); - // ASSERT + return false; } std::vector inLayers;