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_paddle_utils.py 7.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. import unittest
  2. import paddle
  3. from fastNLP.core.utils.paddle_utils import paddle_to, paddle_move_data_to_device
  4. ############################################################################
  5. #
  6. # 测试仅将单个paddle张量迁移到指定设备
  7. #
  8. ############################################################################
  9. class PaddleToDeviceTestCase(unittest.TestCase):
  10. def test_case(self):
  11. tensor = paddle.rand((4, 5))
  12. res = paddle_to(tensor, "gpu")
  13. self.assertTrue(res.place.is_gpu_place())
  14. self.assertEqual(res.place.gpu_device_id(), 0)
  15. res = paddle_to(tensor, "cpu")
  16. self.assertTrue(res.place.is_cpu_place())
  17. res = paddle_to(tensor, "gpu:2")
  18. self.assertTrue(res.place.is_gpu_place())
  19. self.assertEqual(res.place.gpu_device_id(), 2)
  20. res = paddle_to(tensor, "gpu:1")
  21. self.assertTrue(res.place.is_gpu_place())
  22. self.assertEqual(res.place.gpu_device_id(), 1)
  23. ############################################################################
  24. #
  25. # 测试将参数中包含的所有paddle张量迁移到指定设备
  26. #
  27. ############################################################################
  28. class PaddleMoveDataToDeviceTestCase(unittest.TestCase):
  29. def check_gpu(self, tensor, idx):
  30. """
  31. 检查张量是否在指定的设备上的工具函数
  32. """
  33. self.assertTrue(tensor.place.is_gpu_place())
  34. self.assertEqual(tensor.place.gpu_device_id(), idx)
  35. def check_cpu(self, tensor):
  36. """
  37. 检查张量是否在cpu上的工具函数
  38. """
  39. self.assertTrue(tensor.place.is_cpu_place())
  40. def test_tensor_transfer(self):
  41. """
  42. 测试单个张量的迁移
  43. """
  44. paddle_tensor = paddle.rand((3, 4, 5)).cpu()
  45. res = paddle_move_data_to_device(paddle_tensor, device=None, data_device=None)
  46. self.check_cpu(res)
  47. res = paddle_move_data_to_device(paddle_tensor, device="gpu:0", data_device=None)
  48. self.check_gpu(res, 0)
  49. res = paddle_move_data_to_device(paddle_tensor, device="gpu:1", data_device=None)
  50. self.check_gpu(res, 1)
  51. res = paddle_move_data_to_device(paddle_tensor, device="gpu:0", data_device="cpu")
  52. self.check_gpu(res, 0)
  53. res = paddle_move_data_to_device(paddle_tensor, device=None, data_device="gpu:0")
  54. self.check_gpu(res, 0)
  55. res = paddle_move_data_to_device(paddle_tensor, device=None, data_device="gpu:1")
  56. self.check_gpu(res, 1)
  57. def test_list_transfer(self):
  58. """
  59. 测试张量列表的迁移
  60. """
  61. paddle_list = [paddle.rand((6, 4, 2)) for i in range(10)]
  62. res = paddle_move_data_to_device(paddle_list, device=None, data_device="gpu:1")
  63. self.assertIsInstance(res, list)
  64. for r in res:
  65. self.check_gpu(r, 1)
  66. res = paddle_move_data_to_device(paddle_list, device="cpu", data_device="gpu:1")
  67. self.assertIsInstance(res, list)
  68. for r in res:
  69. self.check_cpu(r)
  70. res = paddle_move_data_to_device(paddle_list, device="gpu:0", data_device=None)
  71. self.assertIsInstance(res, list)
  72. for r in res:
  73. self.check_gpu(r, 0)
  74. res = paddle_move_data_to_device(paddle_list, device="gpu:1", data_device="cpu")
  75. self.assertIsInstance(res, list)
  76. for r in res:
  77. self.check_gpu(r, 1)
  78. def test_tensor_tuple_transfer(self):
  79. """
  80. 测试张量元组的迁移
  81. """
  82. paddle_list = [paddle.rand((6, 4, 2)) for i in range(10)]
  83. paddle_tuple = tuple(paddle_list)
  84. res = paddle_move_data_to_device(paddle_tuple, device=None, data_device="gpu:1")
  85. self.assertIsInstance(res, tuple)
  86. for r in res:
  87. self.check_gpu(r, 1)
  88. res = paddle_move_data_to_device(paddle_tuple, device="cpu", data_device="gpu:1")
  89. self.assertIsInstance(res, tuple)
  90. for r in res:
  91. self.check_cpu(r)
  92. res = paddle_move_data_to_device(paddle_tuple, device="gpu:0", data_device=None)
  93. self.assertIsInstance(res, tuple)
  94. for r in res:
  95. self.check_gpu(r, 0)
  96. res = paddle_move_data_to_device(paddle_tuple, device="gpu:1", data_device="cpu")
  97. self.assertIsInstance(res, tuple)
  98. for r in res:
  99. self.check_gpu(r, 1)
  100. def test_dict_transfer(self):
  101. """
  102. 测试字典结构的迁移
  103. """
  104. paddle_dict = {
  105. "tensor": paddle.rand((3, 4)),
  106. "list": [paddle.rand((6, 4, 2)) for i in range(10)],
  107. "dict":{
  108. "list": [paddle.rand((6, 4, 2)) for i in range(10)],
  109. "tensor": paddle.rand((3, 4))
  110. },
  111. "int": 2,
  112. "string": "test string"
  113. }
  114. res = paddle_move_data_to_device(paddle_dict, device="gpu:0", data_device=None)
  115. self.assertIsInstance(res, dict)
  116. self.check_gpu(res["tensor"], 0)
  117. self.assertIsInstance(res["list"], list)
  118. for t in res["list"]:
  119. self.check_gpu(t, 0)
  120. self.assertIsInstance(res["int"], int)
  121. self.assertIsInstance(res["string"], str)
  122. self.assertIsInstance(res["dict"], dict)
  123. self.assertIsInstance(res["dict"]["list"], list)
  124. for t in res["dict"]["list"]:
  125. self.check_gpu(t, 0)
  126. self.check_gpu(res["dict"]["tensor"], 0)
  127. res = paddle_move_data_to_device(paddle_dict, device="gpu:0", data_device="cpu")
  128. self.assertIsInstance(res, dict)
  129. self.check_gpu(res["tensor"], 0)
  130. self.assertIsInstance(res["list"], list)
  131. for t in res["list"]:
  132. self.check_gpu(t, 0)
  133. self.assertIsInstance(res["int"], int)
  134. self.assertIsInstance(res["string"], str)
  135. self.assertIsInstance(res["dict"], dict)
  136. self.assertIsInstance(res["dict"]["list"], list)
  137. for t in res["dict"]["list"]:
  138. self.check_gpu(t, 0)
  139. self.check_gpu(res["dict"]["tensor"], 0)
  140. res = paddle_move_data_to_device(paddle_dict, device=None, data_device="gpu:1")
  141. self.assertIsInstance(res, dict)
  142. self.check_gpu(res["tensor"], 1)
  143. self.assertIsInstance(res["list"], list)
  144. for t in res["list"]:
  145. self.check_gpu(t, 1)
  146. self.assertIsInstance(res["int"], int)
  147. self.assertIsInstance(res["string"], str)
  148. self.assertIsInstance(res["dict"], dict)
  149. self.assertIsInstance(res["dict"]["list"], list)
  150. for t in res["dict"]["list"]:
  151. self.check_gpu(t, 1)
  152. self.check_gpu(res["dict"]["tensor"], 1)
  153. res = paddle_move_data_to_device(paddle_dict, device="cpu", data_device="gpu:0")
  154. self.assertIsInstance(res, dict)
  155. self.check_cpu(res["tensor"])
  156. self.assertIsInstance(res["list"], list)
  157. for t in res["list"]:
  158. self.check_cpu(t)
  159. self.assertIsInstance(res["int"], int)
  160. self.assertIsInstance(res["string"], str)
  161. self.assertIsInstance(res["dict"], dict)
  162. self.assertIsInstance(res["dict"]["list"], list)
  163. for t in res["dict"]["list"]:
  164. self.check_cpu(t)
  165. self.check_cpu(res["dict"]["tensor"])