From eed1881f2d92c76e0890bcf83e2a60306a822b84 Mon Sep 17 00:00:00 2001 From: hongxing Date: Sun, 28 Jun 2020 10:10:26 +0200 Subject: [PATCH] fix GatherV2/GatherV2P --- .../rec_core/rec_generate_strategy.cc | 31 +++++++++++++++++-- .../rec_core/rec_generate_strategy.h | 3 +- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/mindspore/ccsrc/parallel/auto_parallel/rec_core/rec_generate_strategy.cc b/mindspore/ccsrc/parallel/auto_parallel/rec_core/rec_generate_strategy.cc index b8a57ae997..9de71231c0 100644 --- a/mindspore/ccsrc/parallel/auto_parallel/rec_core/rec_generate_strategy.cc +++ b/mindspore/ccsrc/parallel/auto_parallel/rec_core/rec_generate_strategy.cc @@ -164,9 +164,34 @@ std::vector> PrepareOneHot(const std::shared_ptr &gr return strategies; } -std::vector> PrepareGatherV2(const std::shared_ptr> &s) { +std::vector> PrepareGatherV2(const std::vector> &ops, + const size_t iter_ops, std::vector s) { std::vector> strategies; - strategies.push_back(*s); + + int32_t axis = 0; + auto axis_input = GetValue(ops[iter_ops]->input_value().at(2)); + if (axis_input < 0) { + axis_input += SizeToInt(ops[iter_ops]->inputs_tensor_info()[0].shape().size()); + } + axis = axis_input; + if (axis >= SizeToInt(s.size())) { + MS_LOG(EXCEPTION) << "Failure: GatherV2' axis out of range."; + } + s[axis] = 1; + strategies.push_back(s); + + auto pos = ops[iter_ops]->name().find("Info"); + auto name = ops[iter_ops]->name().substr(0, pos); + if (name == "GatherV2") { + return strategies; + } + + std::vector s_indices; + for (size_t i = 0; i < ops[iter_ops]->inputs_tensor_info()[1].shape().size(); i++) { + s_indices.push_back(1); + } + strategies.push_back(s_indices); + return strategies; } @@ -607,7 +632,7 @@ std::vector> GenerateStrategiesFromStrategy(const std::vect return PrepareBiasAdd(s_ptr); } if (ops[iter_ops]->type() == GATHERV2) { - return PrepareGatherV2(s_ptr); + return PrepareGatherV2(ops, iter_ops, basic_stra); } if (ops[iter_ops]->type() == L2_NORMALIZE) { return PrepareL2Normalize(ops, iter_ops, basic_stra); diff --git a/mindspore/ccsrc/parallel/auto_parallel/rec_core/rec_generate_strategy.h b/mindspore/ccsrc/parallel/auto_parallel/rec_core/rec_generate_strategy.h index 1e8080f2b7..e82efe6798 100644 --- a/mindspore/ccsrc/parallel/auto_parallel/rec_core/rec_generate_strategy.h +++ b/mindspore/ccsrc/parallel/auto_parallel/rec_core/rec_generate_strategy.h @@ -38,7 +38,8 @@ std::vector> PrepareBiasAdd(const std::shared_ptr> PrepareOneHot(const std::shared_ptr &graph, const std::vector> &ops, const size_t iter_graph, const size_t iter_ops); -std::vector> PrepareGatherV2(const std::shared_ptr> &s); +std::vector> PrepareGatherV2(const std::vector> &ops, + const size_t iter_ops, std::vector s); std::vector> PrepareL2Normalize(const std::vector> &ops, const size_t iter_ops, std::vector s); std::vector> MakeRecSearchStrategy(const std::shared_ptr &graph,