You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

output_net_output_unittest.cc 9.9 kB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. /**
  2. * Copyright 2019-2020 Huawei Technologies Co., Ltd
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #include <gtest/gtest.h>
  17. #include <memory>
  18. #include "securec.h"
  19. #define protected public
  20. #define private public
  21. #include "common/debug/memory_dumper.h"
  22. #include "common/op/ge_op_utils.h"
  23. #include "graph/load/new_model_manager/davinci_model.h"
  24. #include "graph/load/new_model_manager/model_utils.h"
  25. #include "graph/manager/graph_var_manager.h"
  26. #include "new_op_test_utils.h"
  27. #include "proto/om.pb.h"
  28. using namespace std;
  29. namespace ge {
  30. class UtestNetOutput : public testing::Test {
  31. protected:
  32. void TearDown() {}
  33. shared_ptr<OmeTestOpDescBuilder> GenOpdef(OpDescPtr &op_desc, int flag) {
  34. shared_ptr<OmeTestOpDescBuilder> builder = make_shared<OmeTestOpDescBuilder>(op_desc);
  35. builder->SetStreamId(0);
  36. builder->AddInput(1);
  37. builder->SetType("NetOutput");
  38. if (flag == 1) {
  39. auto input_desc_1 = builder->AddInputDesc({1, 1, 10, 10}, FORMAT_NCHW, DT_FLOAT16);
  40. }
  41. auto input_desc_1 = builder->AddInputDesc({1, 1, 10, 10}, FORMAT_NCHW, DT_FLOAT16);
  42. if (flag == 2) {
  43. auto input_desc_2 = builder->AddInputDesc({1, 1, 10, 10}, FORMAT_NCHW, DT_FLOAT16);
  44. }
  45. if (flag == 3) {
  46. builder->AddInput(10);
  47. }
  48. return builder;
  49. }
  50. shared_ptr<OmeTestOpDescBuilder> GenOpdef2(OpDescPtr &op_desc) {
  51. shared_ptr<OmeTestOpDescBuilder> builder = make_shared<OmeTestOpDescBuilder>(op_desc);
  52. builder->SetStreamId(0);
  53. builder->SetType("NetOutput");
  54. builder->AddInput(10);
  55. auto input_desc_1 = builder->AddInputDesc({64, 32, 5, 5}, FORMAT_FRACTAL_Z, DT_FLOAT);
  56. builder->AddInput(1000000);
  57. auto input_desc_2 = builder->AddInputDesc({1, 10, 10, 1}, FORMAT_NHWC, DT_FLOAT);
  58. builder->AddOutput(2000000);
  59. auto output_desc_1 = builder->AddOutputDesc({64, 32, 5, 5}, FORMAT_NCHW, DT_FLOAT);
  60. builder->AddOutput(2100000);
  61. output_desc_1 = builder->AddOutputDesc({1, 10, 10, 1}, FORMAT_NHWC, DT_FLOAT);
  62. return builder;
  63. }
  64. public:
  65. shared_ptr<DavinciModel> dav_model_;
  66. };
  67. TEST_F(UtestNetOutput, test_get_input_size) {
  68. shared_ptr<OpDesc> custom_op_desc = make_shared<OpDesc>();
  69. OmeTestOpDescBuilder builder(custom_op_desc);
  70. builder.SetName("netoutput");
  71. builder.SetStreamId(0);
  72. builder.SetType("NetOutput");
  73. auto input_desc_1 = builder.AddInputDesc({1, 1, 1, 1}, FORMAT_FRACTAL_Z, DT_FLOAT);
  74. builder.AddInput(1);
  75. auto output_desc = builder.AddOutputDesc({1, 1, 1, 1}, FORMAT_NCHW, DT_FLOAT);
  76. builder.AddOutput(1);
  77. builder.Finish();
  78. vector<int64_t> v_output_size = ModelUtils::GetInputSize(custom_op_desc);
  79. EXPECT_EQ(v_output_size.size(), 1);
  80. }
  81. // test ModelUtils::IsOutput
  82. TEST_F(UtestNetOutput, success_is_output) {
  83. ModelUtils *model_utils = new ModelUtils();
  84. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  85. OmeTestOpDescBuilder builder(op_desc);
  86. builder.SetType("NetOutput");
  87. vector<GeTensorDescPtr> outputs_desc;
  88. std::shared_ptr<GeTensorDesc> desc = std::make_shared<GeTensorDesc>();
  89. outputs_desc.push_back(desc);
  90. op_desc->outputs_desc_ = outputs_desc;
  91. bool ret = model_utils->IsOutput(op_desc);
  92. EXPECT_EQ(false, ret);
  93. delete model_utils;
  94. }
  95. // test ModelUtils::IsOutput
  96. TEST_F(UtestNetOutput, true_is_output) {
  97. ModelUtils *model_utils = new ModelUtils();
  98. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  99. OmeTestOpDescBuilder builder(op_desc);
  100. builder.SetType("NetOutput");
  101. vector<GeTensorDescPtr> outputs_desc;
  102. std::shared_ptr<GeTensorDesc> desc = std::make_shared<GeTensorDesc>();
  103. outputs_desc.push_back(desc);
  104. op_desc->outputs_desc_ = outputs_desc;
  105. ge::TensorUtils::SetOutputTensor(*(outputs_desc[0].get()), true);
  106. bool ret = model_utils->IsOutput(op_desc);
  107. EXPECT_EQ(true, ret);
  108. delete model_utils;
  109. }
  110. // test ModelUtils::IsInputTensorNeedTrans
  111. TEST_F(UtestNetOutput, success_is_output_tensor_need_trans) {
  112. ModelUtils *model_utils = new ModelUtils();
  113. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  114. OmeTestOpDescBuilder builder(op_desc);
  115. builder.SetType("NetOutput");
  116. size_t tensor_index = 1;
  117. vector<GeTensorDescPtr> outputs_desc;
  118. std::shared_ptr<GeTensorDesc> desc = std::make_shared<GeTensorDesc>();
  119. outputs_desc.push_back(desc);
  120. op_desc->outputs_desc_ = outputs_desc;
  121. op_desc->inputs_desc_ = outputs_desc;
  122. bool ret = model_utils->IsInputTensorNeedTrans(op_desc, tensor_index);
  123. EXPECT_EQ(false, ret);
  124. delete model_utils;
  125. }
  126. // test ModelUtils::GetOutputSize
  127. TEST_F(UtestNetOutput, success_get_output_size) {
  128. vector<int64_t> v_output_size;
  129. ModelUtils *model_utils = new ModelUtils();
  130. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  131. vector<GeTensorDescPtr> outputs_desc;
  132. std::shared_ptr<GeTensorDesc> desc = std::make_shared<GeTensorDesc>();
  133. outputs_desc.push_back(desc);
  134. op_desc->outputs_desc_ = outputs_desc;
  135. EXPECT_EQ(v_output_size, model_utils->GetOutputSize(op_desc));
  136. vector<int64_t> output = {1};
  137. op_desc->SetOutputOffset(output);
  138. uint32_t tensor_size = 0;
  139. v_output_size.push_back(tensor_size);
  140. EXPECT_EQ(v_output_size, model_utils->GetOutputSize(op_desc));
  141. delete model_utils;
  142. }
  143. // test ModelUtils::GetWorkspaceSize
  144. TEST_F(UtestNetOutput, success_get_workspace_size) {
  145. vector<int64_t> v_workspace_size;
  146. ModelUtils *model_utils = new ModelUtils();
  147. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  148. vector<int64_t> workspace = {1};
  149. op_desc->SetWorkspace(workspace);
  150. EXPECT_EQ(v_workspace_size, model_utils->GetWorkspaceSize(op_desc));
  151. op_desc->SetWorkspaceBytes(workspace);
  152. v_workspace_size.push_back(1);
  153. EXPECT_EQ(v_workspace_size, model_utils->GetWorkspaceSize(op_desc));
  154. delete model_utils;
  155. }
  156. // test ModelUtils::GetWeightSize
  157. TEST_F(UtestNetOutput, success_get_weight_size) {
  158. vector<int64_t> v_weight_size;
  159. ModelUtils *model_utils = new ModelUtils();
  160. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  161. op_desc->SetType("Const");
  162. EXPECT_EQ(v_weight_size, model_utils->GetWeightSize(op_desc));
  163. op_desc->SetType("NetOutput");
  164. vector<GeTensorDescPtr> inputs_desc;
  165. std::shared_ptr<GeTensorDesc> desc = std::make_shared<GeTensorDesc>();
  166. inputs_desc.push_back(desc);
  167. op_desc->inputs_desc_ = inputs_desc;
  168. vector<bool> is_input_const = {true};
  169. op_desc->SetIsInputConst(is_input_const);
  170. v_weight_size.push_back(0);
  171. EXPECT_EQ(v_weight_size, model_utils->GetWeightSize(op_desc));
  172. delete model_utils;
  173. }
  174. // test ModelUtils::GetWeights
  175. TEST_F(UtestNetOutput, success_get_weights) {
  176. vector<ConstGeTensorPtr> v_weights;
  177. ModelUtils *model_utils = new ModelUtils();
  178. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  179. op_desc->SetType("Const");
  180. EXPECT_EQ(v_weights, model_utils->GetWeights(op_desc));
  181. op_desc->SetType("NetOutput");
  182. vector<GeTensorDescPtr> inputs_desc;
  183. std::shared_ptr<GeTensorDesc> desc = std::make_shared<GeTensorDesc>();
  184. inputs_desc.push_back(desc);
  185. op_desc->inputs_desc_ = inputs_desc;
  186. vector<bool> is_input_const = {true};
  187. op_desc->SetIsInputConst(is_input_const);
  188. GeTensorDesc tensor_desc;
  189. EXPECT_EQ(v_weights, model_utils->GetWeights(op_desc));
  190. delete model_utils;
  191. }
  192. // test ModelUtils::GetInputDescs
  193. TEST_F(UtestNetOutput, success_get_input_descs) {
  194. vector<::opTensor_t> v_input_descs;
  195. vector<::tagCcAICPUTensor> ret;
  196. ModelUtils *model_utils = new ModelUtils();
  197. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  198. ret = model_utils->GetInputDescs(op_desc);
  199. EXPECT_EQ(v_input_descs.size(), ret.size());
  200. vector<GeTensorDescPtr> inputs_desc;
  201. std::shared_ptr<GeTensorDesc> desc = std::make_shared<GeTensorDesc>();
  202. inputs_desc.push_back(desc);
  203. op_desc->inputs_desc_ = inputs_desc;
  204. vector<bool> is_input_const = {false};
  205. op_desc->SetIsInputConst(is_input_const);
  206. opTensor_t tmp;
  207. tmp.format = OP_TENSOR_FORMAT_NC1HWC0;
  208. tmp.dim_cnt = 0;
  209. tmp.data_type = OP_DATA_FLOAT;
  210. v_input_descs.push_back(tmp);
  211. ret = model_utils->GetInputDescs(op_desc);
  212. EXPECT_EQ(v_input_descs.size(), ret.size());
  213. delete model_utils;
  214. }
  215. // test ModelUtils::GetOutputDescs
  216. TEST_F(UtestNetOutput, success_get_output_descs) {
  217. vector<::opTensor_t> v_output_descs;
  218. vector<::tagCcAICPUTensor> ret;
  219. ModelUtils *model_utils = new ModelUtils();
  220. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  221. ret = model_utils->GetOutputDescs(op_desc);
  222. EXPECT_EQ(v_output_descs.size(), ret.size());
  223. vector<GeTensorDescPtr> outputs_desc;
  224. std::shared_ptr<GeTensorDesc> desc = std::make_shared<GeTensorDesc>();
  225. outputs_desc.push_back(desc);
  226. op_desc->outputs_desc_ = outputs_desc;
  227. opTensor_t tmp;
  228. tmp.format = OP_TENSOR_FORMAT_NC1HWC0;
  229. tmp.dim_cnt = 0;
  230. tmp.data_type = OP_DATA_FLOAT;
  231. v_output_descs.push_back(tmp);
  232. ret = model_utils->GetOutputDescs(op_desc);
  233. EXPECT_EQ(v_output_descs.size(), ret.size());
  234. delete model_utils;
  235. }
  236. // test Output::GetOutputData
  237. TEST_F(UtestNetOutput, success_get_output_data) {
  238. Output *output = new Output(nullptr, nullptr);
  239. output->v_input_data_addr_.push_back((void *)1);
  240. output->v_input_size_.push_back(1);
  241. output->input_num_ = 1;
  242. vector<void *> v_data_addr;
  243. vector<int64_t> v_data_size;
  244. output->GetOutputData(v_data_addr, v_data_size);
  245. EXPECT_EQ(output->v_input_data_addr_, v_data_addr);
  246. EXPECT_EQ(output->v_input_size_, v_data_size);
  247. delete output;
  248. }
  249. } // namespace ge

图引擎模块(GE)是MindSpore的一个子模块,其代码由C++实现,位于前端模块ME和底层硬件之间,起到承接作用。图引擎模块以ME下发的图作为输入,然后进行一系列的深度图优化操作,最后输出一张可以在底层硬件上高效运行的图。GE针对昇腾AI处理器的硬件结构特点,做了特定的优化工作,以此来充分发挥出昇腾AI处理器的强大算力。在进行模型训练/推理时,GE会被自动调用而用户并不感知。GE主要由GE API和GE Core两部分组成,详细的架构图如下所示