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.

single_op_unittest.cc 7.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. /**
  2. * Copyright 2021 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 <vector>
  18. #include "runtime/rt.h"
  19. #define protected public
  20. #define private public
  21. #include "single_op/single_op.h"
  22. #include "single_op/single_op_manager.h"
  23. #include "single_op/task/build_task_utils.h"
  24. #undef private
  25. #undef protected
  26. using namespace std;
  27. using namespace ge;
  28. class UtestSingleOp : public testing::Test {
  29. protected:
  30. void SetUp() {}
  31. void TearDown() {}
  32. };
  33. TEST_F(UtestSingleOp, test_dynamic_singleop_execute_async) {
  34. uintptr_t resource_id = 0;
  35. std::mutex stream_mu;
  36. rtStream_t stream = nullptr;
  37. rtStreamCreate(&stream, 0);
  38. DynamicSingleOp dynamic_single_op(resource_id, &stream_mu, stream);
  39. vector<int64_t> dims_vec_0 = {2};
  40. vector<GeTensorDesc> input_desc;
  41. GeTensorDesc tensor_desc_0(GeShape(dims_vec_0), FORMAT_NCHW, DT_INT32);
  42. // input data from device
  43. AttrUtils::SetInt(tensor_desc_0, ATTR_NAME_PLACEMENT, 0);
  44. input_desc.emplace_back(tensor_desc_0);
  45. vector<DataBuffer> input_buffers;
  46. ge::DataBuffer data_buffer;
  47. data_buffer.data = new char[4];
  48. data_buffer.length = 4;
  49. input_buffers.emplace_back(data_buffer);
  50. vector<GeTensorDesc> output_desc;
  51. vector<DataBuffer> output_buffers;
  52. // UpdateRunInfo failed
  53. EXPECT_EQ(dynamic_single_op.ExecuteAsync(input_desc, input_buffers, output_desc, output_buffers), ACL_ERROR_GE_PARAM_INVALID);
  54. }
  55. TEST_F(UtestSingleOp, test_dynamic_singleop_execute_async1) {
  56. uintptr_t resource_id = 0;
  57. std::mutex stream_mu;
  58. rtStream_t stream = nullptr;
  59. rtStreamCreate(&stream, 0);
  60. DynamicSingleOp dynamic_single_op(resource_id, &stream_mu, stream);
  61. dynamic_single_op.num_inputs_ = 1;
  62. vector<int64_t> dims_vec_0 = {2};
  63. vector<GeTensorDesc> input_desc;
  64. GeTensorDesc tensor_desc_0(GeShape(dims_vec_0), FORMAT_NCHW, DT_INT32);
  65. // input data from host
  66. AttrUtils::SetInt(tensor_desc_0, ATTR_NAME_PLACEMENT, 1);
  67. input_desc.emplace_back(tensor_desc_0);
  68. int64_t input_size = 0;
  69. EXPECT_EQ(TensorUtils::GetTensorMemorySizeInBytes(tensor_desc_0, input_size), SUCCESS);
  70. EXPECT_EQ(input_size, 64);
  71. EXPECT_NE(SingleOpManager::GetInstance().GetResource(resource_id, stream), nullptr);
  72. vector<DataBuffer> input_buffers;
  73. ge::DataBuffer data_buffer;
  74. data_buffer.data = new char[4];
  75. data_buffer.length = 4;
  76. input_buffers.emplace_back(data_buffer);
  77. vector<GeTensorDesc> output_desc;
  78. vector<DataBuffer> output_buffers;
  79. auto *tbe_task = new (std::nothrow) TbeOpTask();
  80. ge::OpDescPtr op_desc = std::make_shared<OpDesc>("Mul", MATMUL);
  81. ge::ComputeGraphPtr graph = std::make_shared<ge::ComputeGraph>("default");
  82. ge::NodePtr node = graph->AddNode(op_desc);
  83. tbe_task->node_ = node;
  84. dynamic_single_op.op_task_.reset((OpTask *)(tbe_task));
  85. OpDescPtr desc_ptr = MakeShared<OpDesc>("name1", "type1");
  86. EXPECT_EQ(desc_ptr->AddInputDesc("x", GeTensorDesc(GeShape({2}), FORMAT_NCHW)), GRAPH_SUCCESS);
  87. dynamic_single_op.op_task_->op_desc_ = desc_ptr;
  88. // UpdateRunInfo failed
  89. EXPECT_EQ(dynamic_single_op.ExecuteAsync(input_desc, input_buffers, output_desc, output_buffers), PARAM_INVALID);
  90. }
  91. TEST_F(UtestSingleOp, test_singleop_execute_async1) {
  92. StreamResource *res = new (std::nothrow) StreamResource(1);
  93. std::mutex stream_mu;
  94. rtStream_t stream = nullptr;
  95. rtStreamCreate(&stream, 0);
  96. SingleOp single_op(res, &stream_mu, stream);
  97. vector<DataBuffer> input_buffers;
  98. ge::DataBuffer data_buffer;
  99. data_buffer.data = new char[4];
  100. data_buffer.length = 4;
  101. data_buffer.placement = 1;
  102. input_buffers.emplace_back(data_buffer);
  103. vector<DataBuffer> output_buffers;
  104. single_op.input_sizes_.emplace_back(4);
  105. SingleOpModelParam model_params;
  106. single_op.running_param_.reset(new (std::nothrow)SingleOpModelParam(model_params));
  107. single_op.args_.resize(1);
  108. auto *tbe_task = new (std::nothrow) TbeOpTask();
  109. ge::OpDescPtr op_desc = std::make_shared<OpDesc>("Mul", MATMUL);
  110. EXPECT_EQ(op_desc->AddInputDesc("x", GeTensorDesc(GeShape({2}), FORMAT_NCHW)), GRAPH_SUCCESS);
  111. EXPECT_EQ(op_desc->AddOutputDesc("x", GeTensorDesc(GeShape({2}), FORMAT_NCHW)), GRAPH_SUCCESS);
  112. EXPECT_NE(BuildTaskUtils::GetTaskInfo(op_desc), "");
  113. ge::ComputeGraphPtr graph = std::make_shared<ge::ComputeGraph>("default");
  114. ge::NodePtr node = graph->AddNode(op_desc);
  115. tbe_task->node_ = node;
  116. tbe_task->op_desc_ = op_desc;
  117. single_op.tasks_.push_back(tbe_task);
  118. EXPECT_EQ(single_op.hybrid_model_executor_, nullptr);
  119. EXPECT_EQ(single_op.running_param_->mem_base, nullptr);
  120. EXPECT_EQ(single_op.ExecuteAsync(input_buffers, output_buffers), SUCCESS);
  121. }
  122. TEST_F(UtestSingleOp, test_singleop_execute_async2) {
  123. StreamResource *res = new (std::nothrow) StreamResource(1);
  124. std::mutex stream_mu;
  125. rtStream_t stream = nullptr;
  126. rtStreamCreate(&stream, 0);
  127. SingleOp single_op(res, &stream_mu, stream);
  128. vector<DataBuffer> input_buffers;
  129. ge::DataBuffer data_buffer;
  130. data_buffer.data = new char[4];
  131. data_buffer.length = 4;
  132. data_buffer.placement = 1;
  133. input_buffers.emplace_back(data_buffer);
  134. vector<DataBuffer> output_buffers;
  135. single_op.input_sizes_.emplace_back(4);
  136. SingleOpModelParam model_params;
  137. single_op.running_param_.reset(new (std::nothrow)SingleOpModelParam(model_params));
  138. single_op.args_.resize(1);
  139. GeTensorDesc tensor_desc(GeShape({1}), FORMAT_NHWC, DT_UINT64);
  140. single_op.inputs_desc_.emplace_back(tensor_desc);
  141. std::shared_ptr<ge::GeRootModel> root_model = ge::MakeShared<ge::GeRootModel>();
  142. single_op.hybrid_model_.reset(new (std::nothrow)hybrid::HybridModel(root_model));
  143. single_op.hybrid_model_executor_.reset(new (std::nothrow)hybrid::HybridModelExecutor(single_op.hybrid_model_.get(), 0, stream));
  144. EXPECT_EQ(single_op.running_param_->mem_base, nullptr);
  145. EXPECT_EQ(single_op.tasks_.size(), 0);
  146. GeTensorDesc tensor;
  147. int64_t storage_format_val = static_cast<Format>(FORMAT_NCHW);
  148. AttrUtils::SetInt(tensor, "storage_format", storage_format_val);
  149. std::vector<int64_t> storage_shape{1, 1, 1, 1};
  150. AttrUtils::SetListInt(tensor, "storage_shape", storage_shape);
  151. single_op.inputs_desc_.emplace_back(tensor);
  152. EXPECT_EQ(single_op.ExecuteAsync(input_buffers, output_buffers), PARAM_INVALID);
  153. }
  154. TEST_F(UtestSingleOp, test_set_host_mem) {
  155. std::mutex stream_mu_;
  156. DynamicSingleOp single_op(0, &stream_mu_, nullptr);
  157. vector<DataBuffer> input_buffers;
  158. DataBuffer data_buffer;
  159. input_buffers.emplace_back(data_buffer);
  160. vector<GeTensorDesc> input_descs;
  161. GeTensorDesc tensor_desc1;
  162. input_descs.emplace_back(tensor_desc1);
  163. vector<GeTensorDescPtr> op_input_descs;
  164. auto tensor_desc2 = std::make_shared<GeTensorDesc>();
  165. op_input_descs.emplace_back(tensor_desc2);
  166. single_op.tensor_with_hostmem_[0] = op_input_descs;
  167. EXPECT_EQ(single_op.SetHostTensorValue(input_descs, input_buffers), SUCCESS);
  168. }

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