Merge pull request !7466 from wangshaocong/bugfix_master_v2tags/v1.1.0
| @@ -18,7 +18,7 @@ | |||||
| #include "nnacl/quantization/fixed_point.h" | #include "nnacl/quantization/fixed_point.h" | ||||
| void ScaleInnerInt8(const int8_t *in_data, int8_t *out_data, const int8_t *scale, int outer_start, int outer_end, | void ScaleInnerInt8(const int8_t *in_data, int8_t *out_data, const int8_t *scale, int outer_start, int outer_end, | ||||
| int axis_size, int inner_size, const ScaleParameter *scale_param) { | |||||
| int axis_size, int inner_size, const ScaleParameter *scale_param, int max, int min) { | |||||
| for (int out = outer_start; out < outer_end; out++) { | for (int out = outer_start; out < outer_end; out++) { | ||||
| int out_offset = out * axis_size * inner_size; | int out_offset = out * axis_size * inner_size; | ||||
| for (int i = 0; i < axis_size; i++) { | for (int i = 0; i < axis_size; i++) { | ||||
| @@ -34,8 +34,8 @@ void ScaleInnerInt8(const int8_t *in_data, int8_t *out_data, const int8_t *scale | |||||
| scale_param->scale_mul_arg_.multiplier_), | scale_param->scale_mul_arg_.multiplier_), | ||||
| scale_param->scale_mul_arg_.right_shift_); | scale_param->scale_mul_arg_.right_shift_); | ||||
| int tmp = input_mul_scale + scale_param->output_zp_; | int tmp = input_mul_scale + scale_param->output_zp_; | ||||
| tmp = tmp > INT8_MAX ? INT8_MAX : tmp; | |||||
| tmp = tmp < INT8_MIN ? INT8_MIN : tmp; | |||||
| tmp = tmp > max ? max : tmp; | |||||
| tmp = tmp < min ? min : tmp; | |||||
| out_data[in_offset] = tmp; | out_data[in_offset] = tmp; | ||||
| } | } | ||||
| } | } | ||||
| @@ -44,7 +44,7 @@ void ScaleInnerInt8(const int8_t *in_data, int8_t *out_data, const int8_t *scale | |||||
| void ScaleInnerWithBiasInt8(const int8_t *in_data, int8_t *out_data, const int8_t *scale, const int8_t *offset, | void ScaleInnerWithBiasInt8(const int8_t *in_data, int8_t *out_data, const int8_t *scale, const int8_t *offset, | ||||
| int outer_start, int outer_end, int axis_size, int inner_size, | int outer_start, int outer_end, int axis_size, int inner_size, | ||||
| const ScaleParameter *scale_param) { | |||||
| const ScaleParameter *scale_param, int max, int min) { | |||||
| for (int out = outer_start; out < outer_end; out++) { | for (int out = outer_start; out < outer_end; out++) { | ||||
| int out_offset = out * axis_size * inner_size; | int out_offset = out * axis_size * inner_size; | ||||
| for (int i = 0; i < axis_size; i++) { | for (int i = 0; i < axis_size; i++) { | ||||
| @@ -63,10 +63,10 @@ void ScaleInnerWithBiasInt8(const int8_t *in_data, int8_t *out_data, const int8_ | |||||
| int bias = RoundingDivideByPOT( | int bias = RoundingDivideByPOT( | ||||
| SaturatingRoundingDoublingHighMul(tmp_bias * (1 << (unsigned int)scale_param->offset_mul_arg_.left_shift_), | SaturatingRoundingDoublingHighMul(tmp_bias * (1 << (unsigned int)scale_param->offset_mul_arg_.left_shift_), | ||||
| scale_param->offset_mul_arg_.multiplier_), | scale_param->offset_mul_arg_.multiplier_), | ||||
| scale_param->scale_mul_arg_.right_shift_); | |||||
| scale_param->offset_mul_arg_.right_shift_); | |||||
| int tmp = input_mul_scale + bias + scale_param->output_zp_; | int tmp = input_mul_scale + bias + scale_param->output_zp_; | ||||
| tmp = tmp > INT8_MAX ? INT8_MAX : tmp; | |||||
| tmp = tmp < INT8_MIN ? INT8_MIN : tmp; | |||||
| tmp = tmp > max ? max : tmp; | |||||
| tmp = tmp < min ? min : tmp; | |||||
| out_data[in_offset] = tmp; | out_data[in_offset] = tmp; | ||||
| } | } | ||||
| } | } | ||||
| @@ -74,21 +74,21 @@ void ScaleInnerWithBiasInt8(const int8_t *in_data, int8_t *out_data, const int8_ | |||||
| } | } | ||||
| void DoScaleInt8(const int8_t *in_data, int8_t *out_data, const int8_t *scale, int task_id, | void DoScaleInt8(const int8_t *in_data, int8_t *out_data, const int8_t *scale, int task_id, | ||||
| const ScaleParameter *scale_param) { | |||||
| const ScaleParameter *scale_param, int max, int min) { | |||||
| int outer_step = UP_DIV(scale_param->outer_size_, scale_param->op_parameter_.thread_num_); | int outer_step = UP_DIV(scale_param->outer_size_, scale_param->op_parameter_.thread_num_); | ||||
| int outer_start = task_id * outer_step; | int outer_start = task_id * outer_step; | ||||
| int outer_end = MSMIN(outer_start + outer_step, scale_param->outer_size_); | int outer_end = MSMIN(outer_start + outer_step, scale_param->outer_size_); | ||||
| ScaleInnerInt8(in_data, out_data, scale, outer_start, outer_end, scale_param->axis_size_, scale_param->inner_size_, | ScaleInnerInt8(in_data, out_data, scale, outer_start, outer_end, scale_param->axis_size_, scale_param->inner_size_, | ||||
| scale_param); | |||||
| scale_param, max, min); | |||||
| } | } | ||||
| void DoScaleWithBiasInt8(const int8_t *in_data, int8_t *out_data, const int8_t *scale, const int8_t *offset, | void DoScaleWithBiasInt8(const int8_t *in_data, int8_t *out_data, const int8_t *scale, const int8_t *offset, | ||||
| int task_id, const ScaleParameter *scale_param) { | |||||
| int task_id, const ScaleParameter *scale_param, int max, int min) { | |||||
| int outer_step = UP_DIV(scale_param->outer_size_, scale_param->op_parameter_.thread_num_); | int outer_step = UP_DIV(scale_param->outer_size_, scale_param->op_parameter_.thread_num_); | ||||
| int outer_start = task_id * outer_step; | int outer_start = task_id * outer_step; | ||||
| int outer_end = MSMIN(outer_start + outer_step, scale_param->outer_size_); | int outer_end = MSMIN(outer_start + outer_step, scale_param->outer_size_); | ||||
| ScaleInnerWithBiasInt8(in_data, out_data, scale, offset, outer_start, outer_end, scale_param->axis_size_, | ScaleInnerWithBiasInt8(in_data, out_data, scale, offset, outer_start, outer_end, scale_param->axis_size_, | ||||
| scale_param->inner_size_, scale_param); | |||||
| scale_param->inner_size_, scale_param, max, min); | |||||
| } | } | ||||
| @@ -23,9 +23,9 @@ | |||||
| extern "C" { | extern "C" { | ||||
| #endif | #endif | ||||
| void DoScaleInt8(const int8_t *in_data, int8_t *out_data, const int8_t *scale, int task_id, | void DoScaleInt8(const int8_t *in_data, int8_t *out_data, const int8_t *scale, int task_id, | ||||
| const ScaleParameter *scale_param); | |||||
| const ScaleParameter *scale_param, int max, int min); | |||||
| void DoScaleWithBiasInt8(const int8_t *in_data, int8_t *out_data, const int8_t *scale, const int8_t *offset, | void DoScaleWithBiasInt8(const int8_t *in_data, int8_t *out_data, const int8_t *scale, const int8_t *offset, | ||||
| int task_id, const ScaleParameter *scale_param); | |||||
| int task_id, const ScaleParameter *scale_param, int max, int min); | |||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -15,12 +15,13 @@ | |||||
| */ | */ | ||||
| #include "src/runtime/kernel/arm/fp32/arithmetic.h" | #include "src/runtime/kernel/arm/fp32/arithmetic.h" | ||||
| #include "src/runtime/kernel/arm/int8/add_int8.h" | |||||
| #include "src/runtime/kernel/arm/int8/mul_int8.h" | |||||
| #include "include/errorcode.h" | |||||
| #include "schema/model_generated.h" | #include "schema/model_generated.h" | ||||
| #include "src/kernel_registry.h" | #include "src/kernel_registry.h" | ||||
| #include "src/runtime/kernel/arm/int8/add_int8.h" | |||||
| #include "src/runtime/kernel/arm/int8/mul_int8.h" | |||||
| #include "src/runtime/runtime_api.h" | #include "src/runtime/runtime_api.h" | ||||
| #include "include/errorcode.h" | |||||
| using mindspore::kernel::KERNEL_ARCH::kCPU; | using mindspore::kernel::KERNEL_ARCH::kCPU; | ||||
| using mindspore::lite::KernelRegistrar; | using mindspore::lite::KernelRegistrar; | ||||
| @@ -48,6 +49,12 @@ int ArithmeticCPUKernel::ReSize() { | |||||
| arithmeticParameter_->in_elements_num0_ = in_tensors_[0]->ElementsNum(); | arithmeticParameter_->in_elements_num0_ = in_tensors_[0]->ElementsNum(); | ||||
| arithmeticParameter_->in_elements_num1_ = in_tensors_[1]->ElementsNum(); | arithmeticParameter_->in_elements_num1_ = in_tensors_[1]->ElementsNum(); | ||||
| arithmeticParameter_->out_elements_num_ = out_tensors_[0]->ElementsNum(); | arithmeticParameter_->out_elements_num_ = out_tensors_[0]->ElementsNum(); | ||||
| memcpy(arithmeticParameter_->in_shape0_, static_cast<void *>(in_tensors_[0]->shape().data()), | |||||
| in_tensors_[0]->shape().size() * sizeof(int)); | |||||
| memcpy(arithmeticParameter_->in_shape1_, static_cast<void *>(in_tensors_[1]->shape().data()), | |||||
| in_tensors_[1]->shape().size() * sizeof(int)); | |||||
| memcpy(arithmeticParameter_->out_shape_, static_cast<void *>(out_tensors_[0]->shape().data()), | |||||
| out_tensors_[0]->shape().size() * sizeof(int)); | |||||
| if (arithmeticParameter_->in_elements_num0_ == 1 || arithmeticParameter_->in_elements_num1_ == 1) { | if (arithmeticParameter_->in_elements_num0_ == 1 || arithmeticParameter_->in_elements_num1_ == 1) { | ||||
| switch (arithmeticParameter_->op_parameter_.type_) { | switch (arithmeticParameter_->op_parameter_.type_) { | ||||
| @@ -15,6 +15,7 @@ | |||||
| */ | */ | ||||
| #include "src/runtime/kernel/arm/int8/scale_int8.h" | #include "src/runtime/kernel/arm/int8/scale_int8.h" | ||||
| #include <string.h> | #include <string.h> | ||||
| #include <vector> | #include <vector> | ||||
| #include "nnacl/int8/scale_int8.h" | #include "nnacl/int8/scale_int8.h" | ||||
| @@ -195,9 +196,35 @@ int ScaleInt8CPUKernel::ReSize() { | |||||
| int ScaleInt8CPUKernel::Scale(int task_id) { | int ScaleInt8CPUKernel::Scale(int task_id) { | ||||
| if (has_bias_) { | if (has_bias_) { | ||||
| DoScaleWithBiasInt8(input_ptr_, output_ptr_, scale_, offset_, task_id, scale_param_); | |||||
| switch (scale_param_->activation_type_) { | |||||
| case schema::ActivationType_RELU: | |||||
| DoScaleWithBiasInt8(input_ptr_, output_ptr_, scale_, offset_, task_id, scale_param_, INT8_MAX, 0); | |||||
| break; | |||||
| case schema::ActivationType_RELU6: | |||||
| DoScaleWithBiasInt8(input_ptr_, output_ptr_, scale_, offset_, task_id, scale_param_, 6, 0); | |||||
| break; | |||||
| case schema::ActivationType_NO_ACTIVATION: | |||||
| DoScaleWithBiasInt8(input_ptr_, output_ptr_, scale_, offset_, task_id, scale_param_, INT8_MAX, INT8_MIN); | |||||
| break; | |||||
| default: | |||||
| MS_LOG(ERROR) << "Scale does not support activation type " << scale_param_->activation_type_; | |||||
| return RET_ERROR; | |||||
| } | |||||
| } else { | } else { | ||||
| DoScaleInt8(input_ptr_, output_ptr_, scale_, task_id, scale_param_); | |||||
| switch (scale_param_->activation_type_) { | |||||
| case schema::ActivationType_RELU: | |||||
| DoScaleInt8(input_ptr_, output_ptr_, scale_, task_id, scale_param_, INT8_MAX, 0); | |||||
| break; | |||||
| case schema::ActivationType_RELU6: | |||||
| DoScaleInt8(input_ptr_, output_ptr_, scale_, task_id, scale_param_, 6, 0); | |||||
| break; | |||||
| case schema::ActivationType_NO_ACTIVATION: | |||||
| DoScaleInt8(input_ptr_, output_ptr_, scale_, task_id, scale_param_, INT8_MAX, INT8_MIN); | |||||
| break; | |||||
| default: | |||||
| MS_LOG(ERROR) << "Scale does not support activation type " << scale_param_->activation_type_; | |||||
| return RET_ERROR; | |||||
| } | |||||
| } | } | ||||
| return RET_OK; | return RET_OK; | ||||
| @@ -5,3 +5,4 @@ ml_face_3d.onnx | |||||
| gts_version-RFB-320_simplified.onnx | gts_version-RFB-320_simplified.onnx | ||||
| mnist-8.onnx | mnist-8.onnx | ||||
| crnn_lite_lstm_v2.onnx:32,32,32,1 | crnn_lite_lstm_v2.onnx:32,32,32,1 | ||||
| psenet_lite_mbv2.onnx:1,32,32,3 | |||||
| @@ -15,6 +15,7 @@ | |||||
| */ | */ | ||||
| #include "tools/converter/parser/onnx/onnx_pool_parser.h" | #include "tools/converter/parser/onnx/onnx_pool_parser.h" | ||||
| #include <memory> | #include <memory> | ||||
| namespace mindspore { | namespace mindspore { | ||||
| @@ -77,7 +78,11 @@ STATUS OnnxPoolParser::Parse(const onnx::GraphProto &onnx_graph, const onnx::Nod | |||||
| } | } | ||||
| } | } | ||||
| if (attribute_name == "auto_pad") { | if (attribute_name == "auto_pad") { | ||||
| MS_ASSERT(false); | |||||
| if (onnx_node_attr.s() == "SAME_UPPER") { | |||||
| attr->padMode = schema::PadMode_SAME_UPPER; | |||||
| } else if (onnx_node_attr.s() == "SAME_LOWER") { | |||||
| attr->padMode = schema::PadMode_SAME_LOWER; | |||||
| } | |||||
| } | } | ||||
| if (attribute_name == "pads") { | if (attribute_name == "pads") { | ||||
| if (onnx_node_attr.ints_size() == 4) { | if (onnx_node_attr.ints_size() == 4) { | ||||
| @@ -15,8 +15,9 @@ | |||||
| */ | */ | ||||
| #include "tools/converter/parser/onnx/onnx_relu_parser.h" | #include "tools/converter/parser/onnx/onnx_relu_parser.h" | ||||
| #include <vector> | |||||
| #include <memory> | #include <memory> | ||||
| #include <vector> | |||||
| #include "securec/include/securec.h" | #include "securec/include/securec.h" | ||||
| namespace mindspore { | namespace mindspore { | ||||
| @@ -47,6 +48,12 @@ STATUS OnnxReluParser::Parse(const onnx::GraphProto &onnx_graph, const onnx::Nod | |||||
| MS_LOG(DEBUG) << "onnx LeakyReluParser"; | MS_LOG(DEBUG) << "onnx LeakyReluParser"; | ||||
| attr->type = schema::ActivationType_LEAKY_RELU; | attr->type = schema::ActivationType_LEAKY_RELU; | ||||
| } | } | ||||
| for (const auto &onnx_node_attr : onnx_node.attribute()) { | |||||
| const auto &attribute_name = onnx_node_attr.name(); | |||||
| if (attribute_name == "alpha") { | |||||
| attr->alpha = onnx_node_attr.f(); | |||||
| } | |||||
| } | |||||
| op->primitive->value.type = schema::PrimitiveType_Activation; | op->primitive->value.type = schema::PrimitiveType_Activation; | ||||
| op->primitive->value.value = attr.release(); | op->primitive->value.value = attr.release(); | ||||
| @@ -15,6 +15,7 @@ | |||||
| */ | */ | ||||
| #include "tools/converter/parser/onnx/onnx_upsample_parser.h" | #include "tools/converter/parser/onnx/onnx_upsample_parser.h" | ||||
| #include <memory> | #include <memory> | ||||
| namespace mindspore { | namespace mindspore { | ||||
| @@ -54,7 +55,7 @@ STATUS OnnxUpsampleParser::Parse(const onnx::GraphProto &onnx_graph, const onnx: | |||||
| attr->newWidth = 1; | attr->newWidth = 1; | ||||
| attr->newHeight = 1; | attr->newHeight = 1; | ||||
| attr->alignCorners = false; | attr->alignCorners = false; | ||||
| op->primitive->value.type = schema::PrimitiveType_Upsample; | |||||
| op->primitive->value.type = schema::PrimitiveType_Resize; | |||||
| op->primitive->value.value = attr.release(); | op->primitive->value.value = attr.release(); | ||||
| return RET_OK; | return RET_OK; | ||||
| } | } | ||||