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_utils.py 6.2 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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. @require_cuda
  20. def test_tensor_collect_batch():
  21. batch_tensor = TensorBatchCollector(
  22. [4, 8, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CUDA
  23. )
  24. arr = np.ones([8, 8], "int32")
  25. for i in range(4):
  26. batch_tensor.collect(arr)
  27. arr += 1
  28. data = batch_tensor.to_numpy()
  29. assert data.shape[0] == 4
  30. assert data.shape[1] == 8
  31. assert data.shape[2] == 8
  32. for i in range(4):
  33. for j in range(64):
  34. assert data[i][j // 8][j % 8] == i + 1
  35. def test_tensor_collect_batch_cpu():
  36. batch_tensor = TensorBatchCollector(
  37. [4, 8, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CPU
  38. )
  39. arr = np.ones([8, 8], "int32")
  40. for i in range(4):
  41. batch_tensor.collect(arr)
  42. arr += 1
  43. data = batch_tensor.to_numpy()
  44. assert data.shape[0] == 4
  45. assert data.shape[1] == 8
  46. assert data.shape[2] == 8
  47. for i in range(4):
  48. for j in range(64):
  49. assert data[i][j // 8][j % 8] == i + 1
  50. @require_cuda
  51. def test_tensor_collect_batch_by_index():
  52. batch_tensor = TensorBatchCollector(
  53. [4, 8, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CUDA
  54. )
  55. arr = np.ones([8, 8], "int32")
  56. arr += 1 # ==2
  57. batch_tensor.collect_id(arr, 1)
  58. arr -= 1 # ==1
  59. batch_tensor.collect_id(arr, 0)
  60. arr += 2 # ==3
  61. batch_tensor.collect_id(arr, 2)
  62. arr += 1 # ==4
  63. batch_tensor.collect_id(arr, 3)
  64. data = batch_tensor.to_numpy()
  65. assert data.shape[0] == 4
  66. assert data.shape[1] == 8
  67. assert data.shape[2] == 8
  68. for i in range(4):
  69. for j in range(64):
  70. assert data[i][j // 8][j % 8] == i + 1
  71. @require_cuda
  72. def test_tensor_collect_batch_tensor():
  73. batch_tensor = TensorBatchCollector(
  74. [4, 6, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CUDA
  75. )
  76. nparr = np.ones([6, 8], "int32")
  77. tensor = LiteTensor(LiteLayout([6, 8], LiteDataType.LITE_INT))
  78. for i in range(4):
  79. tensor.set_data_by_share(nparr)
  80. batch_tensor.collect(tensor)
  81. nparr += 1
  82. data = batch_tensor.to_numpy()
  83. assert data.shape[0] == 4
  84. assert data.shape[1] == 6
  85. assert data.shape[2] == 8
  86. for i in range(4):
  87. for j in range(48):
  88. assert data[i][j // 8][j % 8] == i + 1
  89. def test_tensor_collect_batch_tensor_cpu():
  90. batch_tensor = TensorBatchCollector(
  91. [4, 6, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CPU
  92. )
  93. nparr = np.ones([6, 8], "int32")
  94. tensor = LiteTensor(LiteLayout([6, 8], LiteDataType.LITE_INT))
  95. for i in range(4):
  96. tensor.set_data_by_share(nparr)
  97. batch_tensor.collect(tensor)
  98. nparr += 1
  99. data = batch_tensor.to_numpy()
  100. assert data.shape[0] == 4
  101. assert data.shape[1] == 6
  102. assert data.shape[2] == 8
  103. for i in range(4):
  104. for j in range(48):
  105. assert data[i][j // 8][j % 8] == i + 1
  106. @require_cuda
  107. def test_tensor_collect_batch_ctypes():
  108. batch_tensor = TensorBatchCollector(
  109. [4, 6, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CUDA
  110. )
  111. nparr = np.ones([6, 8], "int32")
  112. for i in range(4):
  113. in_data = nparr.ctypes.data
  114. batch_tensor.collect_by_ctypes(in_data, nparr.nbytes)
  115. nparr += 1
  116. data = batch_tensor.to_numpy()
  117. assert data.shape[0] == 4
  118. assert data.shape[1] == 6
  119. assert data.shape[2] == 8
  120. for i in range(4):
  121. for j in range(48):
  122. assert data[i][j // 8][j % 8] == i + 1
  123. def test_tensor_collect_batch_ctypes_cpu():
  124. batch_tensor = TensorBatchCollector(
  125. [4, 6, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CPU
  126. )
  127. nparr = np.ones([6, 8], "int32")
  128. for i in range(4):
  129. in_data = nparr.ctypes.data
  130. batch_tensor.collect_by_ctypes(in_data, nparr.nbytes)
  131. nparr += 1
  132. data = batch_tensor.to_numpy()
  133. assert data.shape[0] == 4
  134. assert data.shape[1] == 6
  135. assert data.shape[2] == 8
  136. for i in range(4):
  137. for j in range(48):
  138. assert data[i][j // 8][j % 8] == i + 1
  139. @require_cuda
  140. def test_tensor_collect_batch_device_tensor():
  141. all_tensor = LiteTensor(
  142. LiteLayout([4, 6, 8], dtype=LiteDataType.LITE_INT),
  143. device_type=LiteDeviceType.LITE_CUDA,
  144. )
  145. batch_tensor = TensorBatchCollector([4, 6, 8], tensor=all_tensor)
  146. nparr = np.ones([6, 8], "int32")
  147. tensor = LiteTensor(LiteLayout([6, 8], LiteDataType.LITE_INT))
  148. for i in range(4):
  149. tensor.set_data_by_share(nparr)
  150. batch_tensor.collect(tensor)
  151. nparr += 1
  152. data = batch_tensor.to_numpy()
  153. assert data.shape[0] == 4
  154. assert data.shape[1] == 6
  155. assert data.shape[2] == 8
  156. for i in range(4):
  157. for j in range(48):
  158. assert data[i][j // 8][j % 8] == i + 1
  159. @require_cuda
  160. def test_tensor_collect_batch_device_numpy():
  161. all_tensor = LiteTensor(
  162. LiteLayout([4, 6, 8], dtype=LiteDataType.LITE_INT),
  163. device_type=LiteDeviceType.LITE_CUDA,
  164. )
  165. batch_tensor = TensorBatchCollector([4, 6, 8], tensor=all_tensor)
  166. nparr = np.ones([6, 8], "int32")
  167. for i in range(4):
  168. batch_tensor.collect(nparr)
  169. nparr += 1
  170. data = batch_tensor.to_numpy()
  171. assert data.shape[0] == 4
  172. assert data.shape[1] == 6
  173. assert data.shape[2] == 8
  174. for i in range(4):
  175. for j in range(48):
  176. assert data[i][j // 8][j % 8] == i + 1