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 10 kB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  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_output.h"
  25. #include "graph/load/new_model_manager/model_utils.h"
  26. #include "graph/load/output/output.h"
  27. #include "graph/manager/graph_var_manager.h"
  28. #include "new_op_test_utils.h"
  29. #include "proto/om.pb.h"
  30. using namespace std;
  31. namespace ge {
  32. class UtestNetOutput : public testing::Test {
  33. protected:
  34. void TearDown() {}
  35. shared_ptr<OmeTestOpDescBuilder> GenOpdef(OpDescPtr &op_desc, int flag) {
  36. shared_ptr<OmeTestOpDescBuilder> builder = make_shared<OmeTestOpDescBuilder>(op_desc);
  37. builder->SetStreamId(0);
  38. builder->AddInput(1);
  39. builder->SetType("NetOutput");
  40. if (flag == 1) {
  41. auto input_desc_1 = builder->AddInputDesc({1, 1, 10, 10}, FORMAT_NCHW, DT_FLOAT16);
  42. }
  43. auto input_desc_1 = builder->AddInputDesc({1, 1, 10, 10}, FORMAT_NCHW, DT_FLOAT16);
  44. if (flag == 2) {
  45. auto input_desc_2 = builder->AddInputDesc({1, 1, 10, 10}, FORMAT_NCHW, DT_FLOAT16);
  46. }
  47. if (flag == 3) {
  48. builder->AddInput(10);
  49. }
  50. return builder;
  51. }
  52. shared_ptr<OmeTestOpDescBuilder> GenOpdef2(OpDescPtr &op_desc) {
  53. shared_ptr<OmeTestOpDescBuilder> builder = make_shared<OmeTestOpDescBuilder>(op_desc);
  54. builder->SetStreamId(0);
  55. builder->SetType("NetOutput");
  56. builder->AddInput(10);
  57. auto input_desc_1 = builder->AddInputDesc({64, 32, 5, 5}, FORMAT_FRACTAL_Z, DT_FLOAT);
  58. builder->AddInput(1000000);
  59. auto input_desc_2 = builder->AddInputDesc({1, 10, 10, 1}, FORMAT_NHWC, DT_FLOAT);
  60. builder->AddOutput(2000000);
  61. auto output_desc_1 = builder->AddOutputDesc({64, 32, 5, 5}, FORMAT_NCHW, DT_FLOAT);
  62. builder->AddOutput(2100000);
  63. output_desc_1 = builder->AddOutputDesc({1, 10, 10, 1}, FORMAT_NHWC, DT_FLOAT);
  64. return builder;
  65. }
  66. public:
  67. shared_ptr<DavinciModel> dav_model_;
  68. };
  69. TEST_F(UtestNetOutput, test_get_input_size) {
  70. shared_ptr<OpDesc> custom_op_desc = make_shared<OpDesc>();
  71. OmeTestOpDescBuilder builder(custom_op_desc);
  72. builder.SetName("netoutput");
  73. builder.SetStreamId(0);
  74. builder.SetType("NetOutput");
  75. auto input_desc_1 = builder.AddInputDesc({1, 1, 1, 1}, FORMAT_FRACTAL_Z, DT_FLOAT);
  76. builder.AddInput(1);
  77. auto output_desc = builder.AddOutputDesc({1, 1, 1, 1}, FORMAT_NCHW, DT_FLOAT);
  78. builder.AddOutput(1);
  79. builder.Finish();
  80. vector<int64_t> v_output_size = ModelUtils::GetInputSize(custom_op_desc);
  81. EXPECT_EQ(v_output_size.size(), 1);
  82. }
  83. // test ModelUtils::IsOutput
  84. TEST_F(UtestNetOutput, success_is_output) {
  85. ModelUtils *model_utils = new ModelUtils();
  86. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  87. OmeTestOpDescBuilder builder(op_desc);
  88. builder.SetType("NetOutput");
  89. vector<GeTensorDescPtr> outputs_desc;
  90. std::shared_ptr<GeTensorDesc> desc = std::make_shared<GeTensorDesc>();
  91. outputs_desc.push_back(desc);
  92. op_desc->outputs_desc_ = outputs_desc;
  93. bool ret = model_utils->IsOutput(op_desc);
  94. EXPECT_EQ(false, ret);
  95. delete model_utils;
  96. }
  97. // test ModelUtils::IsOutput
  98. TEST_F(UtestNetOutput, true_is_output) {
  99. ModelUtils *model_utils = new ModelUtils();
  100. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  101. OmeTestOpDescBuilder builder(op_desc);
  102. builder.SetType("NetOutput");
  103. vector<GeTensorDescPtr> outputs_desc;
  104. std::shared_ptr<GeTensorDesc> desc = std::make_shared<GeTensorDesc>();
  105. outputs_desc.push_back(desc);
  106. op_desc->outputs_desc_ = outputs_desc;
  107. ge::TensorUtils::SetOutputTensor(*(outputs_desc[0].get()), true);
  108. bool ret = model_utils->IsOutput(op_desc);
  109. EXPECT_EQ(true, ret);
  110. delete model_utils;
  111. }
  112. // test ModelUtils::IsInputTensorNeedTrans
  113. TEST_F(UtestNetOutput, success_is_output_tensor_need_trans) {
  114. ModelUtils *model_utils = new ModelUtils();
  115. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  116. OmeTestOpDescBuilder builder(op_desc);
  117. builder.SetType("NetOutput");
  118. size_t tensor_index = 1;
  119. vector<GeTensorDescPtr> outputs_desc;
  120. std::shared_ptr<GeTensorDesc> desc = std::make_shared<GeTensorDesc>();
  121. outputs_desc.push_back(desc);
  122. op_desc->outputs_desc_ = outputs_desc;
  123. op_desc->inputs_desc_ = outputs_desc;
  124. bool ret = model_utils->IsInputTensorNeedTrans(op_desc, tensor_index);
  125. EXPECT_EQ(false, ret);
  126. delete model_utils;
  127. }
  128. // test ModelUtils::GetOutputSize
  129. TEST_F(UtestNetOutput, success_get_output_size) {
  130. vector<int64_t> v_output_size;
  131. ModelUtils *model_utils = new ModelUtils();
  132. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  133. vector<GeTensorDescPtr> outputs_desc;
  134. std::shared_ptr<GeTensorDesc> desc = std::make_shared<GeTensorDesc>();
  135. outputs_desc.push_back(desc);
  136. op_desc->outputs_desc_ = outputs_desc;
  137. EXPECT_EQ(v_output_size, model_utils->GetOutputSize(op_desc));
  138. vector<int64_t> output = {1};
  139. op_desc->SetOutputOffset(output);
  140. uint32_t tensor_size = 0;
  141. v_output_size.push_back(tensor_size);
  142. EXPECT_EQ(v_output_size, model_utils->GetOutputSize(op_desc));
  143. delete model_utils;
  144. }
  145. // test ModelUtils::GetWorkspaceSize
  146. TEST_F(UtestNetOutput, success_get_workspace_size) {
  147. vector<int64_t> v_workspace_size;
  148. ModelUtils *model_utils = new ModelUtils();
  149. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  150. vector<int64_t> workspace = {1};
  151. op_desc->SetWorkspace(workspace);
  152. EXPECT_EQ(v_workspace_size, model_utils->GetWorkspaceSize(op_desc));
  153. op_desc->SetWorkspaceBytes(workspace);
  154. v_workspace_size.push_back(1);
  155. EXPECT_EQ(v_workspace_size, model_utils->GetWorkspaceSize(op_desc));
  156. delete model_utils;
  157. }
  158. // test ModelUtils::GetWeightSize
  159. TEST_F(UtestNetOutput, success_get_weight_size) {
  160. vector<int64_t> v_weight_size;
  161. ModelUtils *model_utils = new ModelUtils();
  162. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  163. op_desc->SetType("Const");
  164. EXPECT_EQ(v_weight_size, model_utils->GetWeightSize(op_desc));
  165. op_desc->SetType("NetOutput");
  166. vector<GeTensorDescPtr> inputs_desc;
  167. std::shared_ptr<GeTensorDesc> desc = std::make_shared<GeTensorDesc>();
  168. inputs_desc.push_back(desc);
  169. op_desc->inputs_desc_ = inputs_desc;
  170. vector<bool> is_input_const = {true};
  171. op_desc->SetIsInputConst(is_input_const);
  172. v_weight_size.push_back(0);
  173. EXPECT_EQ(v_weight_size, model_utils->GetWeightSize(op_desc));
  174. delete model_utils;
  175. }
  176. // test ModelUtils::GetWeights
  177. TEST_F(UtestNetOutput, success_get_weights) {
  178. vector<ConstGeTensorPtr> v_weights;
  179. ModelUtils *model_utils = new ModelUtils();
  180. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  181. op_desc->SetType("Const");
  182. EXPECT_EQ(v_weights, model_utils->GetWeights(op_desc));
  183. op_desc->SetType("NetOutput");
  184. vector<GeTensorDescPtr> inputs_desc;
  185. std::shared_ptr<GeTensorDesc> desc = std::make_shared<GeTensorDesc>();
  186. inputs_desc.push_back(desc);
  187. op_desc->inputs_desc_ = inputs_desc;
  188. vector<bool> is_input_const = {true};
  189. op_desc->SetIsInputConst(is_input_const);
  190. GeTensorDesc tensor_desc;
  191. EXPECT_EQ(v_weights, model_utils->GetWeights(op_desc));
  192. delete model_utils;
  193. }
  194. // test ModelUtils::GetInputDescs
  195. TEST_F(UtestNetOutput, success_get_input_descs) {
  196. vector<::opTensor_t> v_input_descs;
  197. vector<::tagCcAICPUTensor> ret;
  198. ModelUtils *model_utils = new ModelUtils();
  199. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  200. ret = model_utils->GetInputDescs(op_desc);
  201. EXPECT_EQ(v_input_descs.size(), ret.size());
  202. vector<GeTensorDescPtr> inputs_desc;
  203. std::shared_ptr<GeTensorDesc> desc = std::make_shared<GeTensorDesc>();
  204. inputs_desc.push_back(desc);
  205. op_desc->inputs_desc_ = inputs_desc;
  206. vector<bool> is_input_const = {false};
  207. op_desc->SetIsInputConst(is_input_const);
  208. opTensor_t tmp;
  209. tmp.format = OP_TENSOR_FORMAT_NC1HWC0;
  210. tmp.dim_cnt = 0;
  211. tmp.data_type = OP_DATA_FLOAT;
  212. v_input_descs.push_back(tmp);
  213. ret = model_utils->GetInputDescs(op_desc);
  214. EXPECT_EQ(v_input_descs.size(), ret.size());
  215. delete model_utils;
  216. }
  217. // test ModelUtils::GetOutputDescs
  218. TEST_F(UtestNetOutput, success_get_output_descs) {
  219. vector<::opTensor_t> v_output_descs;
  220. vector<::tagCcAICPUTensor> ret;
  221. ModelUtils *model_utils = new ModelUtils();
  222. std::shared_ptr<OpDesc> op_desc = std::make_shared<OpDesc>();
  223. ret = model_utils->GetOutputDescs(op_desc);
  224. EXPECT_EQ(v_output_descs.size(), ret.size());
  225. vector<GeTensorDescPtr> outputs_desc;
  226. std::shared_ptr<GeTensorDesc> desc = std::make_shared<GeTensorDesc>();
  227. outputs_desc.push_back(desc);
  228. op_desc->outputs_desc_ = outputs_desc;
  229. opTensor_t tmp;
  230. tmp.format = OP_TENSOR_FORMAT_NC1HWC0;
  231. tmp.dim_cnt = 0;
  232. tmp.data_type = OP_DATA_FLOAT;
  233. v_output_descs.push_back(tmp);
  234. ret = model_utils->GetOutputDescs(op_desc);
  235. EXPECT_EQ(v_output_descs.size(), ret.size());
  236. delete model_utils;
  237. }
  238. // test Output::GetOutputData
  239. TEST_F(UtestNetOutput, success_get_output_data) {
  240. Output *output = new Output(nullptr, nullptr);
  241. output->v_input_data_addr_.push_back((void *)1);
  242. output->v_input_size_.push_back(1);
  243. output->input_num_ = 1;
  244. vector<void *> v_data_addr;
  245. vector<int64_t> v_data_size;
  246. output->GetOutputData(v_data_addr, v_data_size);
  247. EXPECT_EQ(output->v_input_data_addr_, v_data_addr);
  248. EXPECT_EQ(output->v_input_size_, v_data_size);
  249. delete output;
  250. }
  251. } // namespace ge

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