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

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

Contributors (1)