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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. # -*- coding: utf-8 -*-
  2. # This file is part of MegEngine, a deep learning framework developed by
  3. # Megvii.
  4. #
  5. # Copyright (c) Copyright (c) 2020-2021 Megvii Inc. All rights reserved.
  6. import functools
  7. import numpy as np
  8. from megenginelite import *
  9. def require_cuda(func):
  10. """a decorator that disables a testcase if cuda is not enabled"""
  11. @functools.wraps(func)
  12. def wrapped(*args, **kwargs):
  13. if LiteGlobal.get_device_count(LiteDeviceType.LITE_CUDA):
  14. return func(*args, **kwargs)
  15. return wrapped
  16. @require_cuda
  17. def test_tensor_collect_batch():
  18. batch_tensor = TensorBatchCollector(
  19. [4, 8, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CUDA
  20. )
  21. arr = np.ones([8, 8], "int32")
  22. for i in range(4):
  23. batch_tensor.collect(arr)
  24. arr += 1
  25. data = batch_tensor.to_numpy()
  26. assert data.shape[0] == 4
  27. assert data.shape[1] == 8
  28. assert data.shape[2] == 8
  29. for i in range(4):
  30. for j in range(64):
  31. assert data[i][j // 8][j % 8] == i + 1
  32. def test_tensor_collect_batch_cpu():
  33. batch_tensor = TensorBatchCollector(
  34. [4, 8, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CPU
  35. )
  36. arr = np.ones([8, 8], "int32")
  37. for i in range(4):
  38. batch_tensor.collect(arr)
  39. arr += 1
  40. data = batch_tensor.to_numpy()
  41. assert data.shape[0] == 4
  42. assert data.shape[1] == 8
  43. assert data.shape[2] == 8
  44. for i in range(4):
  45. for j in range(64):
  46. assert data[i][j // 8][j % 8] == i + 1
  47. @require_cuda
  48. def test_tensor_collect_batch_by_index():
  49. batch_tensor = TensorBatchCollector(
  50. [4, 8, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CUDA
  51. )
  52. arr = np.ones([8, 8], "int32")
  53. arr += 1 # ==2
  54. batch_tensor.collect_id(arr, 1)
  55. arr -= 1 # ==1
  56. batch_tensor.collect_id(arr, 0)
  57. arr += 2 # ==3
  58. batch_tensor.collect_id(arr, 2)
  59. arr += 1 # ==4
  60. batch_tensor.collect_id(arr, 3)
  61. data = batch_tensor.to_numpy()
  62. assert data.shape[0] == 4
  63. assert data.shape[1] == 8
  64. assert data.shape[2] == 8
  65. for i in range(4):
  66. for j in range(64):
  67. assert data[i][j // 8][j % 8] == i + 1
  68. @require_cuda
  69. def test_tensor_collect_batch_tensor():
  70. batch_tensor = TensorBatchCollector(
  71. [4, 6, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CUDA
  72. )
  73. nparr = np.ones([6, 8], "int32")
  74. tensor = LiteTensor(LiteLayout([6, 8], LiteDataType.LITE_INT))
  75. for i in range(4):
  76. tensor.set_data_by_share(nparr)
  77. batch_tensor.collect(tensor)
  78. nparr += 1
  79. data = batch_tensor.to_numpy()
  80. assert data.shape[0] == 4
  81. assert data.shape[1] == 6
  82. assert data.shape[2] == 8
  83. for i in range(4):
  84. for j in range(48):
  85. assert data[i][j // 8][j % 8] == i + 1
  86. def test_tensor_collect_batch_tensor_cpu():
  87. batch_tensor = TensorBatchCollector(
  88. [4, 6, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CPU
  89. )
  90. nparr = np.ones([6, 8], "int32")
  91. tensor = LiteTensor(LiteLayout([6, 8], LiteDataType.LITE_INT))
  92. for i in range(4):
  93. tensor.set_data_by_share(nparr)
  94. batch_tensor.collect(tensor)
  95. nparr += 1
  96. data = batch_tensor.to_numpy()
  97. assert data.shape[0] == 4
  98. assert data.shape[1] == 6
  99. assert data.shape[2] == 8
  100. for i in range(4):
  101. for j in range(48):
  102. assert data[i][j // 8][j % 8] == i + 1
  103. @require_cuda
  104. def test_tensor_collect_batch_ctypes():
  105. batch_tensor = TensorBatchCollector(
  106. [4, 6, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CUDA
  107. )
  108. nparr = np.ones([6, 8], "int32")
  109. for i in range(4):
  110. in_data = nparr.ctypes.data
  111. batch_tensor.collect_by_ctypes(in_data, nparr.nbytes)
  112. nparr += 1
  113. data = batch_tensor.to_numpy()
  114. assert data.shape[0] == 4
  115. assert data.shape[1] == 6
  116. assert data.shape[2] == 8
  117. for i in range(4):
  118. for j in range(48):
  119. assert data[i][j // 8][j % 8] == i + 1
  120. def test_tensor_collect_batch_ctypes_cpu():
  121. batch_tensor = TensorBatchCollector(
  122. [4, 6, 8], dtype=LiteDataType.LITE_INT, device_type=LiteDeviceType.LITE_CPU
  123. )
  124. nparr = np.ones([6, 8], "int32")
  125. for i in range(4):
  126. in_data = nparr.ctypes.data
  127. batch_tensor.collect_by_ctypes(in_data, nparr.nbytes)
  128. nparr += 1
  129. data = batch_tensor.to_numpy()
  130. assert data.shape[0] == 4
  131. assert data.shape[1] == 6
  132. assert data.shape[2] == 8
  133. for i in range(4):
  134. for j in range(48):
  135. assert data[i][j // 8][j % 8] == i + 1
  136. @require_cuda
  137. def test_tensor_collect_batch_device_tensor():
  138. all_tensor = LiteTensor(
  139. LiteLayout([4, 6, 8], dtype=LiteDataType.LITE_INT),
  140. device_type=LiteDeviceType.LITE_CUDA,
  141. )
  142. batch_tensor = TensorBatchCollector([4, 6, 8], tensor=all_tensor)
  143. nparr = np.ones([6, 8], "int32")
  144. tensor = LiteTensor(LiteLayout([6, 8], LiteDataType.LITE_INT))
  145. for i in range(4):
  146. tensor.set_data_by_share(nparr)
  147. batch_tensor.collect(tensor)
  148. nparr += 1
  149. data = batch_tensor.to_numpy()
  150. assert data.shape[0] == 4
  151. assert data.shape[1] == 6
  152. assert data.shape[2] == 8
  153. for i in range(4):
  154. for j in range(48):
  155. assert data[i][j // 8][j % 8] == i + 1
  156. @require_cuda
  157. def test_tensor_collect_batch_device_numpy():
  158. all_tensor = LiteTensor(
  159. LiteLayout([4, 6, 8], dtype=LiteDataType.LITE_INT),
  160. device_type=LiteDeviceType.LITE_CUDA,
  161. )
  162. batch_tensor = TensorBatchCollector([4, 6, 8], tensor=all_tensor)
  163. nparr = np.ones([6, 8], "int32")
  164. for i in range(4):
  165. batch_tensor.collect(nparr)
  166. nparr += 1
  167. data = batch_tensor.to_numpy()
  168. assert data.shape[0] == 4
  169. assert data.shape[1] == 6
  170. assert data.shape[2] == 8
  171. for i in range(4):
  172. for j in range(48):
  173. assert data[i][j // 8][j % 8] == i + 1

MegEngine 安装包中集成了使用 GPU 运行代码所需的 CUDA 环境,不用区分 CPU 和 GPU 版。 如果想要运行 GPU 程序,请确保机器本身配有 GPU 硬件设备并安装好驱动。 如果你想体验在云端 GPU 算力平台进行深度学习开发的感觉,欢迎访问 MegStudio 平台