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 11 kB

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