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.

test_tensor.py 10 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. # -*- coding: utf-8 -*-
  2. # MegEngine is Licensed under the Apache License, Version 2.0 (the "License")
  3. #
  4. # Copyright (c) 2014-2021 Megvii Inc. All rights reserved.
  5. #
  6. # Unless required by applicable law or agreed to in writing,
  7. # software distributed under the License is distributed on an
  8. # "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9. import functools
  10. import numpy as np
  11. from megenginelite import *
  12. def require_cuda(func):
  13. """a decorator that disables a testcase if cuda is not enabled"""
  14. @functools.wraps(func)
  15. def wrapped(*args, **kwargs):
  16. if LiteGlobal.get_device_count(LiteDeviceType.LITE_CUDA):
  17. return func(*args, **kwargs)
  18. return wrapped
  19. def test_tensor_make():
  20. empty_layout = LiteLayout()
  21. assert empty_layout.ndim == 0
  22. assert empty_layout.data_type == int(LiteDataType.LITE_FLOAT)
  23. empty_tensor = LiteTensor()
  24. assert empty_tensor.layout.ndim == empty_layout.ndim
  25. assert empty_tensor.layout.data_type == empty_layout.data_type
  26. layout = LiteLayout([4, 16])
  27. layout = LiteLayout(dtype="float32")
  28. layout = LiteLayout([4, 16], "float32")
  29. layout = LiteLayout([4, 16], "float16")
  30. layout = LiteLayout([4, 16], np.float32)
  31. layout = LiteLayout([4, 16], np.int8)
  32. layout = LiteLayout([4, 16], LiteDataType.LITE_FLOAT)
  33. tensor = LiteTensor(layout)
  34. tensor = LiteTensor(layout, LiteDeviceType.LITE_CPU)
  35. assert tensor.layout == layout
  36. assert tensor.device_type == LiteDeviceType.LITE_CPU
  37. assert tensor.is_continue == True
  38. assert tensor.is_pinned_host == False
  39. assert tensor.nbytes == 4 * 16 * 4
  40. assert tensor.device_id == 0
  41. tensor = LiteTensor(layout, device_id=1)
  42. assert tensor.device_id == 1
  43. tensor.layout = [8, 14]
  44. assert tensor.layout.shapes[0] == 8
  45. assert tensor.layout.shapes[1] == 14
  46. assert tensor.layout.data_type == LiteDataType.LITE_FLOAT
  47. tensor_new = LiteTensor(shapes=[1, 3, 224], dtype=np.int8)
  48. assert tensor_new.layout.shapes[1] == 3
  49. assert tensor_new.layout.shapes[2] == 224
  50. assert tensor_new.layout.data_type == LiteDataType.LITE_INT8
  51. def test_tensor_set_data():
  52. layout = LiteLayout([2, 16], "int8")
  53. tensor = LiteTensor(layout)
  54. assert tensor.nbytes == 2 * 16
  55. data = [i for i in range(32)]
  56. tensor.set_data_by_copy(data)
  57. real_data = tensor.to_numpy()
  58. for i in range(32):
  59. assert real_data[i // 16][i % 16] == i
  60. arr = np.ones([2, 16], "int8")
  61. tensor.set_data_by_copy(arr)
  62. real_data = tensor.to_numpy()
  63. for i in range(32):
  64. assert real_data[i // 16][i % 16] == 1
  65. for i in range(32):
  66. arr[i // 16][i % 16] = i
  67. tensor.set_data_by_share(arr)
  68. real_data = tensor.to_numpy()
  69. for i in range(32):
  70. assert real_data[i // 16][i % 16] == i
  71. arr[0][8] = 100
  72. arr[1][3] = 20
  73. real_data = tensor.to_numpy()
  74. assert real_data[0][8] == 100
  75. assert real_data[1][3] == 20
  76. def test_fill_zero():
  77. layout = LiteLayout([4, 8], "int16")
  78. tensor1 = LiteTensor(layout)
  79. assert tensor1.nbytes == 4 * 8 * 2
  80. tensor1.set_data_by_copy([i for i in range(32)])
  81. real_data = tensor1.to_numpy()
  82. for i in range(32):
  83. assert real_data[i // 8][i % 8] == i
  84. tensor1.fill_zero()
  85. real_data = tensor1.to_numpy()
  86. for i in range(32):
  87. assert real_data[i // 8][i % 8] == 0
  88. def test_copy_from():
  89. layout = LiteLayout([4, 8], "int16")
  90. tensor1 = LiteTensor(layout)
  91. tensor2 = LiteTensor(layout)
  92. assert tensor1.nbytes == 4 * 8 * 2
  93. assert tensor2.nbytes == 4 * 8 * 2
  94. tensor1.set_data_by_copy([i for i in range(32)])
  95. tensor2.copy_from(tensor1)
  96. real_data = tensor2.to_numpy()
  97. for i in range(32):
  98. assert real_data[i // 8][i % 8] == i
  99. tensor1.set_data_by_copy([i + 5 for i in range(32)])
  100. tensor2.copy_from(tensor1)
  101. real_data = tensor2.to_numpy()
  102. for i in range(32):
  103. assert real_data[i // 8][i % 8] == i + 5
  104. def test_reshape():
  105. layout = LiteLayout([4, 8], "int16")
  106. tensor1 = LiteTensor(layout)
  107. assert tensor1.nbytes == 4 * 8 * 2
  108. tensor1.set_data_by_copy([i for i in range(32)])
  109. real_data = tensor1.to_numpy()
  110. for i in range(32):
  111. assert real_data[i // 8][i % 8] == i
  112. tensor1.reshape([8, 4])
  113. real_data = tensor1.to_numpy()
  114. for i in range(32):
  115. assert real_data[i // 4][i % 4] == i
  116. def test_slice():
  117. layout = LiteLayout([4, 8], "int32")
  118. tensor1 = LiteTensor(layout)
  119. assert tensor1.nbytes == 4 * 8 * 4
  120. tensor1.set_data_by_copy([i for i in range(32)])
  121. real_data_org = tensor1.to_numpy()
  122. for i in range(32):
  123. assert real_data_org[i // 8][i % 8] == i
  124. tensor2 = tensor1.slice([1, 4], [3, 8])
  125. assert tensor2.layout.shapes[0] == 2
  126. assert tensor2.layout.shapes[1] == 4
  127. assert tensor2.is_continue == False
  128. real_data = tensor2.to_numpy()
  129. for i in range(8):
  130. row = i // 4
  131. col = i % 4
  132. assert real_data[row][col] == real_data_org[row + 1][col + 4]
  133. def test_tensor_share_memory():
  134. layout = LiteLayout([4, 8], "int16")
  135. tensor1 = LiteTensor(layout)
  136. tensor2 = LiteTensor(layout)
  137. assert tensor1.nbytes == 4 * 8 * 2
  138. assert tensor2.nbytes == 4 * 8 * 2
  139. tensor1.set_data_by_copy([i for i in range(32)])
  140. tensor2.share_memory_with(tensor1)
  141. real_data = tensor2.to_numpy()
  142. for i in range(32):
  143. assert real_data[i // 8][i % 8] == i
  144. tensor1.set_data_by_copy([i + 5 for i in range(32)])
  145. real_data = tensor2.to_numpy()
  146. for i in range(32):
  147. assert real_data[i // 8][i % 8] == i + 5
  148. def test_tensor_share_ctype_memory():
  149. layout = LiteLayout([4, 8], "int16")
  150. tensor1 = LiteTensor(layout)
  151. assert tensor1.nbytes == 4 * 8 * 2
  152. arr = np.ones([4, 8], "int16")
  153. for i in range(32):
  154. arr[i // 8][i % 8] = i
  155. tensor1.set_data_by_share(arr.ctypes.data, 4 * 8 * 2)
  156. real_data = tensor1.to_numpy()
  157. for i in range(32):
  158. assert real_data[i // 8][i % 8] == i
  159. @require_cuda
  160. def test_tensor_share_ctype_memory_device():
  161. layout = LiteLayout([4, 8], "int16")
  162. tensor_cpu = LiteTensor(
  163. layout=layout, device_type=LiteDeviceType.LITE_CUDA, is_pinned_host=True
  164. )
  165. tensor_cuda1 = LiteTensor(layout=layout, device_type=LiteDeviceType.LITE_CUDA)
  166. tensor_cuda2 = LiteTensor(layout=layout, device_type=LiteDeviceType.LITE_CUDA)
  167. assert tensor_cpu.nbytes == 4 * 8 * 2
  168. assert tensor_cuda1.nbytes == 4 * 8 * 2
  169. assert tensor_cuda2.nbytes == 4 * 8 * 2
  170. arr = np.ones([4, 8], "int16")
  171. for i in range(32):
  172. arr[i // 8][i % 8] = i
  173. tensor_cpu.set_data_by_share(arr.ctypes.data, 4 * 8 * 2)
  174. tensor_cuda1.copy_from(tensor_cpu)
  175. device_mem = tensor_cuda1.get_ctypes_memory()
  176. tensor_cuda2.set_data_by_share(device_mem, tensor_cuda1.nbytes)
  177. real_data1 = tensor_cuda1.to_numpy()
  178. real_data2 = tensor_cuda2.to_numpy()
  179. for i in range(32):
  180. assert real_data1[i // 8][i % 8] == i
  181. assert real_data2[i // 8][i % 8] == i
  182. def test_tensor_share_memory_with():
  183. layout = LiteLayout([4, 32], "int16")
  184. tensor = LiteTensor(layout)
  185. assert tensor.nbytes == 4 * 32 * 2
  186. arr = np.ones([4, 32], "int16")
  187. for i in range(128):
  188. arr[i // 32][i % 32] = i
  189. tensor.set_data_by_share(arr)
  190. real_data = tensor.to_numpy()
  191. for i in range(128):
  192. assert real_data[i // 32][i % 32] == i
  193. tensor2 = LiteTensor(layout)
  194. tensor2.share_memory_with(tensor)
  195. real_data = tensor.to_numpy()
  196. real_data2 = tensor2.to_numpy()
  197. for i in range(128):
  198. assert real_data[i // 32][i % 32] == i
  199. assert real_data2[i // 32][i % 32] == i
  200. arr[1][18] = 5
  201. arr[3][7] = 345
  202. real_data = tensor2.to_numpy()
  203. assert real_data[1][18] == 5
  204. assert real_data[3][7] == 345
  205. def test_empty_tensor():
  206. empty_tensor = LiteTensor()
  207. assert empty_tensor.layout.ndim == 0
  208. assert empty_tensor.layout.data_type == int(LiteDataType.LITE_FLOAT)
  209. # check empty tensor to numpy
  210. data = empty_tensor.to_numpy()
  211. def test_tensor_by_set_copy_with_new_layout():
  212. layout = LiteLayout([4, 32], "int16")
  213. tensor = LiteTensor(layout)
  214. assert tensor.nbytes == 4 * 32 * 2
  215. arr = np.ones([8, 64], "int32")
  216. tensor.set_data_by_copy(arr)
  217. new_layout = tensor.layout
  218. assert new_layout.ndim == 2
  219. assert new_layout.shapes[0] == 8
  220. assert new_layout.shapes[1] == 64
  221. tensor = LiteTensor(layout)
  222. tensor.set_data_by_share(arr)
  223. new_layout = tensor.layout
  224. assert new_layout.ndim == 2
  225. assert new_layout.shapes[0] == 8
  226. assert new_layout.shapes[1] == 64
  227. def test_tensor_concat():
  228. layout = LiteLayout([4, 32], "int16")
  229. tensors = []
  230. arr = np.ones([4, 32], "int16")
  231. for j in range(4):
  232. for i in range(128):
  233. arr[i // 32][i % 32] = j
  234. tensor = LiteTensor(layout)
  235. tensor.set_data_by_copy(arr)
  236. tensors.append(tensor)
  237. new_tensor = LiteTensorConcat(tensors, 0)
  238. real_data = new_tensor.to_numpy()
  239. for j in range(4):
  240. for i in range(128):
  241. index = j * 128 + i
  242. assert real_data[index // 32][index % 32] == j
  243. def test_tensor_get_memory_by_share():
  244. layout = LiteLayout([4, 32], "int16")
  245. tensor = LiteTensor(layout)
  246. assert tensor.nbytes == 4 * 32 * 2
  247. arr = np.ones([4, 32], "int16")
  248. for i in range(128):
  249. arr[i // 32][i % 32] = i
  250. tensor.set_data_by_copy(arr)
  251. test_data = tensor.get_data_by_share()
  252. real_data = tensor.to_numpy()
  253. for i in range(128):
  254. assert real_data[i // 32][i % 32] == test_data[i // 32][i % 32]
  255. arr[1][18] = 5
  256. arr[3][7] = 345
  257. tensor.set_data_by_copy(arr)
  258. assert test_data[1][18] == 5
  259. assert test_data[3][7] == 345
  260. @require_cuda
  261. def test_tensor_set_data_device():
  262. layout = LiteLayout([2, 16], "int8")
  263. tensor = LiteTensor(layout, device_type=LiteDeviceType.LITE_CUDA)
  264. assert tensor.nbytes == 2 * 16
  265. data = [i for i in range(32)]
  266. tensor.set_data_by_copy(data)
  267. real_data = tensor.to_numpy()
  268. for i in range(32):
  269. assert real_data[i // 16][i % 16] == i
  270. arr = np.ones([2, 16], "int8")
  271. tensor.set_data_by_copy(arr)
  272. real_data = tensor.to_numpy()
  273. for i in range(32):
  274. assert real_data[i // 16][i % 16] == 1
  275. tensor.set_data_by_copy(list(range(32)))
  276. real_data = tensor.to_numpy()
  277. for i in range(32):
  278. assert real_data[i // 16][i % 16] == i