From a37e917810e58b66c41876e8fa80dcd1a245a5b9 Mon Sep 17 00:00:00 2001 From: zhengjun10 Date: Mon, 25 Jan 2021 16:27:02 +0800 Subject: [PATCH] support onnx loop model tiny-yolov3 --- mindspore/lite/nnacl/base/cast_base.h | 6 ++ mindspore/lite/src/ops/nonzero.cc | 21 +++-- mindspore/lite/src/ops/primitive_c.cc | 3 + mindspore/lite/src/ops/tensorlist_setitem.cc | 4 +- mindspore/lite/src/ops/tensorlist_stack.cc | 2 +- mindspore/lite/src/ops/transpose.cc | 7 ++ .../src/runtime/kernel/arm/base/carry_data.cc | 25 ++++-- .../src/runtime/kernel/arm/fp32/cast_fp32.cc | 3 + .../runtime/kernel/arm/fp32/nonzero_fp32.cc | 48 ++-------- .../arm/fp32/tensorlist_setitem_fp32.cc | 33 +++++-- .../kernel/arm/fp32/tensorlist_setitem_fp32.h | 1 + .../kernel/arm/fp32/tensorlist_stack_fp32.cc | 12 ++- .../runtime/kernel/arm/fp32/unsqueeze_fp32.cc | 4 + ...with_several_inputs_or_without_outputs.cfg | 1 + mindspore/lite/test/run_benchmark_nets.sh | 41 +++++---- .../lite/tools/converter/anf_transform.cc | 2 +- .../legacy_optimizer/graph/infershape_pass.cc | 7 ++ .../graph/subgraph_node_pass.cc | 8 +- .../legacy_optimizer/graph/switch_pass.cc | 87 +++++++++++-------- .../legacy_optimizer/graph/switch_pass.h | 1 + .../parser/onnx/onnx_model_parser.cc | 70 +++++++++------ .../converter/parser/onnx/onnx_model_parser.h | 2 + .../graph/onnx_inputs_adjust_pass.cc | 18 ++-- 23 files changed, 241 insertions(+), 165 deletions(-) diff --git a/mindspore/lite/nnacl/base/cast_base.h b/mindspore/lite/nnacl/base/cast_base.h index 411f2926a3..a769cfd7d9 100644 --- a/mindspore/lite/nnacl/base/cast_base.h +++ b/mindspore/lite/nnacl/base/cast_base.h @@ -76,6 +76,12 @@ inline void Float32ToInt16(const float *input, int16_t *output, int number) { output[i] = (int16_t)input[i]; } } + +inline void BoolToInt32(const bool *input, int32_t *output, int number) { + for (int i = 0; i < number; ++i) { + output[i] = (int32_t)input[i]; + } +} #ifdef __cplusplus } #endif diff --git a/mindspore/lite/src/ops/nonzero.cc b/mindspore/lite/src/ops/nonzero.cc index 952bef4259..d4e7a3793c 100644 --- a/mindspore/lite/src/ops/nonzero.cc +++ b/mindspore/lite/src/ops/nonzero.cc @@ -70,7 +70,7 @@ template void CalShape(const T *data, const std::vector &inputs, std::vector *out_shape) { int input_count = inputs[0]->ElementsNum(); int input_dim_size = inputs[0]->shape().empty() ? 1 : inputs[0]->shape().size(); - (*out_shape)[0] = input_dim_size; + out_shape->emplace_back(input_dim_size); int nonzero_size = 0; for (int i = 0; i < input_count; i++) { if (static_cast(data[i]) != 0) { @@ -78,35 +78,34 @@ void CalShape(const T *data, const std::vector &inputs, std::vectoremplace_back(nonzero_size); } } int NonZero::InferShape(std::vector inputs_, std::vector outputs_) { MS_ASSERT(this->primitive_ != nullptr); MS_ASSERT(inputs_.size() == 1); - auto input = inputs_.front(); - MS_ASSERT(input != nullptr); + auto input_tensor = inputs_.front(); + MS_ASSERT(input_tensor != nullptr); auto output = outputs_.front(); MS_ASSERT(output != nullptr); - output->set_data_type(input->data_type()); - output->set_format(input->format()); + output->set_data_type(TypeId::kNumberTypeInt32); + output->set_format(input_tensor->format()); if (!infer_flag()) { return RET_INFER_INVALID; } std::vector out_shape; if (inputs_.size() == kSingleNum) { - auto input_tensor = inputs_.at(0); if (input_tensor->data_c() == nullptr) { MS_LOG(INFO) << "Do infer shape in runtime."; return RET_INFER_INVALID; } switch (input_tensor->data_type()) { - case kNumberTypeFloat: { - auto data = reinterpret_cast(input_tensor->MutableData()); - CalShape(data, inputs_, &out_shape); + case kNumberTypeBool: { + auto data = reinterpret_cast(input_tensor->MutableData()); + CalShape(data, inputs_, &out_shape); } break; default: { MS_LOG(ERROR) << "NonZero weight tensor has unsupported dataType: " << input_tensor->data_type(); diff --git a/mindspore/lite/src/ops/primitive_c.cc b/mindspore/lite/src/ops/primitive_c.cc index b6b242297a..49302d8c2b 100644 --- a/mindspore/lite/src/ops/primitive_c.cc +++ b/mindspore/lite/src/ops/primitive_c.cc @@ -168,6 +168,7 @@ #include "src/ops/random_standard_normal.h" #include "src/ops/invert_permutation.h" #include "src/ops/crop_and_resize.h" +#include "src/ops/nonzero.h" #ifdef SUPPORT_TRAIN #include "src/ops/neg_grad.h" @@ -1021,6 +1022,8 @@ PrimitiveC *PrimitiveC::Create(mindspore::schema::PrimitiveT *primitive) { return new (std::nothrow) RandomStandardNormal(primitive); case schema::PrimitiveType_CropAndResize: return new (std::nothrow) CropAndResize(primitive); + case schema::PrimitiveType_NonZero: + return new (std::nothrow) NonZero(primitive); #ifdef SUPPORT_TRAIN case schema::PrimitiveType_ActivationGrad: return new (std::nothrow) ActivationGrad(primitive); diff --git a/mindspore/lite/src/ops/tensorlist_setitem.cc b/mindspore/lite/src/ops/tensorlist_setitem.cc index b753237762..82bcd95c16 100644 --- a/mindspore/lite/src/ops/tensorlist_setitem.cc +++ b/mindspore/lite/src/ops/tensorlist_setitem.cc @@ -152,7 +152,9 @@ int TensorListSetItem::InferShape(std::vector inputs_, std::vect } } } - + if (input0->tensors_data_type() == kTypeUnknown) { + input0->set_tensors_data_type(value_tensor->data_type()); + } out_shape[index] = value_tensor->shape(); output0->MallocTensorListData(input0->tensors_data_type(), out_shape); return RET_OK; diff --git a/mindspore/lite/src/ops/tensorlist_stack.cc b/mindspore/lite/src/ops/tensorlist_stack.cc index 1b206bae67..9011db8f32 100644 --- a/mindspore/lite/src/ops/tensorlist_stack.cc +++ b/mindspore/lite/src/ops/tensorlist_stack.cc @@ -172,7 +172,7 @@ int TensorListStack::InferShape(std::vector inputs_, std::vector int TensorListStack::MergeShape(const std::vector &shape) { size_t dim0 = shape.size(); size_t dim1 = output_shape_.size(); - if (dim1 >= unKnownRank_) { + if (dim1 >= unKnownRank_ || output_shape_[0] == -1) { output_shape_ = shape; return RET_OK; } diff --git a/mindspore/lite/src/ops/transpose.cc b/mindspore/lite/src/ops/transpose.cc index 36eaefba4f..8c322eb25a 100644 --- a/mindspore/lite/src/ops/transpose.cc +++ b/mindspore/lite/src/ops/transpose.cc @@ -150,6 +150,13 @@ int Transpose::InferShape(std::vector inputs_, std::vector o for (size_t i = 0; i < perm.size(); ++i) { out_shape.at(i) = in_shape.at(perm.at(i)); } + if (perm.empty()) { + auto shape_size = in_shape.size(); + out_shape.resize(shape_size); + for (size_t i = 0; i < shape_size; ++i) { + out_shape[shape_size - i - 1] = in_shape[i]; + } + } output->set_shape(out_shape); return RET_OK; } diff --git a/mindspore/lite/src/runtime/kernel/arm/base/carry_data.cc b/mindspore/lite/src/runtime/kernel/arm/base/carry_data.cc index 509404c68d..b42e00e2fb 100644 --- a/mindspore/lite/src/runtime/kernel/arm/base/carry_data.cc +++ b/mindspore/lite/src/runtime/kernel/arm/base/carry_data.cc @@ -85,13 +85,28 @@ int CarryDataKernel::MoveTensorData(lite::Tensor *dst_tensor, lite::Tensor *src_ int CarryDataKernel::MoveTensorLiteData(lite::TensorList *dst_tensor, lite::TensorList *src_tensor) { // shape may change, because tensors.size() can be change in RunGraph - if (dst_tensor->data_type() != src_tensor->data_type() || dst_tensor->format() != src_tensor->format() || - !(dst_tensor->element_shape() == src_tensor->element_shape() || - (dst_tensor->element_shape().empty() && src_tensor->element_shape().empty())) || - dst_tensor->tensors_data_type() != src_tensor->tensors_data_type()) { - MS_LOG(ERROR) << "input tensorlist and output tensorlist is incompatible"; + if (dst_tensor->data_type() != src_tensor->data_type() || dst_tensor->format() != src_tensor->format()) { + MS_LOG(ERROR) << "input tensorlist and output tensorlist data_type or format is incompatible"; + return RET_ERROR; + } + if (dst_tensor->element_shape() != src_tensor->element_shape()) { + MS_LOG(ERROR) << "input tensorlist and output tensorlist element shape is incompatible"; return RET_ERROR; } + auto update_data_type = kTypeUnknown; + auto dst_tensor_data_type = dst_tensor->tensors_data_type(); + auto src_tensor_data_type = src_tensor->tensors_data_type(); + if (dst_tensor_data_type != src_tensor_data_type) { + if (src_tensor_data_type != kTypeUnknown && dst_tensor_data_type != kTypeUnknown) { + MS_LOG(ERROR) << "input tensorlist and output tensorlist is incompatible"; + return RET_ERROR; + } + update_data_type = dst_tensor_data_type != kTypeUnknown ? dst_tensor_data_type : src_tensor_data_type; + } + if (update_data_type != kTypeUnknown) { + src_tensor->set_tensors_data_type(update_data_type); + dst_tensor->set_tensors_data_type(update_data_type); + } if (src_tensor->root_tensor() == nullptr) { dst_tensor->CopyTensorList(*src_tensor, false); src_tensor->set_tensors({}); diff --git a/mindspore/lite/src/runtime/kernel/arm/fp32/cast_fp32.cc b/mindspore/lite/src/runtime/kernel/arm/fp32/cast_fp32.cc index fbe5b255f4..e2c35e8b6f 100644 --- a/mindspore/lite/src/runtime/kernel/arm/fp32/cast_fp32.cc +++ b/mindspore/lite/src/runtime/kernel/arm/fp32/cast_fp32.cc @@ -88,6 +88,9 @@ int CastCPUKernel::DoCast(int thread_id) { } else if (input_data_type == kNumberTypeFloat32 && output_data_type == kNumberTypeInt16) { Float32ToInt16(reinterpret_cast(input->data_c()) + offset, reinterpret_cast(output_data) + offset, data_num); + } else if (input_data_type == kNumberTypeBool && output_data_type == kNumberTypeInt32) { + BoolToInt32(reinterpret_cast(input->data_c()) + offset, reinterpret_cast(output_data) + offset, + data_num); } else { MS_LOG(ERROR) << "Unsupported datatype from " << input_data_type << " to " << output_data_type; return RET_ERROR; diff --git a/mindspore/lite/src/runtime/kernel/arm/fp32/nonzero_fp32.cc b/mindspore/lite/src/runtime/kernel/arm/fp32/nonzero_fp32.cc index 6c8ea6d892..7f8204f76e 100644 --- a/mindspore/lite/src/runtime/kernel/arm/fp32/nonzero_fp32.cc +++ b/mindspore/lite/src/runtime/kernel/arm/fp32/nonzero_fp32.cc @@ -39,7 +39,7 @@ int NonZeroCPUKernel::ReSize() { return RET_OK; } int NonZeroCPUKernel::Run() { auto in_tensor = in_tensors_.front(); auto out_tensor = out_tensors_.front(); - auto input_data = reinterpret_cast(in_tensor->MutableData()); + auto input_data = reinterpret_cast(in_tensor->MutableData()); auto output_data = reinterpret_cast(out_tensor->MutableData()); auto input_dim_size = in_tensor->shape().size(); if (out_tensor->shape().size() != 2) { @@ -50,56 +50,22 @@ int NonZeroCPUKernel::Run() { int non_zero_count = 0; std::vector coordiate_values(in_tensor->shape().size(), 0); for (int i = 0; i < in_tensor->ElementsNum(); i += 1) { - if (input_data[i] != 0) { + if (input_data[i]) { for (size_t j = 0; j < input_dim_size; j++) { output_data[non_zero_count + j * non_zero_nums] = coordiate_values[j]; } non_zero_count++; } - for (int idx = input_dim_size - 1; idx >= 0; --idx) { - if (coordiate_values[idx] != in_tensor->shape()[idx] - 1) { - coordiate_values[idx] = coordiate_values[idx] + 1; + for (size_t idx = input_dim_size; idx >= 1; --idx) { + if (coordiate_values[idx - 1] != in_tensor->shape()[idx - 1] - 1) { + coordiate_values[idx - 1] = coordiate_values[idx - 1] + 1; break; } - coordiate_values[idx] = 0; + coordiate_values[idx - 1] = 0; } } return RET_OK; } -kernel::LiteKernel *CpuNonZeroFp32KernelCreator(const std::vector &inputs, - const std::vector &outputs, OpParameter *opParameter, - const lite::InnerContext *ctx, const kernel::KernelKey &desc, - const mindspore::lite::PrimitiveC *primitive) { - if (opParameter == nullptr) { - MS_LOG(ERROR) << "Input opParameter is nullptr!"; - return nullptr; - } - if (ctx == nullptr) { - MS_LOG(ERROR) << "Input context is nullptr!"; - free(opParameter); - return nullptr; - } - if (ctx->thread_num_ == 0) { - MS_LOG(ERROR) << "context thread num is 0!"; - free(opParameter); - return nullptr; - } - auto *kernel = new (std::nothrow) NonZeroCPUKernel(opParameter, inputs, outputs, ctx, primitive); - if (kernel == nullptr) { - MS_LOG(ERROR) << "new NonZeroCPUKernel fail!"; - free(opParameter); - return nullptr; - } - auto ret = kernel->Init(); - if (ret != RET_OK) { - MS_LOG(ERROR) << "Init kernel failed, name: " << opParameter->name_ << ", type: " - << schema::EnumNamePrimitiveType(static_cast(opParameter->type_)); - delete kernel; - return nullptr; - } - return kernel; -} - -REG_KERNEL(kCPU, kNumberTypeFloat32, PrimitiveType_NonZero, CpuNonZeroFp32KernelCreator) +REG_KERNEL(kCPU, kNumberTypeBool, PrimitiveType_NonZero, LiteKernelCreator) } // namespace mindspore::kernel diff --git a/mindspore/lite/src/runtime/kernel/arm/fp32/tensorlist_setitem_fp32.cc b/mindspore/lite/src/runtime/kernel/arm/fp32/tensorlist_setitem_fp32.cc index 53903af875..9bf8cf6de3 100644 --- a/mindspore/lite/src/runtime/kernel/arm/fp32/tensorlist_setitem_fp32.cc +++ b/mindspore/lite/src/runtime/kernel/arm/fp32/tensorlist_setitem_fp32.cc @@ -30,9 +30,23 @@ namespace mindspore::kernel { int TensorListSetItemCPUKernel::Init() { return RET_OK; } +int TensorListSetItemCPUKernel::IncrementOutputSize(int origin_size) { + output0_ = reinterpret_cast(out_tensors_[0]); + int new_tensors_size = origin_size + 1; + output0_->set_shape({new_tensors_size}); + std::vector> out_shape; + out_shape.resize(new_tensors_size, in_tensors_[2]->shape()); + auto ret = output0_->MallocTensorListData(in_tensors_[2]->data_type(), out_shape); + if (ret != RET_OK) { + MS_LOG(ERROR) << "increment output size malloc tensorlist data error"; + return ret; + } + return RET_OK; +} + int TensorListSetItemCPUKernel::Run() { input0_ = reinterpret_cast(in_tensors_[0]); - if (dtype_ != input0_->tensors_data_type()) { + if (dtype_ != kTypeUnknown && dtype_ != input0_->tensors_data_type()) { MS_LOG(ERROR) << "op dtype:" << dtype_ << " is not equal in_tensors[0] dtype:" << input0_->data_type(); return RET_ERROR; } @@ -47,8 +61,10 @@ int TensorListSetItemCPUKernel::Run() { } index_ = reinterpret_cast(in_tensors_[1]->data_c())[0]; if (index_ < 0 || index_ > dim0) { - MS_LOG(ERROR) << "index tensor:[" << index_ << "] must be in [0, " << dim0 << "]!"; - return RET_ERROR; + if (IncrementOutputSize(output0_->shape()[0]) != RET_OK) { + MS_LOG(ERROR) << "Resizeoutput Error ,index tensor:[" << index_ << "] must be in [0, " << dim0 << "]!"; + return RET_ERROR; + } } input2_ = in_tensors_[2]; MS_ASSERT(input2_ != nullptr); @@ -57,6 +73,13 @@ int TensorListSetItemCPUKernel::Run() { } output0_ = reinterpret_cast(out_tensors_[0]); MS_ASSERT(output0_ != nullptr); + // new loop count + if (output0_->ElementsNum() != static_cast(output0_->tensors().size()) && output0_->tensors().empty()) { + if (IncrementOutputSize(0) != RET_OK) { + MS_LOG(ERROR) << "Resizeoutput Error!"; + return RET_ERROR; + } + } // copy each tensor in tensors_ for (int i = 0; i < output0_->ElementsNum(); ++i) { if (i == index_) { @@ -92,10 +115,6 @@ int TensorListSetItemCPUKernel::Run() { } if (src->data_type() != kTypeUnknown) { - if (src->Size() != dst->Size()) { - MS_LOG(ERROR) << "src->Size():" << src->Size() << " must be equal to dst->Size():" << dst->Size(); - return RET_ERROR; - } auto ret = lite::Tensor::CopyTensorData(*src, dst); if (ret != RET_OK) { MS_LOG(ERROR) << "CopyTensorData[" << i << "] is failed!"; diff --git a/mindspore/lite/src/runtime/kernel/arm/fp32/tensorlist_setitem_fp32.h b/mindspore/lite/src/runtime/kernel/arm/fp32/tensorlist_setitem_fp32.h index ece6a52f1d..c4e89fd77f 100644 --- a/mindspore/lite/src/runtime/kernel/arm/fp32/tensorlist_setitem_fp32.h +++ b/mindspore/lite/src/runtime/kernel/arm/fp32/tensorlist_setitem_fp32.h @@ -36,6 +36,7 @@ class TensorListSetItemCPUKernel : public LiteKernel { int Init() override; int ReSize() override; int Run() override; + int IncrementOutputSize(int origin_size); private: lite::TensorList *input0_ = nullptr; diff --git a/mindspore/lite/src/runtime/kernel/arm/fp32/tensorlist_stack_fp32.cc b/mindspore/lite/src/runtime/kernel/arm/fp32/tensorlist_stack_fp32.cc index 143e2a3801..f141a2409d 100644 --- a/mindspore/lite/src/runtime/kernel/arm/fp32/tensorlist_stack_fp32.cc +++ b/mindspore/lite/src/runtime/kernel/arm/fp32/tensorlist_stack_fp32.cc @@ -31,7 +31,7 @@ using mindspore::schema::PrimitiveType_TensorListStack; namespace mindspore::kernel { int TensorListStackCPUKernel::CheckParam() { - if (input0_->tensors_data_type() != dtype_) { + if (dtype_ != kTypeUnknown && input0_->tensors_data_type() != dtype_) { MS_LOG(ERROR) << "in_tensors_[0].tensors_data_type:[" << input0_->tensors_data_type() << "] must be equal " << "param.data_type:[" << dtype_ << "]"; return RET_ERROR; @@ -113,6 +113,16 @@ int TensorListStackCPUKernel::MergeElementShape() { int TensorListStackCPUKernel::MergeSubShape(const std::vector &shape) { size_t dim0 = shape.size(); size_t dim1 = output_shape_.size(); + // unknown shape use input element shape + if (dim1 != 0 && output_shape_[0] == -1) { + if (dim0 == 0) { + output_shape_.clear(); + output_shape_.emplace_back(1); + } else { + output_shape_ = shape; + } + return RET_OK; + } if (dim1 != dim0) { MS_LOG(ERROR) << "shape.size():" << dim1 << " must be equal output_shape_.size():" << dim0; return RET_ERROR; diff --git a/mindspore/lite/src/runtime/kernel/arm/fp32/unsqueeze_fp32.cc b/mindspore/lite/src/runtime/kernel/arm/fp32/unsqueeze_fp32.cc index 8e2ddce138..a9c4cc34bb 100644 --- a/mindspore/lite/src/runtime/kernel/arm/fp32/unsqueeze_fp32.cc +++ b/mindspore/lite/src/runtime/kernel/arm/fp32/unsqueeze_fp32.cc @@ -37,6 +37,10 @@ int UnsqueezeCPUKernel::Init() { int UnsqueezeCPUKernel::ReSize() { data_size_ = in_tensors_.at(0)->ElementsNum(); thread_sz_count_ = MSMIN(context_->thread_num_, data_size_); + if (thread_sz_count_ == 0) { + thread_sz_stride_ = 0; + return RET_OK; + } thread_sz_stride_ = UP_DIV(data_size_, thread_sz_count_); return RET_OK; } diff --git a/mindspore/lite/test/models_with_several_inputs_or_without_outputs.cfg b/mindspore/lite/test/models_with_several_inputs_or_without_outputs.cfg index feb3d6dfcd..b203554e6c 100644 --- a/mindspore/lite/test/models_with_several_inputs_or_without_outputs.cfg +++ b/mindspore/lite/test/models_with_several_inputs_or_without_outputs.cfg @@ -35,3 +35,4 @@ ml_video_edit_img_segment_adaptise.pb;2 ml_video_edit_img_segment_adaptise_pb2tflite.tflite;2 ml_video_edit_video_segment_gauss_adaptis_part2.pb;2 ml_video_edit_video_segment_gauss_adaptis_part2_pb2tflite.tflite;2 +tiny-yolov3-11.onnx;2;1,416,416,3:1,2 diff --git a/mindspore/lite/test/run_benchmark_nets.sh b/mindspore/lite/test/run_benchmark_nets.sh index 1bcc2a8be2..4e049c59ea 100755 --- a/mindspore/lite/test/run_benchmark_nets.sh +++ b/mindspore/lite/test/run_benchmark_nets.sh @@ -579,10 +579,9 @@ function Run_x86() { if [[ $line == \#* ]]; then continue fi - model_name=${line%%;*} - model_name_len=${#model_name} - input_params=${line:model_name_len+1} - input_num=${input_params%%;*} + model_name=`echo ${line} | awk -F ';' '{print $1}'` + input_num=`echo ${line} | awk -F ';' '{print $2}'` + input_shapes=`echo ${line} | awk -F ';' '{print $3}'` input_files='' output_file='' data_path="/home/workspace/mindspore_dataset/mslite/models/hiai/input_output/" @@ -603,8 +602,8 @@ function Run_x86() { echo ${model_name} >> "${run_x86_log_file}" echo 'cd '${x86_path}'/mindspore-lite-'${version}'-inference-linux-x64' >> "{run_x86_log_file}" cd ${x86_path}/mindspore-lite-${version}-inference-linux-x64 || return 1 - echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib:./third_party/libjpeg-turbo/lib:./third_party/opencv/lib;./benchmark/benchmark --modelFile='${ms_models_path}'/'${model_name}'.ms --inDataFile='${input_files}' --benchmarkDataFile='${output_file}' --loopCount=1 --warmUpLoopCount=0' >> "${run_x86_log_file}" - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib:./third_party/libjpeg-turbo/lib:./third_party/opencv/lib;./benchmark/benchmark --modelFile=${ms_models_path}/${model_name}.ms --inDataFile=${input_files} --benchmarkDataFile=${output_file} --loopCount=1 --warmUpLoopCount=0 >> "${run_x86_log_file}" + echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib:./third_party/libjpeg-turbo/lib:./third_party/opencv/lib;./benchmark/benchmark --modelFile='${ms_models_path}'/'${model_name}'.ms --inDataFile='${input_files}' --inputShapes='${input_shapes}' --benchmarkDataFile='${output_file}' --loopCount=1 --warmUpLoopCount=0' >> "${run_x86_log_file}" + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib:./third_party/libjpeg-turbo/lib:./third_party/opencv/lib;./benchmark/benchmark --modelFile=${ms_models_path}/${model_name}.ms --inDataFile=${input_files} --inputShapes=${input_shapes} --benchmarkDataFile=${output_file} --loopCount=1 --warmUpLoopCount=0 >> "${run_x86_log_file}" if [ $? = 0 ]; then run_result='x86: '${model_name}' pass'; echo ${run_result} >> ${run_benchmark_result_file} else @@ -846,9 +845,9 @@ function Run_x86_sse() { if [[ $model_name == \#* ]]; then continue fi - model_name_len=${#model_name} - input_params=${line:model_name_len+1} - input_num=${input_params%%;*} + model_name=`echo ${line} | awk -F ';' '{print $1}'` + input_num=`echo ${line} | awk -F ';' '{print $2}'` + input_shapes=`echo ${line} | awk -F ';' '{print $3}'` input_files='' output_file='' data_path="/home/workspace/mindspore_dataset/mslite/models/hiai/input_output/" @@ -869,8 +868,8 @@ function Run_x86_sse() { echo ${model_name} >> "${run_x86_sse_log_file}" echo 'cd '${x86_path}'/mindspore-lite-'${version}'-inference-linux-x64-sse' >> "{run_x86_sse_log_file}" cd ${x86_path}/mindspore-lite-${version}-inference-linux-x64-sse || return 1 - echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib:./third_party/libjpeg-turbo/lib:./third_party/opencv/lib;./benchmark/benchmark --modelFile='${ms_models_path}'/'${model_name}'.ms --inDataFile='${input_files}' --benchmarkDataFile='${output_file}' --loopCount=1 --warmUpLoopCount=0' >> "${run_x86_sse_log_file}" - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib:./third_party/libjpeg-turbo/lib:./third_party/opencv/lib;./benchmark/benchmark --modelFile=${ms_models_path}/${model_name}.ms --inDataFile=${input_files} --benchmarkDataFile=${output_file} --loopCount=1 --warmUpLoopCount=0 >> "${run_x86_sse_log_file}" + echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib:./third_party/libjpeg-turbo/lib:./third_party/opencv/lib;./benchmark/benchmark --modelFile='${ms_models_path}'/'${model_name}'.ms --inDataFile='${input_files}' --inputShapes='${input_shapes}' --benchmarkDataFile='${output_file}' --loopCount=1 --warmUpLoopCount=0' >> "${run_x86_sse_log_file}" + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib:./third_party/libjpeg-turbo/lib:./third_party/opencv/lib;./benchmark/benchmark --modelFile=${ms_models_path}/${model_name}.ms --inDataFile=${input_files} --inputShapes=${input_shapes} --benchmarkDataFile=${output_file} --loopCount=1 --warmUpLoopCount=0 >> "${run_x86_sse_log_file}" if [ $? = 0 ]; then run_result='x86_sse: '${model_name}' pass'; echo ${run_result} >> ${run_benchmark_result_file} else @@ -1112,9 +1111,9 @@ function Run_x86_avx() { if [[ $model_name == \#* ]]; then continue fi - model_name_len=${#model_name} - input_params=${line:model_name_len+1} - input_num=${input_params%%;*} + model_name=`echo ${line} | awk -F ';' '{print $1}'` + input_num=`echo ${line} | awk -F ';' '{print $2}'` + input_shapes=`echo ${line} | awk -F ';' '{print $3}'` input_files='' output_file='' data_path="/home/workspace/mindspore_dataset/mslite/models/hiai/input_output/" @@ -1135,8 +1134,8 @@ function Run_x86_avx() { echo ${model_name} >> "${run_x86_avx_log_file}" echo 'cd '${x86_path}'/mindspore-lite-'${version}'-inference-linux-x64-avx' >> "{run_x86_avx_log_file}" cd ${x86_path}/mindspore-lite-${version}-inference-linux-x64-avx || return 1 - echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib:./third_party/libjpeg-turbo/lib:./third_party/opencv/lib;./benchmark/benchmark --modelFile='${ms_models_path}'/'${model_name}'.ms --inDataFile='${input_files}' --benchmarkDataFile='${output_file}' --loopCount=1 --warmUpLoopCount=0' >> "${run_x86_avx_log_file}" - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib:./third_party/libjpeg-turbo/lib:./third_party/opencv/lib;./benchmark/benchmark --modelFile=${ms_models_path}/${model_name}.ms --inDataFile=${input_files} --benchmarkDataFile=${output_file} --loopCount=1 --warmUpLoopCount=0 >> "${run_x86_avx_log_file}" + echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib:./third_party/libjpeg-turbo/lib:./third_party/opencv/lib;./benchmark/benchmark --modelFile='${ms_models_path}'/'${model_name}'.ms --inDataFile='${input_files}' --inputShapes='${input_shapes}' --benchmarkDataFile='${output_file}' --loopCount=1 --warmUpLoopCount=0' >> "${run_x86_avx_log_file}" + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib:./third_party/libjpeg-turbo/lib:./third_party/opencv/lib;./benchmark/benchmark --modelFile=${ms_models_path}/${model_name}.ms --inDataFile=${input_files} --inputShapes=${input_shapes} --benchmarkDataFile=${output_file} --loopCount=1 --warmUpLoopCount=0 >> "${run_x86_avx_log_file}" if [ $? = 0 ]; then run_result='x86_avx: '${model_name}' pass'; echo ${run_result} >> ${run_benchmark_result_file} else @@ -1666,9 +1665,9 @@ function Run_arm64() { if [[ $model_name == \#* ]]; then continue fi - model_name_len=${#model_name} - input_params=${line:model_name_len+1} - input_num=${input_params%%;*} + model_name=`echo ${line} | awk -F ';' '{print $1}'` + input_num=`echo ${line} | awk -F ';' '{print $2}'` + input_shapes=`echo ${line} | awk -F ';' '{print $3}'` input_files='' output_file='' data_path="/data/local/tmp/input_output/" @@ -1689,8 +1688,8 @@ function Run_arm64() { fi echo ${model_name} >> "${run_arm64_log_file}" echo 'cd /data/local/tmp/benchmark_test' > adb_run_cmd.txt - echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp/benchmark_test;./benchmark --modelFile='${model_name}'.ms --inDataFile='${input_files}' --benchmarkDataFile='${output_file} >> "${run_arm64_log_file}" - echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp/benchmark_test;./benchmark --modelFile='${model_name}'.ms --inDataFile='${input_files}' --benchmarkDataFile='${output_file} >> adb_run_cmd.txt + echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp/benchmark_test;./benchmark --modelFile='${model_name}'.ms --inDataFile='${input_files}' --inputShapes='${input_shapes}' --benchmarkDataFile='${output_file} >> "${run_arm64_log_file}" + echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp/benchmark_test;./benchmark --modelFile='${model_name}'.ms --inDataFile='${input_files}' --inputShapes='${input_shapes}' --benchmarkDataFile='${output_file} >> adb_run_cmd.txt adb -s ${device_id} shell < adb_run_cmd.txt >> "${run_arm64_log_file}" if [ $? = 0 ]; then run_result='arm64: '${model_name}' pass'; echo ${run_result} >> ${run_benchmark_result_file} diff --git a/mindspore/lite/tools/converter/anf_transform.cc b/mindspore/lite/tools/converter/anf_transform.cc index 7e4fe5d11e..0760129d94 100644 --- a/mindspore/lite/tools/converter/anf_transform.cc +++ b/mindspore/lite/tools/converter/anf_transform.cc @@ -119,7 +119,6 @@ FuncGraphPtr AnfTransform::TransformSingleFuncGraph(const FuncGraphPtr &old_grap // for now - training is not supporting fuse operations if (!config->trainModel) { // remove quantdtype when awaretraining - fusion_pm->AddPass(std::make_shared()); fusion_pm->AddPass(std::make_shared()); auto conv_bn_pass = std::make_shared(); conv_bn_pass->SetFmkType(config->fmk); @@ -171,6 +170,7 @@ FuncGraphPtr AnfTransform::TransformSingleFuncGraph(const FuncGraphPtr &old_grap fusion_pm->AddPass(remove_unused_transpose_pass); } auto const_fold_pm = std::make_shared("const fold fusion pass manager", false); + const_fold_pm->AddPass(std::make_shared()); if (!config->trainModel) { auto inne_context_ptr = std::make_shared(); inne_context_ptr->Init(); diff --git a/mindspore/lite/tools/converter/legacy_optimizer/graph/infershape_pass.cc b/mindspore/lite/tools/converter/legacy_optimizer/graph/infershape_pass.cc index d1c2009a5b..36a28edc0e 100644 --- a/mindspore/lite/tools/converter/legacy_optimizer/graph/infershape_pass.cc +++ b/mindspore/lite/tools/converter/legacy_optimizer/graph/infershape_pass.cc @@ -143,6 +143,13 @@ STATUS InferShapePass::Run(MetaGraphT *graph) { } } } + for (auto g_input_idx : graph->inputIndex) { + auto g_input_shape = graph->allTensors.at(g_input_idx)->dims; + if (std::find(g_input_shape.begin(), g_input_shape.end(), -1) != g_input_shape.end()) { + MS_LOG(INFO) << "InferShape shouldn't be done before runtime"; + return RET_OK; + } + } for (auto iter = graph->nodes.begin(); iter != graph->nodes.end(); iter++) { auto &node = *iter; auto input_tensors = ConvertTensorToLiteTensor(graph, node->inputIndex, node->primitive->value.type); diff --git a/mindspore/lite/tools/converter/legacy_optimizer/graph/subgraph_node_pass.cc b/mindspore/lite/tools/converter/legacy_optimizer/graph/subgraph_node_pass.cc index 7e739a5ff0..aed7f1ff7a 100644 --- a/mindspore/lite/tools/converter/legacy_optimizer/graph/subgraph_node_pass.cc +++ b/mindspore/lite/tools/converter/legacy_optimizer/graph/subgraph_node_pass.cc @@ -131,9 +131,11 @@ STATUS SubgraphNodePass::Run(schema::MetaGraphT *graph) { contain_node_output_subgraphs.push_back(subgraph.get()); } } - std::set_intersection(contain_node_input_subgraphs.begin(), contain_node_input_subgraphs.end(), - contain_node_output_subgraphs.begin(), contain_node_output_subgraphs.end(), - inserter(contain_subgraphs, contain_subgraphs.begin())); + for (auto subgraph : contain_node_input_subgraphs) { + if (IsContain(contain_node_output_subgraphs, subgraph)) { + contain_subgraphs.emplace_back(subgraph); + } + } if (contain_subgraphs.size() == 1) { IncreaseSubgraphNodeIndices(i, graph); contain_subgraphs[0]->nodeIndices.push_back(i); diff --git a/mindspore/lite/tools/converter/legacy_optimizer/graph/switch_pass.cc b/mindspore/lite/tools/converter/legacy_optimizer/graph/switch_pass.cc index 0b526b6f28..9e9991629d 100644 --- a/mindspore/lite/tools/converter/legacy_optimizer/graph/switch_pass.cc +++ b/mindspore/lite/tools/converter/legacy_optimizer/graph/switch_pass.cc @@ -165,56 +165,25 @@ STATUS SingleSwitchPass::BodyGraphVariableInput(std::vector *variable_in return RET_OK; } -STATUS SingleSwitchPass::InsertMerge() { - // update body graph output - auto &body_fg = graph_->subGraph.at(second_subgraph_index_); - body_fg->outputIndices.assign(body_to_cond_partial_node_->inputIndex.begin(), - body_to_cond_partial_node_->inputIndex.end()); - - // remove body_to_cond_partial_node_ from second_graph_nodes_ - for (auto it = second_graph_nodes_.begin(); it != second_graph_nodes_.end();) { - if (*it == body_to_cond_partial_node_) { - it = second_graph_nodes_.erase(it); - } else { - it++; - } - } - - // isolate body_to_cond_partial_node_ - IsolateUselessNode(body_to_cond_partial_node_, graph_); - - std::vector variable_input{}; - int ret = BodyGraphVariableInput(&variable_input); - if (ret != RET_OK) { - MS_LOG(ERROR) << "get body graph variable input failed, ret: " << ret; - return ret; - } - - std::vector const_input{}; - for (size_t i = 0; i < second_partial_node_->inputIndex.size(); i++) { - if (IsContain(variable_input, i)) { - continue; - } - const_input.push_back(i); - } - +std::unique_ptr SingleSwitchPass::MakeMergeNode(const std::string &name, + const std::vector &const_input) { auto merge_node = std::make_unique(); if (merge_node == nullptr) { MS_LOG(ERROR) << "new CNodeT failed"; - return RET_NULL_PTR; + return nullptr; } merge_node->primitive = std::make_unique(); if (merge_node->primitive == nullptr) { MS_LOG(ERROR) << "new PrimitiveT failed"; - return RET_NULL_PTR; + return nullptr; } - merge_node->name = switch_node_->name + "-merge"; + merge_node->name = name; merge_node->primitive->value.type = schema::PrimitiveType_Merge; merge_node->primitive->value.value = new (std::nothrow) MergeT(); if (merge_node->primitive->value.value == nullptr) { MS_LOG(ERROR) << "new MergeT failed"; - return RET_NULL_PTR; + return nullptr; } // merge node output is same as switch @@ -251,7 +220,46 @@ STATUS SingleSwitchPass::InsertMerge() { merge_node->inputIndex.push_back(graph_->allTensors.size() - 1); } } + return merge_node; +} + +STATUS SingleSwitchPass::InsertMerge() { + // update body graph output + auto &body_fg = graph_->subGraph.at(second_subgraph_index_); + body_fg->outputIndices.assign(body_to_cond_partial_node_->inputIndex.begin(), + body_to_cond_partial_node_->inputIndex.end()); + + // remove body_to_cond_partial_node_ from second_graph_nodes_ + for (auto it = second_graph_nodes_.begin(); it != second_graph_nodes_.end();) { + if (*it == body_to_cond_partial_node_) { + it = second_graph_nodes_.erase(it); + } else { + it++; + } + } + + // isolate body_to_cond_partial_node_ + IsolateUselessNode(body_to_cond_partial_node_, graph_); + + std::vector variable_input{}; + int ret = BodyGraphVariableInput(&variable_input); + if (ret != RET_OK) { + MS_LOG(ERROR) << "get body graph variable input failed, ret: " << ret; + return ret; + } + std::vector const_input{}; + for (size_t i = 0; i < second_partial_node_->inputIndex.size(); i++) { + if (IsContain(variable_input, i)) { + continue; + } + const_input.push_back(i); + } + auto merge_node = MakeMergeNode(switch_node_->name + "-merge", const_input); + if (merge_node == nullptr) { + MS_LOG(ERROR) << "make merge node failed"; + return ret; + } // insert merge node before the cond graph std::map cond_input_update_map{}; for (size_t i = 0; i < first_partial_node_->inputIndex.size(); i++) { @@ -591,6 +599,11 @@ STATUS SingleSwitchPass::UpdateSubgraphOutput(const size_t &subgraph_index, sche output = subgraph_output_map.at(output); } } + for (auto &input : subgraph_node->inputIndex) { + if (subgraph_output_map.find(input) != subgraph_output_map.end()) { + input = subgraph_output_map.at(input); + } + } } std::vector new_subgraph_outputs{}; diff --git a/mindspore/lite/tools/converter/legacy_optimizer/graph/switch_pass.h b/mindspore/lite/tools/converter/legacy_optimizer/graph/switch_pass.h index be470aaef9..3dd5c8acfa 100644 --- a/mindspore/lite/tools/converter/legacy_optimizer/graph/switch_pass.h +++ b/mindspore/lite/tools/converter/legacy_optimizer/graph/switch_pass.h @@ -50,6 +50,7 @@ class SingleSwitchPass { STATUS ConcatBodySubgraphInputAndOutput(); bool IsLoop(); STATUS InsertMerge(); + std::unique_ptr MakeMergeNode(const std::string &name, const std::vector &const_in); // function for if STATUS InsertPartialAndMergeAfterSwitch(); diff --git a/mindspore/lite/tools/converter/parser/onnx/onnx_model_parser.cc b/mindspore/lite/tools/converter/parser/onnx/onnx_model_parser.cc index dcd830a086..a5353c5ed1 100644 --- a/mindspore/lite/tools/converter/parser/onnx/onnx_model_parser.cc +++ b/mindspore/lite/tools/converter/parser/onnx/onnx_model_parser.cc @@ -57,8 +57,10 @@ FuncGraphPtr OnnxModelParser::Parse(const std::string &model_file, const std::st static auto root_func_manager = Manage(anf_root_graph_); for (auto &subgraph : all_subgraphs_) { subgraph->set_manager(root_func_manager); + subgraph->set_attr("fmk", MakeValue(static_cast(converter::FmkType_ONNX))); } anf_root_graph_->set_attr("graph_name", MakeValue("main_graph")); + anf_root_graph_->set_attr("fmk", MakeValue(static_cast(converter::FmkType_ONNX))); return anf_root_graph_; } @@ -165,6 +167,7 @@ STATUS OnnxModelParser::ConvertGraphInputs(const onnx::GraphProto &onnx_graph, c auto onnx_shape = input_value.type().tensor_type().shape().dim(); std::transform(onnx_shape.begin(), onnx_shape.end(), std::back_inserter(shape_vector), [](const onnx::TensorShapeProto_Dimension &val) { return static_cast(val.dim_value()); }); + std::replace(shape_vector.begin(), shape_vector.end(), 0, -1); auto abstract_tensor = std::make_shared(type_ptr, shape_vector); parameter->set_abstract(abstract_tensor); parameter->set_name(input_value.name()); @@ -746,6 +749,41 @@ STATUS AddIterNumsUpdateEdge(const FuncGraphPtr &anf_graph, std::vectorfunc_graph(); + auto stack_elem_node = CreateConstParamter(root_anf_graph, -1); + stack_elem_node->set_name(loop_node_name + "_element_shape"); + for (int j = 0; j < act_outputs_num; j++) { + auto output_size = onnx_node.output_size(); + auto &loop_output_name = onnx_node.output(output_size - act_outputs_num + j); + auto &while_output_node = control_nodes_map_[loop_node_name]->at(loop_output_name); + auto stack_attr = std::make_unique(); + if (stack_attr == nullptr) { + MS_LOG(ERROR) << "new op failed"; + return RET_ERROR; + } + stack_attr->numElements = -1; + auto stack_value_node = CreateValueNode(stack_attr.release(), schema::PrimitiveType_TensorListStack); + std::vector stack_inputs = {stack_value_node, while_output_node, stack_elem_node}; + auto tensorlist_stack_cnode = root_anf_graph->NewCNode(stack_inputs); + if (tensorlist_stack_cnode == nullptr) { + MS_LOG(ERROR) << "new cnode error"; + return RET_ERROR; + } + tensorlist_stack_cnode->set_fullname_with_scope(loop_node_name + "_tensorlist_stack_node_" + std::to_string(j)); + tensorlist_stack_cnode->set_abstract(stack_elem_node->abstract()); + + // update getitem value output index + auto new_get_item_value = NewValueNode(MakeValue(body_output_size - act_outputs_num + j)); + while_output_node->cast()->set_input(2, new_get_item_value); + // insert tensorliststack after while_output + (*control_nodes_map_[loop_node_name])[loop_output_name] = tensorlist_stack_cnode; + } + return RET_OK; +} + // onnx loop scan_output need through tensorlist op,while node need add new inputs STATUS OnnxModelParser::AddTensorArrayEdge(const FuncGraphPtr &anf_graph, std::vector *return_new_inputs, const std::string &loop_node_name, @@ -874,34 +912,10 @@ STATUS OnnxModelParser::ConvertLoopOnnxNode(const onnx::NodeProto &onnx_node, return status; } // insert tensorliststack after while output - - auto root_anf_graph = root_while_node->func_graph(); - auto stack_elem_node = CreateConstParamter(root_anf_graph, -1); - stack_elem_node->set_name(loop_node_name + "_element_shape"); - for (int j = 0; j < act_outputs_num; j++) { - auto output_size = onnx_node.output_size(); - auto &loop_output_name = onnx_node.output(output_size - act_outputs_num + j); - auto &while_output_node = control_nodes_map_[loop_node_name]->at(loop_output_name); - auto stack_attr = std::make_unique(); - if (stack_attr == nullptr) { - MS_LOG(ERROR) << "new op failed"; - return RET_ERROR; - } - auto stack_value_node = CreateValueNode(stack_attr.release(), schema::PrimitiveType_TensorListStack); - std::vector stack_inputs = {stack_value_node, while_output_node, stack_elem_node}; - auto tensorlist_stack_cnode = root_anf_graph->NewCNode(stack_inputs); - if (tensorlist_stack_cnode == nullptr) { - MS_LOG(ERROR) << "new cnode error"; - return RET_ERROR; - } - tensorlist_stack_cnode->set_fullname_with_scope(loop_node_name + "_tensorlist_stack_node_" + std::to_string(j)); - tensorlist_stack_cnode->set_abstract(stack_elem_node->abstract()); - - // update getitem value output index - auto new_get_item_value = NewValueNode(MakeValue(body_graph_inputs.size() - act_outputs_num + i)); - while_output_node->cast()->set_input(2, new_get_item_value); - // insert tensorliststack after while_output - (*control_nodes_map_[loop_node_name])[loop_output_name] = tensorlist_stack_cnode; + status = AddTensorListStackNode(root_while_node, onnx_node, act_outputs_num, body_graph_inputs.size()); + if (status != RET_OK) { + MS_LOG(ERROR) << "add tensorliststack node failed"; + return status; } } return_tuple_cnode->set_inputs(return_new_inputs); diff --git a/mindspore/lite/tools/converter/parser/onnx/onnx_model_parser.h b/mindspore/lite/tools/converter/parser/onnx/onnx_model_parser.h index f11f72279a..b9b2da6c01 100644 --- a/mindspore/lite/tools/converter/parser/onnx/onnx_model_parser.h +++ b/mindspore/lite/tools/converter/parser/onnx/onnx_model_parser.h @@ -96,6 +96,8 @@ class OnnxModelParser : public ModelParser { STATUS AddTensorArrayEdge(const FuncGraphPtr &anf_graph, std::vector *return_new_inputs, const std::string &loop_node_name, std::vector *body_graph_inputs, int act_output_num); + STATUS AddTensorListStackNode(const AnfNodePtr &root_while_node, const onnx::NodeProto &onnx_node, int act_output_num, + int body_output_size); STATUS BuildCondGraph(const FuncGraphPtr &cond_graph, const AnfNodePtr &root_while_node, int inputs_num, const std::string &cond_graph_name); STATUS ConvertIfSubgraph(const onnx::GraphProto &onnx_graph, const FuncGraphPtr &anf_graph, diff --git a/mindspore/lite/tools/optimizer/graph/onnx_inputs_adjust_pass.cc b/mindspore/lite/tools/optimizer/graph/onnx_inputs_adjust_pass.cc index 4e237f3296..e0ca9b82ba 100644 --- a/mindspore/lite/tools/optimizer/graph/onnx_inputs_adjust_pass.cc +++ b/mindspore/lite/tools/optimizer/graph/onnx_inputs_adjust_pass.cc @@ -14,11 +14,11 @@ * limitations under the License. */ #include "tools/optimizer/graph/onnx_inputs_adjust_pass.h" -#include -#include +#include #include #include -#include +#include +#include #include "mindspore/lite/include/errorcode.h" #include "src/ops/primitive_c.h" @@ -266,11 +266,11 @@ STATUS OnnxInputAdjustOpPass::AdjustStridedSlice(const FuncGraphPtr &func_graph, auto inputs = cnode->inputs(); switch (cnode->inputs().size()) { case 4: { - std::vector axises; + std::vector axes; for (int i = 0; i < size; ++i) { - axises.push_back(i); + axes.push_back(i); } - auto new_param_node = BuildParameterNode(func_graph, axises, cnode->fullname_with_scope() + "_axises"); + auto new_param_node = BuildParameterNode(func_graph, axes, cnode->fullname_with_scope() + "_axes"); if (new_param_node == nullptr) { MS_LOG(ERROR) << "new a parameter node failed."; } @@ -327,9 +327,9 @@ STATUS OnnxInputAdjustOpPass::AdjustResize(const CNodePtr &cnode) { } auto attr = reinterpret_cast(value); if (cnode->inputs().size() > 3 && - attr->coordinateTransformMode == schema::CoordinateTransformMode_TF_CROP_AND_RESIZE) { + attr->coordinateTransformMode != schema::CoordinateTransformMode_TF_CROP_AND_RESIZE) { auto new_resize_inputs = cnode->inputs(); - new_resize_inputs.erase(new_resize_inputs.begin() + 1); + new_resize_inputs.erase(new_resize_inputs.begin() + 2); cnode->set_inputs(new_resize_inputs); } if (cnode->inputs().size() > 3 && attr->coordinateTransformMode == schema::CoordinateTransformMode_HALF_PIXEL) { @@ -597,6 +597,8 @@ bool OnnxInputAdjustOpPass::Run(const FuncGraphPtr &func_graph) { status = ReplaceTransposeWithGraphInput(func_graph, cnode); } else if (type == schema::PrimitiveType_Resize) { status = AdjustResize(cnode); + } else { + continue; } if (status != lite::RET_OK && status != lite::RET_NO_CHANGE) { MS_LOG(ERROR) << "adjust input pass is failed.";