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

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