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.

matrix_calculation_ops.h 12 kB

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. #ifndef GE_OP_MATRIX_CALCULATION_OPS_H
  17. #define GE_OP_MATRIX_CALCULATION_OPS_H
  18. #include "../graph/operator_reg.h"
  19. namespace ge {
  20. /**
  21. *@brief Multiplies matrix "a" by matrix "b", producing "a * b".
  22. *@par Inputs:
  23. *Two inputs, including:
  24. * @li x1: A matrix Tensor. 2D. Must be one of the following types: float16,
  25. * float32, int32. Has format [ND, NHWC, FRACTAL_NZ].
  26. * @li x2: A matrix Tensor. 2D. Must be one of the following types: float16,
  27. * float32, int32. Has format [ND, NHWC, FRACTAL_NZ].
  28. * @li bias: A 1D Tensor. Must be one of the following types: float16,
  29. * float32, int32. Has format [ND, NHWC].
  30. *@par Attributes:
  31. *@li transpose_a: A bool. If True, changes the shape of "x1" from [M, K] to [K, M].
  32. *@li transpose_b: A bool. If True, changes the shape of "x2" from [M, K] to [K, M].
  33. *@par Outputs:
  34. *y: The result matrix Tensor. 2D. Must be one of the following types: float16,
  35. * float32, int32. Has format [ND, NHWC, FRACTAL_NZ].
  36. */
  37. REG_OP(MatMul)
  38. .INPUT(x1, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT32}))
  39. .INPUT(x2, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT32}))
  40. .OPTIONAL_INPUT(bias, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT32}))
  41. .OUTPUT(y, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT32}))
  42. .ATTR(transpose_a, Bool, false)
  43. .ATTR(transpose_b, Bool, false)
  44. .OP_END_FACTORY_REG(MatMul)
  45. REG_OP(MatMulV2)
  46. .INPUT(x1, TensorType({DT_FLOAT16, DT_FLOAT16, DT_INT8, DT_INT8}))
  47. .INPUT(x2, TensorType({DT_FLOAT16, DT_FLOAT16, DT_INT8, DT_INT8}))
  48. .INPUT(alpha, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT32, DT_FLOAT}))
  49. .INPUT(beta, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT32, DT_FLOAT}))
  50. .INPUT(bias, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT32, DT_FLOAT}))
  51. .OUTPUT(y, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT32, DT_FLOAT}))
  52. .OP_END_FACTORY_REG(MatMulV2)
  53. /**
  54. *@brief Multiplies matrix "a" by matrix "b", producing "a * b".
  55. *@par Inputs:
  56. *Three inputs, including:
  57. * @li x1: A matrix Tensor. Must be one of the following types: float16,
  58. * float32, int32. 2D or higher. Has format [ND, NHWC, FRACTAL_NZ].
  59. * @li x2: A matrix Tensor. Must be one of the following types: float16,
  60. * float32, int32. 2D or higher. Has format [ND, NHWC, FRACTAL_NZ].
  61. *@par Attributes:
  62. *@li adj_x: A bool. If True, changes the shape of "x1" from [B, M, K] to [B, K, M].
  63. *@li adj_y: A bool. If True, changes the shape of "x2" from [B, M, K] to [B, K, M].
  64. *@par Outputs:
  65. *y: The result matrix Tensor. 2D or higher. Must be one of the following types: float16,
  66. * float32, int32. 2D or higher. Has format [ND, NHWC, FRACTAL_NZ]. Has the same shape length as "x1" and "x2".
  67. */
  68. REG_OP(BatchMatMul)
  69. .INPUT(x1, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT32}))
  70. .INPUT(x2, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT32}))
  71. .OUTPUT(y, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT32}))
  72. .ATTR(adj_x, Bool, false)
  73. .ATTR(adj_y, Bool, false)
  74. .OP_END_FACTORY_REG(BatchMatMul)
  75. REG_OP(MeanCCE)
  76. .INPUT(x, TensorType::ALL())
  77. .INPUT(indices, TensorType::ALL())
  78. .OUTPUT(y, TensorType::ALL())
  79. .ATTR(keep_dims, Bool, false)
  80. .ATTR(value1, ListInt, {})
  81. .ATTR(mode, Int, 3) // 0:max pooling or 1:avg pooling
  82. .ATTR(pad_mode, Int, 0)
  83. .ATTR(global_pooling, Bool, true)
  84. .ATTR(window, ListInt, {1,1}) // kernel size
  85. .ATTR(pad, ListInt, {0,0,0,0}) // pad size
  86. .ATTR(stride, ListInt, {1,1}) // stride size
  87. .ATTR(ceil_mode, Int, 0)
  88. .ATTR(data_mode, Int, 1)
  89. .ATTR(nan_opt, Int, 0)
  90. .ATTR(fomart, Int, 0)
  91. .OP_END_FACTORY_REG(MeanCCE)
  92. REG_OP(MeanGrad)
  93. .INPUT(x, TensorType::ALL())
  94. .OUTPUT(y, TensorType::ALL())
  95. .ATTR(mode, Int, 1) // 0:max pooling or 1:avg pooling
  96. .ATTR(pad_mode, Int, 0)
  97. .ATTR(global_pooling, Bool, false)
  98. .ATTR(window, ListInt, {1,1}) // kernel size
  99. .ATTR(pad, ListInt, {0,0,0,0}) // pad size
  100. .ATTR(stride, ListInt, {1,1}) // stride size
  101. .ATTR(ceil_mode, Int, 0)
  102. .ATTR(data_mode, Int, 1)
  103. .ATTR(nan_opt, Int, 0)
  104. .ATTR(mean_grad_output_shape_value, ListInt, {1,1,1,1})
  105. .ATTR(mean_grad_output_shape_format, Int, 1) //must be NHWC
  106. .OP_END_FACTORY_REG(MeanGrad)
  107. REG_OP(MatMulCCE)
  108. .INPUT(x1, TensorType({DT_FLOAT}))
  109. .INPUT(x2, TensorType({DT_FLOAT}))
  110. .OPTIONAL_INPUT(x3, TensorType({DT_FLOAT}))
  111. .OUTPUT(y, TensorType({DT_FLOAT}))
  112. .ATTR(transpose_a, Bool, false)
  113. .ATTR(transpose_b, Bool, false)
  114. .ATTR(has_bias, Bool, false)
  115. .OP_END_FACTORY_REG(MatMulCCE)
  116. /**
  117. *@brief Computes half the L2 norm of a tensor without the sqrt.
  118. *@par Inputs:
  119. * x: A Tensor.
  120. * TensorType::FloatingDataType().
  121. *@par Outputs:
  122. *y: A Tensor. Has the same type as "x".
  123. */
  124. REG_OP(L2Loss)
  125. .INPUT(x, TensorType::FloatingDataType())
  126. .OUTPUT(y, TensorType::FloatingDataType())
  127. .OP_END_FACTORY_REG(L2Loss)
  128. REG_OP(MatrixDiag)
  129. .INPUT(x, TensorType::BasicType())
  130. .OUTPUT(y, TensorType::BasicType())
  131. .OP_END_FACTORY_REG(MatrixDiag)
  132. REG_OP(MatrixDiagD)
  133. .INPUT(x, TensorType::BasicType())
  134. .INPUT(assist, TensorType::BasicType())
  135. .OUTPUT(y, TensorType::BasicType())
  136. .OP_END_FACTORY_REG(MatrixDiagD)
  137. REG_OP(MatrixDiagPart)
  138. .INPUT(x, TensorType::BasicType())
  139. .OUTPUT(y, TensorType::BasicType())
  140. .OP_END_FACTORY_REG(MatrixDiagPart)
  141. REG_OP(MatrixDiagPartD)
  142. .INPUT(x, TensorType::BasicType())
  143. .INPUT(assist, TensorType::BasicType())
  144. .OUTPUT(y, TensorType::BasicType())
  145. .OP_END_FACTORY_REG(MatrixDiagPartD)
  146. REG_OP(MatrixSetDiag)
  147. .INPUT(x, TensorType::BasicType())
  148. .INPUT(diagonal, TensorType::BasicType())
  149. .OUTPUT(y, TensorType::BasicType())
  150. .OP_END_FACTORY_REG(MatrixSetDiag)
  151. REG_OP(MatrixSetDiagD)
  152. .INPUT(x, TensorType::BasicType())
  153. .INPUT(diagonal, TensorType::BasicType())
  154. .INPUT(assist, TensorType::BasicType())
  155. .OUTPUT(y, TensorType::BasicType())
  156. .OP_END_FACTORY_REG(MatrixSetDiagD)
  157. REG_OP(ScatterNdUpdate)
  158. .INPUT(var, TensorType::BasicType())
  159. .INPUT(indices, TensorType::IndexNumberType())
  160. .INPUT(updates, TensorType::BasicType())
  161. .OUTPUT(var, TensorType::BasicType())
  162. .ATTR(use_locking, Bool, false)
  163. .OP_END_FACTORY_REG(ScatterNdUpdate)
  164. REG_OP(ScatterAdd)
  165. .INPUT(var, TensorType({DT_FLOAT16, DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  166. .INPUT(indices, TensorType::IndexNumberType())
  167. .INPUT(updates, TensorType({DT_FLOAT16, DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  168. .OUTPUT(var, TensorType({DT_FLOAT16, DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  169. .ATTR(use_locking, Bool, false)
  170. .OP_END_FACTORY_REG(ScatterAdd)
  171. REG_OP(ScatterDiv)
  172. .INPUT(var, TensorType({DT_FLOAT16, DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  173. .INPUT(indices, TensorType({DT_INT32}))
  174. .INPUT(updates, TensorType({DT_FLOAT16, DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  175. .OUTPUT(var, TensorType({DT_FLOAT16, DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  176. .ATTR(use_locking, Bool, false)
  177. .OP_END_FACTORY_REG(ScatterDiv)
  178. REG_OP(ScatterNdAdd)
  179. .INPUT(var, TensorType({DT_FLOAT16, DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  180. .INPUT(indices, TensorType::IndexNumberType())
  181. .INPUT(updates, TensorType({DT_FLOAT16, DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  182. .OUTPUT(var, TensorType({DT_FLOAT16, DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  183. .ATTR(use_locking, Bool, false)
  184. .OP_END_FACTORY_REG(ScatterNdAdd)
  185. REG_OP(ScatterNdSub)
  186. .INPUT(var, TensorType({DT_FLOAT16, DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  187. .INPUT(indices, TensorType::IndexNumberType())
  188. .INPUT(updates, TensorType({DT_FLOAT16, DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  189. .OUTPUT(var, TensorType({DT_FLOAT16, DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  190. .ATTR(use_locking, Bool, false)
  191. .OP_END_FACTORY_REG(ScatterNdSub)
  192. REG_OP(ScatterSub)
  193. .INPUT(var, TensorType({DT_FLOAT16, DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  194. .INPUT(indices, TensorType::IndexNumberType())
  195. .INPUT(updates, TensorType({DT_FLOAT16, DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  196. .OUTPUT(var, TensorType({DT_FLOAT16, DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  197. .ATTR(use_locking, Bool, false)
  198. .OP_END_FACTORY_REG(ScatterSub)
  199. REG_OP(DiagPartD)
  200. .INPUT(x, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT32}))
  201. .INPUT(assist, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT32}))
  202. .OUTPUT(y, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT32}))
  203. .OP_END_FACTORY_REG(DiagPartD)
  204. REG_OP(DiagPart)
  205. .INPUT(x, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT32, DT_INT64, DT_DOUBLE,
  206. DT_COMPLEX64, DT_COMPLEX128}))
  207. .OUTPUT(y, TensorType({DT_FLOAT, DT_FLOAT16, DT_INT32, DT_INT64, DT_DOUBLE,
  208. DT_COMPLEX64, DT_COMPLEX128}))
  209. .OP_END_FACTORY_REG(DiagPart)
  210. REG_OP(InnerProduct)
  211. .INPUT(x, TensorType({DT_FLOAT16, DT_INT8}))
  212. .INPUT(w, TensorType({DT_FLOAT16, DT_INT8}))
  213. .OPTIONAL_INPUT(b, TensorType({DT_FLOAT16, DT_INT32}))
  214. .OPTIONAL_INPUT(offset_w, TensorType({DT_INT8}))
  215. .OUTPUT(y, TensorType({DT_FLOAT16, DT_INT32}))
  216. .REQUIRED_ATTR(num_output, Int)
  217. .ATTR(transpose, Bool, false)
  218. .ATTR(bias_term, Bool, true)
  219. .ATTR(axis, Int, 1)
  220. .ATTR(offset_a, Int, 0)
  221. .OP_END_FACTORY_REG(InnerProduct)
  222. REG_OP(ConfusionMatrix)
  223. .INPUT(labels, TensorType({DT_FLOAT, DT_INT32, DT_FLOAT16, DT_INT8, DT_UINT8}))
  224. .INPUT(predictions, TensorType({DT_FLOAT, DT_INT32, DT_FLOAT16, DT_INT8, DT_UINT8}))
  225. .OPTIONAL_INPUT(weights, TensorType({DT_FLOAT, DT_INT32, DT_FLOAT16, DT_INT8, DT_UINT8}))
  226. .OUTPUT(y, TensorType({DT_FLOAT, DT_INT32, DT_FLOAT16, DT_INT8, DT_UINT8}))
  227. .REQUIRED_ATTR(num_classes, Int)
  228. .REQUIRED_ATTR(dtype, String)
  229. .OP_END_FACTORY_REG(ConfusionMatrix)
  230. REG_OP(ScatterMul)
  231. .INPUT(var, TensorType({DT_FLOAT16,DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  232. .INPUT(indices, TensorType({DT_INT32}))
  233. .INPUT(updates, TensorType({DT_FLOAT16,DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  234. .OUTPUT(var, TensorType({DT_FLOAT16,DT_FLOAT,DT_INT32,DT_INT8,DT_UINT8}))
  235. .ATTR(use_locking, Bool, false)
  236. .OP_END_FACTORY_REG(ScatterMul)
  237. REG_OP(ScatterMin)
  238. .INPUT(var, TensorType({DT_FLOAT16,DT_FLOAT,DT_INT32}))
  239. .INPUT(indices, TensorType({DT_INT32}))
  240. .INPUT(updates, TensorType({DT_FLOAT16,DT_FLOAT,DT_INT32}))
  241. .OUTPUT(var, TensorType({DT_FLOAT16,DT_FLOAT,DT_INT32}))
  242. .ATTR(use_locking, Bool, false)
  243. .OP_END_FACTORY_REG(ScatterMin)
  244. REG_OP(ScatterMax)
  245. .INPUT(var, TensorType({DT_FLOAT16,DT_FLOAT,DT_INT32}))
  246. .INPUT(indices, TensorType({DT_INT32}))
  247. .INPUT(updates, TensorType({DT_FLOAT16,DT_FLOAT,DT_INT32}))
  248. .OUTPUT(var, TensorType({DT_FLOAT16,DT_FLOAT,DT_INT32}))
  249. .ATTR(use_locking, Bool, false)
  250. .OP_END_FACTORY_REG(ScatterMax)
  251. REG_OP(ScatterUpdate)
  252. .INPUT(var, TensorType({DT_FLOAT16,DT_FLOAT,DT_INT8,DT_UINT8}))
  253. .INPUT(indices, TensorType({DT_INT32}))
  254. .INPUT(updates, TensorType({DT_FLOAT16,DT_FLOAT,DT_INT8,DT_UINT8}))
  255. .OUTPUT(var, TensorType({DT_FLOAT16,DT_FLOAT,DT_INT8,DT_UINT8}))
  256. .ATTR(use_locking, Bool, false)
  257. .OP_END_FACTORY_REG(ScatterUpdate)
  258. } // namespace ge
  259. #endif // GE_OP_MATRIX_CALCULATION_OPS_H

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