/** * Copyright 2019 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "common/common_test.h" #include "frontend/parallel/step_parallel.h" #include "frontend/parallel/step_auto_parallel.h" #include "frontend/parallel/auto_parallel/edge_costmodel.h" #include "frontend/parallel/ops_info/operator_info.h" #include "frontend/operator/ops.h" #include "pipeline/jit/static_analysis/static_analysis.h" namespace mindspore { namespace parallel { class TestStepAutoParallel : public UT::Common { public: TestStepAutoParallel() {} void SetUp(); void TearDown() {} }; void TestStepAutoParallel::SetUp() { RankList dev_list; for (int32_t i = 0; i < 20; i++) { dev_list.push_back(i); } RankList stage_map; stage_map.push_back(16); stage_map.push_back(4); int32_t local_dev = 0; // create a new g_device_manager g_device_manager = std::make_shared(); g_device_manager->Init(dev_list, local_dev, stage_map, "hccl"); } CNodePtr Create_Node(Shape x, Shape y, Shape out) { FuncGraphPtr func_graph = std::make_shared(); ParameterPtr param1 = func_graph->add_parameter(); ParameterPtr param2 = func_graph->add_parameter(); param1->set_name("x"); param2->set_name("y"); BaseShapePtr shape1 = std::make_shared(x); BaseShapePtr shape2 = std::make_shared(y); BaseShapePtr shape3 = std::make_shared(out); AbstractBasePtr abstract1 = abstract::FromValue(static_cast(1), false); AbstractBasePtr abstract2 = abstract::FromValue(static_cast(1), false); AbstractBasePtr abstract3 = abstract::FromValue(static_cast(1), false); abstract1->set_shape(shape1); abstract2->set_shape(shape2); abstract3->set_shape(shape3); param1->set_abstract(abstract1); param2->set_abstract(abstract2); std::vector inputs; inputs.push_back(NewValueNode(prim::kPrimMatMul)); inputs.push_back(param1); inputs.push_back(param2); CNodePtr node = func_graph->NewCNode(inputs); PrimitivePtr prim = node->input(0)->cast()->value()->cast(); ValuePtr transpose_a = MakeValue(false); ValuePtr transpose_b = MakeValue(false); prim->set_attr("transpose_a", transpose_a); prim->set_attr("transpose_b", transpose_b); node->set_abstract(abstract3); return node; } CNodePtr Create_two_nodes(Shape x, Shape y, Shape z, Shape w, Shape out) { FuncGraphPtr func_graph = std::make_shared(); ParameterPtr paramX = func_graph->add_parameter(); ParameterPtr paramY = func_graph->add_parameter(); ParameterPtr paramW = func_graph->add_parameter(); paramX->set_name("x"); paramY->set_name("y"); paramW->set_name("w"); BaseShapePtr shapeX = std::make_shared(x); BaseShapePtr shapeY = std::make_shared(y); BaseShapePtr shapeZ = std::make_shared(z); BaseShapePtr shapeW = std::make_shared(w); BaseShapePtr shapeOut = std::make_shared(out); AbstractBasePtr abstractX = abstract::FromValue(static_cast(1), false); AbstractBasePtr abstractY = abstract::FromValue(static_cast(1), false); AbstractBasePtr abstractZ = abstract::FromValue(static_cast(1), false); AbstractBasePtr abstractW = abstract::FromValue(static_cast(1), false); AbstractBasePtr abstractOut = abstract::FromValue(static_cast(1), false); abstractX->set_shape(shapeX); abstractY->set_shape(shapeY); abstractZ->set_shape(shapeZ); abstractW->set_shape(shapeW); abstractOut->set_shape(shapeOut); paramX->set_abstract(abstractX); paramY->set_abstract(abstractY); paramW->set_abstract(abstractW); std::vector MatMul_1_inputs; MatMul_1_inputs.push_back(NewValueNode(prim::kPrimMatMul)); MatMul_1_inputs.push_back(paramX); MatMul_1_inputs.push_back(paramY); CNodePtr MatMul_1_node = func_graph->NewCNode(MatMul_1_inputs); PrimitivePtr prim = MatMul_1_node->input(0)->cast()->value()->cast(); ValuePtr transpose_a = MakeValue(false); ValuePtr transpose_b = MakeValue(false); prim->set_attr("transpose_a", transpose_a); prim->set_attr("transpose_b", transpose_b); MatMul_1_node->set_abstract(abstractZ); std::vector MatMul_2_inputs; MatMul_2_inputs.push_back(NewValueNode(prim::kPrimMatMul)); MatMul_2_inputs.push_back(MatMul_1_node); MatMul_2_inputs.push_back(paramW); CNodePtr MatMul_2_node = func_graph->NewCNode(MatMul_2_inputs); PrimitivePtr prim2 = MatMul_2_node->input(0)->cast()->value()->cast(); ValuePtr transpose_a_2 = MakeValue(false); ValuePtr transpose_b_2 = MakeValue(false); prim2->set_attr("transpose_a", transpose_a); prim2->set_attr("transpose_b", transpose_b); MatMul_2_node->set_abstract(abstractOut); return MatMul_2_node; } TEST_F(TestStepAutoParallel, test_create_op_instance) { Shape inputs_x_dims = {64, 32}; Shape inputs_y_dims = {32, 64}; Shape outputs_dims = {64, 64}; CNodePtr node = Create_Node(inputs_x_dims, inputs_y_dims, outputs_dims); bool result = node->input(0)->cast()->value()->isa(); ASSERT_EQ(result, true); // creat prim and attrs PrimitivePtr prim = node->input(0)->cast()->value()->cast(); auto attrs = prim->attrs(); // creat shape Shapes inputs_shape = std::vector{inputs_x_dims, inputs_y_dims}; Shapes outputs_shape = std::vector{outputs_dims}; std::vector shape = {inputs_shape, outputs_shape}; StrategyPtr strategyPtr; std::shared_ptr matmul_info = NewOperatorInstance(prim, attrs, shape); node->set_user_data(matmul_info); std::string name_expect = "MatMulInfo00"; std::string name_test = matmul_info->name(); ASSERT_EQ(name_expect, name_test); } TEST_F(TestStepAutoParallel, test_create_edge) { Shape inputs_x_dims = {64, 32}; Shape inputs_y_dims = {32, 64}; Shape outputs_z_dims = {64, 64}; Shape inputs_w_dims = {64, 128}; Shape outputs_dim = {64, 128}; CNodePtr node = Create_two_nodes(inputs_x_dims, inputs_y_dims, outputs_z_dims, inputs_w_dims, outputs_dim); // u-->v PrimitivePtr v_prim = node->input(0)->cast()->value()->cast(); auto v_attrs = v_prim->attrs(); PrimitivePtr u_prim = node->input(1)->cast()->input(0)->cast()->value()->cast(); auto u_attrs = u_prim->attrs(); // creat v node Shapes v_inputs_shape = std::vector{outputs_z_dims, inputs_w_dims}; Shapes v_outputs_shape = std::vector{outputs_dim}; std::vector v_shape = {v_inputs_shape, v_outputs_shape}; StrategyPtr v_strategyPtr; std::shared_ptr v_matmul_info = NewOperatorInstance(v_prim, v_attrs, v_shape); // create u node Shapes u_inputs_shape = std::vector{inputs_x_dims, inputs_y_dims}; Shapes u_outputs_shape = std::vector{outputs_z_dims}; std::vector u_shape = {u_inputs_shape, u_outputs_shape}; StrategyPtr u_strategyPtr; std::shared_ptr u_matmul_info = NewOperatorInstance(u_prim, u_attrs, u_shape); std::string edge_name = u_prim->name() + "-" + v_prim->name(); std::shared_ptr edge_ptr = std::make_shared(edge_name, u_matmul_info, v_matmul_info, 0, 0, false); std::string expected_name = "MatMul-MatMul"; ASSERT_EQ(edge_ptr->edge_name(), expected_name); } } // namespace parallel } // namespace mindspore