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.

tbe_adapter.cc 12 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. /**
  2. * Copyright 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 "kernel/tbe/tbe_adapter.h"
  17. #include <map>
  18. #include <unordered_set>
  19. #include <string>
  20. #include <memory>
  21. #include <vector>
  22. #include <algorithm>
  23. #include "session/anf_runtime_algorithm.h"
  24. #include "kernel/oplib/opinfo.h"
  25. namespace mindspore {
  26. namespace kernel {
  27. namespace tbe {
  28. static std::map<string, string> tbe_func_adapter_map = {
  29. {"re_lu6", "relu6"},
  30. {"re_lu6_grad", "relu6_grad"},
  31. {"re_lu", "relu"},
  32. {"re_luv2", "relu_v2"},
  33. {"tensor_add", "add"},
  34. {"reduce_mean", "reduce_mean_d"},
  35. {"reduce_max", "reduce_max_d"},
  36. {"reduce_min", "reduce_min_d"},
  37. {"conv2d_backprop_filter", "conv2d_backprop_filter_d"},
  38. {"conv2d_backprop_input", "conv2d_backprop_input_d"},
  39. {"depthwise_conv2d_native", "depthwise_conv2d"},
  40. {"depthwise_conv2d_native_backprop_filter", "depthwise_conv2d_backprop_filter_d"},
  41. {"depthwise_conv2d_native_backprop_input", "depthwise_conv2d_backprop_input_d"},
  42. {"scatter_nd", "scatter_nd_d"},
  43. {"tile", "tile_d"},
  44. {"gather_v2", "gather_v2_d"},
  45. {"batch_mat_mul", "batch_matmul"},
  46. {"b_n_training_reduce", "bn_training_reduce"},
  47. {"b_n_training_update", "bn_training_update"},
  48. {"b_n_training_reduce_grad", "bn_training_reduce_grad"},
  49. {"b_n_training_update_grad", "bn_training_update_grad"},
  50. {"n_pu_clear_float_status", "n_p_u_clear_float_status"},
  51. {"n_pu_get_float_status", "n_p_u_get_float_status"},
  52. {"n_pu_alloc_float_status", "n_p_u_alloc_float_status"},
  53. {"dropout_do_mask", "drop_out_do_mask"},
  54. {"strided_slice", "strided_slice_d"},
  55. {"strided_slice_grad", "strided_slice_grad_d"},
  56. {"transpose", "transpose_d"},
  57. {"fill", "fill_d"},
  58. {"unsorted_segment_sum", "unsorted_segment_sum_d"},
  59. {"concat", "concat_d"},
  60. {"slice", "slice_d"},
  61. {"reduce_sum", "reduce_sum_d"},
  62. {"one_hot", "one_hot_d"},
  63. {"sum", "reduce_sum_d"},
  64. {"lamb_next_mv_with_decay_v1", "lamb_next_m_v_with_decay_v1"},
  65. {"lamb_next_mv", "lamb_next_m_v"},
  66. {"split", "split_d"},
  67. {"resize_nearest_neighbor", "resize_nearest_neighbor_d"},
  68. {"resize_nearest_neighbor_grad", "resize_nearest_neighbor_grad_d"},
  69. {"pad", "pad_d"},
  70. {"adam", "apply_adam"}};
  71. void TbeAdapter::NormalizeFuncName(std::string *func_name) {
  72. if (func_name == nullptr) {
  73. MS_LOG(EXCEPTION) << "func_name is null";
  74. }
  75. std::string name_tmp;
  76. bool sub_head = false;
  77. for (string::iterator iter = func_name->begin(); iter != func_name->end(); ++iter) {
  78. if (islower(*iter)) {
  79. sub_head = false;
  80. }
  81. if (isdigit(*iter)) {
  82. sub_head = true;
  83. }
  84. if (isupper(*iter) && iter != func_name->begin()) {
  85. if (!sub_head) {
  86. (void)name_tmp.insert(name_tmp.end(), '_');
  87. sub_head = true;
  88. } else {
  89. string::iterator iter_next = iter + 1;
  90. if (iter_next != func_name->end()) {
  91. if (islower(*iter_next)) {
  92. (void)name_tmp.insert(name_tmp.end(), '_');
  93. }
  94. }
  95. }
  96. }
  97. (void)name_tmp.insert(name_tmp.end(), *iter);
  98. }
  99. (void)transform(name_tmp.begin(), name_tmp.end(), name_tmp.begin(), ::tolower);
  100. *func_name = name_tmp;
  101. auto iter = tbe_func_adapter_map.find(*func_name);
  102. if (iter != tbe_func_adapter_map.end()) {
  103. MS_LOG(INFO) << "map actual op from me " << func_name << "to tbe op" << iter->second;
  104. *func_name = iter->second;
  105. }
  106. }
  107. void TbeAdapter::SetTbeAttrsForTransDataOp(const mindspore::AnfNodePtr &anf_node) {
  108. MS_EXCEPTION_IF_NULL(anf_node);
  109. if (AnfAlgo::GetCNodeName(anf_node) == kTransDataOpName) {
  110. std::string input_format = AnfAlgo::GetInputFormat(anf_node, 0);
  111. std::string output_format = AnfAlgo::GetOutputFormat(anf_node, 0);
  112. if (input_format == kOpFormat_DEFAULT) {
  113. input_format = kOpFormat_NCHW;
  114. }
  115. if (output_format == kOpFormat_DEFAULT) {
  116. output_format = kOpFormat_NCHW;
  117. }
  118. AnfAlgo::SetNodeAttr("src_format", MakeValue(input_format), anf_node);
  119. AnfAlgo::SetNodeAttr("dst_format", MakeValue(output_format), anf_node);
  120. }
  121. }
  122. std::unordered_set<std::string> input_order_adjusted_ops = {
  123. "Conv2DBackpropInput", "Conv2DBackpropFilter", "LogSoftmaxGrad", "LayerNormGrad",
  124. "LayerNormXBackprop", "LayerNormBetaGammaBackprop", "MinimumGrad", "MaximumGrad"};
  125. void TbeAdapter::InputOrderPass(const std::string &op_name, std::vector<std::vector<nlohmann::json>> const &inputs_list,
  126. nlohmann::json *inputs_json) {
  127. MS_EXCEPTION_IF_NULL(inputs_json);
  128. if (input_order_adjusted_ops.find(op_name) == input_order_adjusted_ops.end()) {
  129. (void)std::copy(inputs_list.begin(), inputs_list.end(), std::back_inserter((*inputs_json)));
  130. } else {
  131. if (op_name == "MinimumGrad" || op_name == "MaximumGrad") {
  132. inputs_json->push_back(inputs_list[2]);
  133. inputs_json->push_back(inputs_list[0]);
  134. inputs_json->push_back(inputs_list[1]);
  135. for (size_t i = 3; i < inputs_list.size(); ++i) {
  136. inputs_json->push_back(inputs_list[i]);
  137. }
  138. } else {
  139. inputs_json->push_back(inputs_list[1]);
  140. inputs_json->push_back(inputs_list[0]);
  141. for (size_t i = 2; i < inputs_list.size(); ++i) {
  142. inputs_json->push_back(inputs_list[i]);
  143. }
  144. }
  145. }
  146. }
  147. std::map<std::string, FAttrsPass> TbeAdapter::build_json_attr_pass_map_ = {
  148. {"MaximumGrad", TbeAdapter::MaximumGradAttrJsonPass},
  149. {"MinimumGrad", TbeAdapter::MinimumGradAttrJsonPass},
  150. {"Cast", TbeAdapter::CastAttrJsonPass}};
  151. bool TbeAdapter::RunAttrPass(const mindspore::AnfNodePtr &anf_node,
  152. const std::vector<std::shared_ptr<mindspore::kernel::OpAttr>> &op_info_attrs,
  153. nlohmann::json *attrs_json) {
  154. MS_EXCEPTION_IF_NULL(attrs_json);
  155. auto cnode_name = AnfAlgo::GetCNodeName(anf_node);
  156. auto FPass = build_json_attr_pass_map_.find(cnode_name);
  157. if (FPass != build_json_attr_pass_map_.end()) {
  158. FPass->second(anf_node, op_info_attrs, attrs_json);
  159. return true;
  160. }
  161. return false;
  162. }
  163. void TbeAdapter::MaximumGradAttrJsonPass(const mindspore::AnfNodePtr &anf_node,
  164. const std::vector<std::shared_ptr<mindspore::kernel::OpAttr>> &op_info_attrs,
  165. nlohmann::json *attrs_json) {
  166. MS_EXCEPTION_IF_NULL(anf_node);
  167. MS_EXCEPTION_IF_NULL(attrs_json);
  168. auto attr_num = op_info_attrs.size();
  169. auto primitive = AnfAlgo::GetCNodePrimitive(anf_node);
  170. MS_EXCEPTION_IF_NULL(primitive);
  171. for (size_t i = 0; i < attr_num; i++) {
  172. nlohmann::json attr_obj;
  173. MS_EXCEPTION_IF_NULL(op_info_attrs[i]);
  174. std::string attr_name = op_info_attrs[i]->name();
  175. auto value = primitive->GetAttr(attr_name);
  176. if (value != nullptr) {
  177. bool attr_value = GetValue<bool>(value);
  178. attr_obj["value"] = attr_value;
  179. attr_obj["valid"] = true;
  180. } else {
  181. attr_obj["valid"] = false;
  182. }
  183. attr_obj["name"] = attr_name;
  184. attrs_json->push_back(attr_obj);
  185. }
  186. MS_LOG(INFO) << "MaximumGradAttrJsonPass done.";
  187. }
  188. void TbeAdapter::MinimumGradAttrJsonPass(const mindspore::AnfNodePtr &anf_node,
  189. const std::vector<std::shared_ptr<mindspore::kernel::OpAttr>> &op_info_attrs,
  190. nlohmann::json *attrs_json) {
  191. MS_EXCEPTION_IF_NULL(anf_node);
  192. MS_EXCEPTION_IF_NULL(attrs_json);
  193. auto attr_num = op_info_attrs.size();
  194. auto primitive = AnfAlgo::GetCNodePrimitive(anf_node);
  195. MS_EXCEPTION_IF_NULL(primitive);
  196. for (size_t i = 0; i < attr_num; i++) {
  197. nlohmann::json attr_obj;
  198. MS_EXCEPTION_IF_NULL(op_info_attrs[i]);
  199. std::string attr_name = op_info_attrs[i]->name();
  200. auto value = primitive->GetAttr(attr_name);
  201. if (value != nullptr) {
  202. bool attr_value = GetValue<bool>(value);
  203. attr_obj["value"] = attr_value;
  204. attr_obj["valid"] = true;
  205. } else {
  206. attr_obj["valid"] = false;
  207. }
  208. attr_obj["name"] = attr_name;
  209. attrs_json->push_back(attr_obj);
  210. }
  211. MS_LOG(INFO) << "MinimumGradAttrJsonPass done.";
  212. }
  213. static int TypeStrToDstType(const std::string &type_str) {
  214. int ret = -1;
  215. if (type_str == "Float" || type_str == "Float32") {
  216. ret = 0;
  217. } else if (type_str == "Float16") {
  218. ret = 1;
  219. } else if (type_str == "Int8") {
  220. ret = 2;
  221. } else if (type_str == "Int32") {
  222. ret = 3;
  223. } else if (type_str == "UInt8") {
  224. ret = 4;
  225. } else if (type_str == "UInt64") {
  226. ret = 10;
  227. } else if (type_str == "Bool_") {
  228. ret = 12;
  229. } else {
  230. MS_EXCEPTION(ArgumentError) << "type str is invailed: " << type_str;
  231. }
  232. return ret;
  233. }
  234. void TbeAdapter::CastAttrJsonPass(const mindspore::AnfNodePtr &anf_node,
  235. const std::vector<std::shared_ptr<mindspore::kernel::OpAttr>> &op_info_attrs,
  236. nlohmann::json *attrs_json) {
  237. MS_EXCEPTION_IF_NULL(anf_node);
  238. MS_EXCEPTION_IF_NULL(attrs_json);
  239. if (op_info_attrs.size() != 1) {
  240. MS_LOG(INFO) << "cast node should has dst_type attr";
  241. return;
  242. }
  243. auto attr_name = op_info_attrs[0]->name();
  244. auto type_ptr = std::make_shared<TensorType>(TypeIdToType(AnfAlgo::GetOutputDeviceDataType(anf_node, 0)));
  245. MS_EXCEPTION_IF_NULL(type_ptr);
  246. auto type_element = type_ptr->element();
  247. MS_EXCEPTION_IF_NULL(type_element);
  248. auto dtype = type_element->ToString();
  249. auto dst_type_value = TypeStrToDstType(dtype);
  250. nlohmann::json attr_obj;
  251. attr_obj["value"] = dst_type_value;
  252. attr_obj["valid"] = true;
  253. attr_obj["name"] = attr_name;
  254. attrs_json->push_back(attr_obj);
  255. MS_LOG(INFO) << "CastAttrJsonPass done.";
  256. }
  257. void TbeAdapter::GenTopKV2IndicesTensorInfo(const std::shared_ptr<mindspore::AnfNode> &anf_node,
  258. size_t real_input_index, std::vector<nlohmann::json> *input_list,
  259. mindspore::kernel::kCreaterType creater_type) {
  260. MS_EXCEPTION_IF_NULL(anf_node);
  261. MS_EXCEPTION_IF_NULL(input_list);
  262. auto input_x_shape = AnfAlgo::GetOutputInferShape(anf_node, 0);
  263. size_t last_dim = input_x_shape[input_x_shape.size() - 1];
  264. std::vector<size_t> tensor_shape = {last_dim};
  265. std::vector<size_t> tensor_origin_shape = {last_dim};
  266. std::string tensor_format = AnfAlgo::GetInputFormat(anf_node, static_cast<const size_t &>(real_input_index));
  267. if (tensor_format == kOpFormat_DEFAULT) {
  268. tensor_format = kOpFormat_NCHW;
  269. }
  270. std::string tensor_origin_format = kOpFormat_NCHW;
  271. std::string tensor_dtype = "float16";
  272. nlohmann::json input_desc_json;
  273. input_desc_json["dtype"] = tensor_dtype;
  274. input_desc_json["name"] = AnfAlgo::GetCNodeName(anf_node);
  275. input_desc_json["ori_shape"] = tensor_origin_shape;
  276. input_desc_json["ori_format"] = tensor_origin_format;
  277. input_desc_json["shape"] = tensor_shape;
  278. if (creater_type == OP_SELECT_FORMAT) {
  279. input_desc_json["format"] = tensor_origin_format;
  280. } else {
  281. input_desc_json["format"] = tensor_format;
  282. }
  283. input_desc_json["valid"] = true;
  284. input_list->emplace_back(input_desc_json);
  285. }
  286. } // namespace tbe
  287. } // namespace kernel
  288. } // namespace mindspore