!23089 fix config parse bug && full quant bug
Merge pull request !23089 from yeyunpeng2020/quant
This commit is contained in:
commit
a0829c11e5
|
@ -25,11 +25,10 @@
|
|||
namespace mindspore::lite::micro::nnacl {
|
||||
constexpr auto kInt8Range = 256;
|
||||
|
||||
void CalculateTableList(int8_t *table, const float input_scale, const int32_t input_zp) {
|
||||
void CalculateTableList(int8_t *table, const float input_scale, const int32_t input_zp, const float output_scale,
|
||||
const int32_t output_zp) {
|
||||
constexpr int32_t min_value = std::numeric_limits<int8_t>::min();
|
||||
constexpr int32_t max_value = std::numeric_limits<int8_t>::max();
|
||||
constexpr float output_scale = 1.0f / kInt8Range;
|
||||
constexpr int32_t output_zp = std::numeric_limits<int8_t>::min();
|
||||
|
||||
for (int i = min_value; i < max_value; ++i) {
|
||||
const float real_input_value = input_scale * (i - input_zp);
|
||||
|
@ -49,12 +48,7 @@ int SigmodInt8Coder::Prepare(CoderContext *const context) {
|
|||
const int32_t input_zp = input_tensor_->quant_params().at(0).zeroPoint;
|
||||
const float output_scale = output_tensor_->quant_params().at(0).scale;
|
||||
const int32_t output_zp = output_tensor_->quant_params().at(0).zeroPoint;
|
||||
if (output_scale != (1.0f / kInt8Range) || output_zp != static_cast<int32_t>(std::numeric_limits<int8_t>::min())) {
|
||||
MS_LOG(ERROR) << "Output scale is : " << output_scale << ", should be 1/kInt8Range. Output zp is : " << output_zp
|
||||
<< ", should be -128.";
|
||||
return RET_ERROR;
|
||||
}
|
||||
CalculateTableList(table_list_, input_scale, input_zp);
|
||||
CalculateTableList(table_list_, input_scale, input_zp, output_scale, output_zp);
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -560,14 +560,19 @@ int ReduceInt8CPUKernel::CallReduceUnit(int task_id) {
|
|||
MS_LOG(ERROR) << "Input data of reduce int8 operator is null.";
|
||||
return RET_NULL_PTR;
|
||||
}
|
||||
if (dst_data_ == nullptr) {
|
||||
MS_LOG(ERROR) << "Output data of reduce int8 operator is null.";
|
||||
return RET_NULL_PTR;
|
||||
}
|
||||
|
||||
if (!is_last_axis_) {
|
||||
if (dst_data_ == nullptr) {
|
||||
MS_LOG(ERROR) << "Output data of reduce int8 operator is null.";
|
||||
return RET_NULL_PTR;
|
||||
}
|
||||
return reducer_(outer_size_, inner_size_, axis_size_, src_data_, dst_data_, &quant_arg_, task_id,
|
||||
op_parameter_->thread_num_);
|
||||
} else {
|
||||
if (last_dst_data_ == nullptr) {
|
||||
MS_LOG(ERROR) << "Output data of reduce int8 operator is null.";
|
||||
return RET_NULL_PTR;
|
||||
}
|
||||
return last_reducer_(outer_size_, inner_size_, axis_size_, src_data_, last_dst_data_, &quant_arg_, task_id,
|
||||
op_parameter_->thread_num_);
|
||||
}
|
||||
|
|
|
@ -30,11 +30,10 @@ using mindspore::lite::RET_OK;
|
|||
using mindspore::schema::ActivationType_SIGMOID;
|
||||
|
||||
namespace mindspore::kernel {
|
||||
void CalculateTableList(int8_t *table, const float input_scale, const int32_t input_zp) {
|
||||
void CalculateTableList(int8_t *table, const float input_scale, const int32_t input_zp, const float output_scale,
|
||||
const int32_t output_zp) {
|
||||
int32_t min_value = std::numeric_limits<int8_t>::min();
|
||||
int32_t max_value = std::numeric_limits<int8_t>::max();
|
||||
const float output_scale = 1.0f / 256;
|
||||
const int32_t output_zp = -128;
|
||||
|
||||
for (int i = min_value; i < max_value; ++i) {
|
||||
const float real_input_value = input_scale * (i - input_zp);
|
||||
|
@ -58,7 +57,7 @@ int SigmoidInt8CPUKernel::Init() {
|
|||
<< ", should be -128.";
|
||||
return RET_ERROR;
|
||||
}
|
||||
CalculateTableList(table_list_, input_scale, input_zp);
|
||||
CalculateTableList(table_list_, input_scale, input_zp, output_scale, output_zp);
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ normalize_std=[1, 1, 1]
|
|||
# Image resize
|
||||
resize_width=640
|
||||
resize_height=640
|
||||
# Resize method supports LINEAR or NEARST or CUBIC
|
||||
# Resize method supports LINEAR or NEAREST or CUBIC
|
||||
resize_method=LINEAR
|
||||
|
||||
[full_quant_param]
|
||||
|
|
|
@ -78,6 +78,9 @@ int SplitLineToMap(std::ifstream *ifs, std::map<std::string, std::map<std::strin
|
|||
return RET_ERROR;
|
||||
}
|
||||
|
||||
if (raw_line.empty()) {
|
||||
continue;
|
||||
}
|
||||
if (raw_line.at(0) == '[') {
|
||||
section = raw_line.substr(1, raw_line.size() - 2);
|
||||
continue;
|
||||
|
|
|
@ -22,6 +22,7 @@ namespace mindspore {
|
|||
namespace lite {
|
||||
namespace {
|
||||
constexpr int kQuantBitNumInt16 = 16;
|
||||
constexpr int kQuantBitNumInt8 = 8;
|
||||
} // namespace
|
||||
int QuantParamParser::ParseCommonQuant(const CommonQuantString &common_quant_string,
|
||||
quant::CommonQuantParam *common_quant) {
|
||||
|
@ -39,12 +40,12 @@ int QuantParamParser::ParseCommonQuant(const CommonQuantString &common_quant_str
|
|||
}
|
||||
if (common_quant->quant_type == schema::QuantType_WeightQuant) {
|
||||
if (common_quant->bit_num < 0 || common_quant->bit_num > kQuantBitNumInt16) {
|
||||
MS_LOG(ERROR) << "INPUT ILLEGAL: bit_num should be greater than zero and less than 16 currently.";
|
||||
MS_LOG(ERROR) << "INPUT ILLEGAL: bit_num should be [0,16].";
|
||||
return RET_INPUT_PARAM_INVALID;
|
||||
}
|
||||
} else if (common_quant->quant_type == schema::QuantType_PostTraining) {
|
||||
if (common_quant->bit_num <= 0 || common_quant->bit_num > kQuantBitNumInt16) {
|
||||
MS_LOG(ERROR) << "INPUT ILLEGAL: bit_num should be greater or equal to zero and less than 16 currently.";
|
||||
if (common_quant->bit_num <= 0 || common_quant->bit_num > kQuantBitNumInt8) {
|
||||
MS_LOG(ERROR) << "INPUT ILLEGAL: bit_num should be [1,8].";
|
||||
return RET_INPUT_PARAM_INVALID;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@ cv::InterpolationFlags ConvertResizeMethod(const std::string &method) {
|
|||
} else if (method == "CUBIC") {
|
||||
return cv::INTER_CUBIC;
|
||||
} else {
|
||||
MS_LOG(ERROR) << "Unsupported resize method:" << method;
|
||||
MS_LOG(ERROR) << "INPUT ILLEGAL: resize_method must be NEAREST|LINEAR|CUBIC.";
|
||||
return cv::INTER_MAX;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,7 +29,7 @@ normalize_std=[127.5, 127.5, 127.5]
|
|||
# Image resize
|
||||
resize_width=224
|
||||
resize_height=224
|
||||
# Resize method supports LINEAR or NEARST or CUBIC
|
||||
# Resize method supports LINEAR or NEAREST or CUBIC
|
||||
resize_method=LINEAR
|
||||
# Image center crop
|
||||
center_crop_width=224
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <memory>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <functional>
|
||||
#include "include/version.h"
|
||||
#include "ops/concat.h"
|
||||
#include "ops/crop.h"
|
||||
|
@ -339,13 +340,13 @@ static bool SearchLowerBound(const std::vector<float> &data, const size_t &index
|
|||
return false;
|
||||
}
|
||||
if (fabs(max_tmp - *min_tmp) <= 0.0f || fabs(length - *min_idx) <= 0.0f) {
|
||||
MS_LOG(ERROR) << "divisor cannot be 0";
|
||||
MS_LOG(INFO) << "divisor cannot be 0";
|
||||
return false;
|
||||
}
|
||||
float range_ratio = (data.at(index) - *min_tmp) / (max_tmp - *min_tmp);
|
||||
float index_ratio = static_cast<float>(index - *min_idx) / (length - *min_idx);
|
||||
if (fabs(index_ratio) <= 0.0f) {
|
||||
MS_LOG(ERROR) << "divisor cannot be 0";
|
||||
MS_LOG(INFO) << "divisor cannot be 0";
|
||||
return false;
|
||||
}
|
||||
if (index_ratio > 0 && range_ratio / index_ratio > ratio) {
|
||||
|
@ -362,13 +363,13 @@ static bool SearchUpperBound(const std::vector<float> &data, const size_t &index
|
|||
return false;
|
||||
}
|
||||
if (fabs(*max_tmp - min_tmp) <= 0.0f || fabs(length - *max_idx) <= 0.0f) {
|
||||
MS_LOG(ERROR) << "divisor cannot be 0";
|
||||
MS_LOG(INFO) << "divisor cannot be 0";
|
||||
return false;
|
||||
}
|
||||
float range_ratio = (*max_tmp - data.at(index)) / (*max_tmp - min_tmp);
|
||||
float index_ratio = static_cast<float>(index - *max_idx) / (length - *max_idx);
|
||||
if (fabs(index_ratio) <= 0.0f) {
|
||||
MS_LOG(ERROR) << "divisor cannot be 0";
|
||||
MS_LOG(INFO) << "divisor cannot be 0";
|
||||
return false;
|
||||
}
|
||||
if (index_ratio > 0 && range_ratio / index_ratio > ratio) {
|
||||
|
@ -384,8 +385,10 @@ static float CalPercentile(const std::vector<float> &data, const int &outlier_pe
|
|||
int index = std::ceil(val);
|
||||
float result;
|
||||
if (index - val > 0) {
|
||||
MS_ASSERT(index - 1 >= 0);
|
||||
result = data.at(index - 1);
|
||||
} else {
|
||||
MS_ASSERT(index - 1 >= 0);
|
||||
result = (data.at(index - 1) + data.at(index)) / 2;
|
||||
}
|
||||
return result;
|
||||
|
|
|
@ -57,7 +57,7 @@ enum WeightQuantType {
|
|||
constexpr size_t kUint8Quantization = 8;
|
||||
constexpr size_t kMaxBit = 8;
|
||||
constexpr size_t kMaxNum1024 = 1024;
|
||||
constexpr size_t kPercentBase = 100;
|
||||
constexpr float kPercentBase = 100.0;
|
||||
constexpr size_t kMillisecondsBase = 10;
|
||||
constexpr size_t kWightIndex = 1;
|
||||
constexpr double kScaleThreashold = 1e-38;
|
||||
|
|
Loading…
Reference in New Issue