From 46e08fb5a1ef00264e59c6bd313773efc6adcd57 Mon Sep 17 00:00:00 2001 From: jianghui58 Date: Thu, 1 Apr 2021 15:15:29 +0800 Subject: [PATCH] move bitpack to anf_exporter --- mindspore/lite/test/models_npu.cfg | 2 +- .../lite/tools/anf_exporter/anf_exporter.cc | 90 ++++++++++++++++--- .../lite/tools/anf_exporter/anf_exporter.h | 4 + .../converter/parser/tf/tf_model_parser.cc | 10 +++ .../tools/converter/quantizer/quantize_util.h | 7 -- 5 files changed, 91 insertions(+), 22 deletions(-) diff --git a/mindspore/lite/test/models_npu.cfg b/mindspore/lite/test/models_npu.cfg index 2f3bcd5e80..be08434d6d 100644 --- a/mindspore/lite/test/models_npu.cfg +++ b/mindspore/lite/test/models_npu.cfg @@ -67,7 +67,7 @@ ml_video_edit_v10_best_model_nomean_20200723 8 #hdc_ocr_detect.onnx 30 #too many subgraphs ml_edu_kit_hand_detection.onnx 1 ml_edu_kit_hand_key_position.onnx 2 -ml_video_edit_oneclick_adaptis.pb 2 3 +ml_video_edit_oneclick_adaptis.pb 2.4 3 densenet.tflite 3 resnet_v2_101_299.tflite 1 ml_video_edit_enhance.pb 2 diff --git a/mindspore/lite/tools/anf_exporter/anf_exporter.cc b/mindspore/lite/tools/anf_exporter/anf_exporter.cc index bf7d050af9..63db830bd6 100644 --- a/mindspore/lite/tools/anf_exporter/anf_exporter.cc +++ b/mindspore/lite/tools/anf_exporter/anf_exporter.cc @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -33,6 +34,7 @@ #include "ops/tuple_get_item.h" #include "tools/converter/quant_param_holder.h" #include "tools/optimizer/common/gllo_utils.h" +#include "tools/converter/quantizer/bitpacking.h" #include "src/tensor.h" #include "src/common/utils.h" #include "ops/op_utils.h" @@ -233,6 +235,65 @@ void AnfExporter::RemoveIfDepend(const CNodePtr &cnode) { } } +int AnfExporter::DoBitPack(const int &bit_num, schema::TensorT *tensor_input) { + if (bit_num > 0 && bit_num < 8) { + std::vector origin_data(tensor_input->data.size()); + if (memcpy_s(origin_data.data(), origin_data.size() * sizeof(int8_t), tensor_input->data.data(), + tensor_input->data.size() * sizeof(uint8_t)) != EOK) { + MS_LOG(ERROR) << "memcpy failed."; + return RET_ERROR; + } + std::vector pack_data{}; + BitPack::BitPacking(bit_num, origin_data, &pack_data); + tensor_input->data.resize(pack_data.size() * sizeof(uint8_t)); + if (memcpy_s(tensor_input->data.data(), tensor_input->data.size() * sizeof(uint8_t), pack_data.data(), + pack_data.size() * sizeof(uint8_t)) != EOK) { + MS_LOG(ERROR) << "memcpy_s failed."; + return RET_ERROR; + } + } else if (bit_num > 9 && bit_num < 16) { + auto shape_size = + std::accumulate(tensor_input->dims.begin(), tensor_input->dims.end(), size_t(1), std::multiplies()); + std::vector origin_data(shape_size); + if (memcpy_s(origin_data.data(), origin_data.size() * sizeof(int16_t), tensor_input->data.data(), + tensor_input->data.size() * sizeof(uint8_t)) != EOK) { + MS_LOG(ERROR) << "memcpy failed."; + return RET_ERROR; + } + std::vector pack_data{}; + BitPack::BitPacking(bit_num, origin_data, &pack_data); + tensor_input->data.resize(pack_data.size() * sizeof(uint16_t)); + if (memcpy_s(tensor_input->data.data(), tensor_input->data.size() * sizeof(uint8_t), pack_data.data(), + pack_data.size() * sizeof(uint16_t)) != EOK) { + MS_LOG(ERROR) << "memcpy_s failed."; + return RET_ERROR; + } + } + return RET_OK; +} + +int AnfExporter::SetQuantOutputTensorType(const std::unique_ptr &meta_graph, + const std::shared_ptr &primitive, + const std::unique_ptr &dst_node) { + auto first_output_index = dst_node->outputIndex[0]; + auto first_tensor_output = meta_graph->allTensors[first_output_index].get(); + if (dst_node->quantType == schema::QuantType_PostTraining) { + if (primitive->name() != mindspore::ops::kNameQuantDTypeCast) { + first_tensor_output->dataType = kNumberTypeInt8; + } else { + auto primc = primitive->cast>(); + if (primc == nullptr) { + MS_LOG(ERROR) << "primitive is nullptr."; + return RET_ERROR; + } + if (primc->get_dst_t() != kNumberTypeFloat32) { + first_tensor_output->dataType = kNumberTypeInt8; + } + } + } + return RET_OK; +} + int AnfExporter::ConvertQuantParam(const std::unique_ptr &meta_graph, const std::shared_ptr &primitive, const std::unique_ptr &dst_node) { @@ -268,14 +329,23 @@ int AnfExporter::ConvertQuantParam(const std::unique_ptr &me auto tensor_input = meta_graph->allTensors[activate_index].get(); if (tensor_input->quantParams.empty()) { for (auto input_quant_param : input_quant_params[i]) { - std::unique_ptr input_quant_param_ptr = - std::make_unique(input_quant_param); + auto input_quant_param_ptr = std::make_unique(input_quant_param); MS_LOG(DEBUG) << "[input][" << i << "]node: " << dst_node->name << " scale: " << input_quant_param_ptr->scale << " zp: " << input_quant_param_ptr->zeroPoint; input_quant_param_ptr->dstDtype = tensor_input->dataType; tensor_input->quantParams.emplace_back(std::move(input_quant_param_ptr)); } } + if (!tensor_input->quantParams.empty()) { + int bit_num = tensor_input->quantParams.at(0)->numBits; + if (bit_num != 8 && bit_num != 16) { + auto status = DoBitPack(bit_num, tensor_input); + if (status != RET_OK) { + MS_LOG(ERROR) << "do bit pack failed."; + return RET_ERROR; + } + } + } } } else { MS_LOG(DEBUG) << "node: " << dst_node->name << " input quant params is empty"; @@ -308,18 +378,10 @@ int AnfExporter::ConvertQuantParam(const std::unique_ptr &me } } - auto first_output_index = dst_node->outputIndex[0]; - auto first_tensor_output = meta_graph->allTensors[first_output_index].get(); - if (dst_node->quantType == schema::QuantType_PostTraining) { - if (primitive->name() != mindspore::ops::kNameQuantDTypeCast) { - first_tensor_output->dataType = kNumberTypeInt8; - } else { - auto primc = primitive->cast>(); - MS_ASSERT(primc != nullptr); - if (primc->get_dst_t() != kNumberTypeFloat32) { - first_tensor_output->dataType = kNumberTypeInt8; - } - } + auto status = SetQuantOutputTensorType(meta_graph, primitive, dst_node); + if (status != RET_OK) { + MS_LOG(ERROR) << "set quant output tensor data type failed."; + return RET_ERROR; } return RET_OK; } diff --git a/mindspore/lite/tools/anf_exporter/anf_exporter.h b/mindspore/lite/tools/anf_exporter/anf_exporter.h index 35d2a526b4..461e5d2ebf 100644 --- a/mindspore/lite/tools/anf_exporter/anf_exporter.h +++ b/mindspore/lite/tools/anf_exporter/anf_exporter.h @@ -75,6 +75,10 @@ class AnfExporter { int SetGraphInputIndex(const std::unique_ptr &meta_graphT, const size_t &subgraph_index); int SetGraphoutputIndex(const CNodePtr &cnode, size_t subgraph_index, const std::unique_ptr &meta_graphT, schema::CNodeT *return_node); + static int DoBitPack(const int &bit_num, schema::TensorT *tensor_input); + static int SetQuantOutputTensorType(const std::unique_ptr &meta_graph, + const std::shared_ptr &primitive, + const std::unique_ptr &dst_node); static int ConvertQuantParam(const std::unique_ptr &meta_graph, const std::shared_ptr &primitive, const std::unique_ptr &dst_node); diff --git a/mindspore/lite/tools/converter/parser/tf/tf_model_parser.cc b/mindspore/lite/tools/converter/parser/tf/tf_model_parser.cc index a0ac14f94e..37ba910b36 100644 --- a/mindspore/lite/tools/converter/parser/tf/tf_model_parser.cc +++ b/mindspore/lite/tools/converter/parser/tf/tf_model_parser.cc @@ -243,6 +243,16 @@ STATUS SetStringTensorInfo(const tensorflow::TensorProto &tensor_proto, tensor:: for (int i = 0; i < tensor_shape.dim_size(); i++) { shape_vector.push_back(tensor_shape.dim(i).size()); } + + if (shape_vector.empty()) { + *tensor_info = CreateTensorInfo(nullptr, 0, shape_vector, kObjectTypeString); + if (*tensor_info == nullptr) { + MS_LOG(ERROR) << "create tensor info failed."; + return RET_ERROR; + } + return RET_OK; + } + std::string shape_str; shape_str += std::to_string(shape_vector.size()) + ","; for (auto &dim : shape_vector) { diff --git a/mindspore/lite/tools/converter/quantizer/quantize_util.h b/mindspore/lite/tools/converter/quantizer/quantize_util.h index f52cd57fdd..d20d46a588 100644 --- a/mindspore/lite/tools/converter/quantizer/quantize_util.h +++ b/mindspore/lite/tools/converter/quantizer/quantize_util.h @@ -389,13 +389,6 @@ STATUS QuantFilter(const tensor::TensorPtr &weight, const PrimitivePtr &primitiv MS_LOG(ERROR) << "Do huffman encode failed."; return ret; } -#else - // do bit pack - ret = DoBitPack(weight, bit_num, quant_data); - if (ret != RET_OK) { - MS_LOG(ERROR) << "Do bit pack failed."; - return ret; - } #endif if (quant_params.empty()) {