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.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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 os
  11. import numpy as np
  12. from megenginelite import *
  13. def require_cuda(func):
  14. """a decorator that disables a testcase if cuda is not enabled"""
  15. @functools.wraps(func)
  16. def wrapped(*args, **kwargs):
  17. if LiteGlobal.get_device_count(LiteDeviceType.LITE_CUDA):
  18. return func(*args, **kwargs)
  19. return wrapped
  20. @require_cuda
  21. def test_tensor_collect_batch():
  22. batch_tensor = TensorBatchCollector(
  23. [4, 8, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CUDA
  24. )
  25. arr = np.ones([8, 8], "int32")
  26. for i in range(4):
  27. batch_tensor.collect(arr)
  28. arr += 1
  29. data = batch_tensor.to_numpy()
  30. assert data.shape[0] == 4
  31. assert data.shape[1] == 8
  32. assert data.shape[2] == 8
  33. for i in range(4):
  34. for j in range(64):
  35. assert data[i][j // 8][j % 8] == i + 1
  36. def test_tensor_collect_batch_cpu():
  37. batch_tensor = TensorBatchCollector(
  38. [4, 8, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CPU
  39. )
  40. arr = np.ones([8, 8], "int32")
  41. for i in range(4):
  42. batch_tensor.collect(arr)
  43. arr += 1
  44. data = batch_tensor.to_numpy()
  45. assert data.shape[0] == 4
  46. assert data.shape[1] == 8
  47. assert data.shape[2] == 8
  48. for i in range(4):
  49. for j in range(64):
  50. assert data[i][j // 8][j % 8] == i + 1
  51. @require_cuda
  52. def test_tensor_collect_batch_by_index():
  53. batch_tensor = TensorBatchCollector(
  54. [4, 8, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CUDA
  55. )
  56. arr = np.ones([8, 8], "int32")
  57. arr += 1 # ==2
  58. batch_tensor.collect_id(arr, 1)
  59. arr -= 1 # ==1
  60. batch_tensor.collect_id(arr, 0)
  61. arr += 2 # ==3
  62. batch_tensor.collect_id(arr, 2)
  63. arr += 1 # ==4
  64. batch_tensor.collect_id(arr, 3)
  65. data = batch_tensor.to_numpy()
  66. assert data.shape[0] == 4
  67. assert data.shape[1] == 8
  68. assert data.shape[2] == 8
  69. for i in range(4):
  70. for j in range(64):
  71. assert data[i][j // 8][j % 8] == i + 1
  72. @require_cuda
  73. def test_tensor_collect_batch_tensor():
  74. batch_tensor = TensorBatchCollector(
  75. [4, 6, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CUDA
  76. )
  77. nparr = np.ones([6, 8], "int32")
  78. tensor = LiteTensor(LiteLayout([6, 8], LiteDataType.LITE_INT))
  79. for i in range(4):
  80. tensor.set_data_by_share(nparr)
  81. batch_tensor.collect(tensor)
  82. nparr += 1
  83. data = batch_tensor.to_numpy()
  84. assert data.shape[0] == 4
  85. assert data.shape[1] == 6
  86. assert data.shape[2] == 8
  87. for i in range(4):
  88. for j in range(48):
  89. assert data[i][j // 8][j % 8] == i + 1
  90. def test_tensor_collect_batch_tensor_cpu():
  91. batch_tensor = TensorBatchCollector(
  92. [4, 6, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CPU
  93. )
  94. nparr = np.ones([6, 8], "int32")
  95. tensor = LiteTensor(LiteLayout([6, 8], LiteDataType.LITE_INT))
  96. for i in range(4):
  97. tensor.set_data_by_share(nparr)
  98. batch_tensor.collect(tensor)
  99. nparr += 1
  100. data = batch_tensor.to_numpy()
  101. assert data.shape[0] == 4
  102. assert data.shape[1] == 6
  103. assert data.shape[2] == 8
  104. for i in range(4):
  105. for j in range(48):
  106. assert data[i][j // 8][j % 8] == i + 1
  107. @require_cuda
  108. def test_tensor_collect_batch_ctypes():
  109. batch_tensor = TensorBatchCollector(
  110. [4, 6, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CUDA
  111. )
  112. nparr = np.ones([6, 8], "int32")
  113. for i in range(4):
  114. in_data = nparr.ctypes.data
  115. batch_tensor.collect_by_ctypes(in_data, nparr.nbytes)
  116. nparr += 1
  117. data = batch_tensor.to_numpy()
  118. assert data.shape[0] == 4
  119. assert data.shape[1] == 6
  120. assert data.shape[2] == 8
  121. for i in range(4):
  122. for j in range(48):
  123. assert data[i][j // 8][j % 8] == i + 1
  124. def test_tensor_collect_batch_ctypes_cpu():
  125. batch_tensor = TensorBatchCollector(
  126. [4, 6, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CPU
  127. )
  128. nparr = np.ones([6, 8], "int32")
  129. for i in range(4):
  130. in_data = nparr.ctypes.data
  131. batch_tensor.collect_by_ctypes(in_data, nparr.nbytes)
  132. nparr += 1
  133. data = batch_tensor.to_numpy()
  134. assert data.shape[0] == 4
  135. assert data.shape[1] == 6
  136. assert data.shape[2] == 8
  137. for i in range(4):
  138. for j in range(48):
  139. assert data[i][j // 8][j % 8] == i + 1
  140. @require_cuda
  141. def test_tensor_collect_batch_device_tensor():
  142. all_tensor = LiteTensor(
  143. LiteLayout([4, 6, 8], dtype=LiteDataType.LITE_INT),
  144. device_type=LiteDeviceType.LITE_CUDA,
  145. )
  146. batch_tensor = TensorBatchCollector([4, 6, 8], tensor=all_tensor)
  147. nparr = np.ones([6, 8], "int32")
  148. tensor = LiteTensor(LiteLayout([6, 8], LiteDataType.LITE_INT))
  149. for i in range(4):
  150. tensor.set_data_by_share(nparr)
  151. batch_tensor.collect(tensor)
  152. nparr += 1
  153. data = batch_tensor.to_numpy()
  154. assert data.shape[0] == 4
  155. assert data.shape[1] == 6
  156. assert data.shape[2] == 8
  157. for i in range(4):
  158. for j in range(48):
  159. assert data[i][j // 8][j % 8] == i + 1
  160. @require_cuda
  161. def test_tensor_collect_batch_device_numpy():
  162. all_tensor = LiteTensor(
  163. LiteLayout([4, 6, 8], dtype=LiteDataType.LITE_INT),
  164. device_type=LiteDeviceType.LITE_CUDA,
  165. )
  166. batch_tensor = TensorBatchCollector([4, 6, 8], tensor=all_tensor)
  167. nparr = np.ones([6, 8], "int32")
  168. for i in range(4):
  169. batch_tensor.collect(nparr)
  170. nparr += 1
  171. data = batch_tensor.to_numpy()
  172. assert data.shape[0] == 4
  173. assert data.shape[1] == 6
  174. assert data.shape[2] == 8
  175. for i in range(4):
  176. for j in range(48):
  177. assert data[i][j // 8][j % 8] == i + 1
  178. def test_get_model_io_ahead():
  179. source_dir = os.getenv("LITE_TEST_RESOURCE")
  180. model_path = os.path.join(source_dir, "shufflenet.mge")
  181. ios = get_model_io_info(model_path)
  182. assert len(ios.inputs) == 1
  183. assert ios.inputs[0].name == "data"
  184. assert ios.inputs[0].config_layout.shapes[1] == 3
  185. assert ios.inputs[0].config_layout.shapes[2] == 224
  186. assert ios.inputs[0].config_layout.shapes[3] == 224
  187. assert len(ios.outputs) == 1
  188. assert ios.outputs[0].name == "TRUE_DIV(EXP[12065],reduce0[12067])[12077]"
  189. assert ios.outputs[0].config_layout.shapes[0] == 1
  190. assert ios.outputs[0].config_layout.shapes[1] == 1000