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_network.py 13 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  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 os
  7. import unittest
  8. import numpy as np
  9. from megenginelite import *
  10. set_log_level(2)
  11. def test_version():
  12. print("Lite verson: {}".format(version))
  13. def test_network_io():
  14. input_io1 = LiteIO("data1", is_host=False, io_type=LiteIOType.LITE_IO_VALUE)
  15. input_io2 = LiteIO(
  16. "data2",
  17. is_host=True,
  18. io_type=LiteIOType.LITE_IO_SHAPE,
  19. layout=LiteLayout([2, 4, 4]),
  20. )
  21. io = LiteNetworkIO()
  22. io.add_input(input_io1)
  23. io.add_input(input_io2)
  24. output_io1 = LiteIO("out1", is_host=False)
  25. output_io2 = LiteIO("out2", is_host=True, layout=LiteLayout([1, 1000]))
  26. io.add_output(output_io1)
  27. io.add_output(output_io2)
  28. assert len(io.inputs) == 2
  29. assert len(io.outputs) == 2
  30. assert io.inputs[0] == input_io1
  31. assert io.outputs[0] == output_io1
  32. c_io = io._create_network_io()
  33. assert c_io.input_size == 2
  34. assert c_io.output_size == 2
  35. class TestShuffleNet(unittest.TestCase):
  36. source_dir = os.getenv("LITE_TEST_RESOUCE")
  37. input_data_path = os.path.join(source_dir, "input_data.npy")
  38. correct_data_path = os.path.join(source_dir, "output_data.npy")
  39. model_path = os.path.join(source_dir, "shufflenet.mge")
  40. correct_data = np.load(correct_data_path).flatten()
  41. input_data = np.load(input_data_path)
  42. def check_correct(self, out_data, error=1e-4):
  43. out_data = out_data.flatten()
  44. assert np.isfinite(out_data.sum())
  45. assert self.correct_data.size == out_data.size
  46. for i in range(out_data.size):
  47. assert abs(out_data[i] - self.correct_data[i]) < error
  48. def do_forward(self, network, times=3):
  49. input_name = network.get_input_name(0)
  50. input_tensor = network.get_io_tensor(input_name)
  51. output_name = network.get_output_name(0)
  52. output_tensor = network.get_io_tensor(output_name)
  53. input_tensor.set_data_by_copy(self.input_data)
  54. for i in range(times):
  55. network.forward()
  56. network.wait()
  57. output_data = output_tensor.to_numpy()
  58. self.check_correct(output_data)
  59. class TestNetwork(TestShuffleNet):
  60. def test_decryption(self):
  61. model_path = os.path.join(self.source_dir, "shufflenet_crypt_aes.mge")
  62. config = LiteConfig()
  63. config.bare_model_cryption_name = "AES_default".encode("utf-8")
  64. network = LiteNetwork(config)
  65. network.load(model_path)
  66. self.do_forward(network)
  67. def test_pack_model(self):
  68. model_path = os.path.join(self.source_dir, "test_packed_model_rc4.lite")
  69. network = LiteNetwork()
  70. network.load(model_path)
  71. self.do_forward(network)
  72. def test_network_basic(self):
  73. network = LiteNetwork()
  74. network.load(self.model_path)
  75. input_name = network.get_input_name(0)
  76. input_tensor = network.get_io_tensor(input_name)
  77. output_name = network.get_output_name(0)
  78. output_tensor = network.get_io_tensor(output_name)
  79. assert input_tensor.layout.shapes[0] == 1
  80. assert input_tensor.layout.shapes[1] == 3
  81. assert input_tensor.layout.shapes[2] == 224
  82. assert input_tensor.layout.shapes[3] == 224
  83. assert input_tensor.layout.data_type == LiteDataType.LITE_FLOAT
  84. assert input_tensor.layout.ndim == 4
  85. self.do_forward(network)
  86. def test_network_shared_data(self):
  87. network = LiteNetwork()
  88. network.load(self.model_path)
  89. input_name = network.get_input_name(0)
  90. input_tensor = network.get_io_tensor(input_name)
  91. output_name = network.get_output_name(0)
  92. output_tensor = network.get_io_tensor(output_name)
  93. input_tensor.set_data_by_share(self.input_data)
  94. for i in range(3):
  95. network.forward()
  96. network.wait()
  97. output_data = output_tensor.to_numpy()
  98. self.check_correct(output_data)
  99. def test_network_get_name(self):
  100. network = LiteNetwork()
  101. network.load(self.model_path)
  102. input_names = network.get_all_input_name()
  103. assert input_names[0] == "data"
  104. output_names = network.get_all_output_name()
  105. assert output_names[0] == network.get_output_name(0)
  106. self.do_forward(network)
  107. def test_network_set_device_id(self):
  108. network = LiteNetwork()
  109. assert network.device_id == 0
  110. network.device_id = 1
  111. network.load(self.model_path)
  112. assert network.device_id == 1
  113. with self.assertRaises(RuntimeError):
  114. network.device_id = 1
  115. self.do_forward(network)
  116. def test_network_set_stream_id(self):
  117. network = LiteNetwork()
  118. assert network.stream_id == 0
  119. network.stream_id = 1
  120. network.load(self.model_path)
  121. assert network.stream_id == 1
  122. with self.assertRaises(RuntimeError):
  123. network.stream_id = 1
  124. self.do_forward(network)
  125. def test_network_set_thread_number(self):
  126. network = LiteNetwork()
  127. assert network.threads_number == 1
  128. network.threads_number = 2
  129. network.load(self.model_path)
  130. assert network.threads_number == 2
  131. with self.assertRaises(RuntimeError):
  132. network.threads_number = 2
  133. self.do_forward(network)
  134. def test_network_cpu_inplace(self):
  135. network = LiteNetwork()
  136. assert network.is_cpu_inplace_mode() == False
  137. network.enable_cpu_inplace_mode()
  138. network.load(self.model_path)
  139. assert network.is_cpu_inplace_mode() == True
  140. with self.assertRaises(RuntimeError):
  141. network.enable_cpu_inplace_mode()
  142. self.do_forward(network)
  143. def test_network_option(self):
  144. option = LiteOptions()
  145. option.weight_preprocess = 1
  146. option.var_sanity_check_first_run = 0
  147. config = LiteConfig(option=option)
  148. network = LiteNetwork(config=config)
  149. network.load(self.model_path)
  150. self.do_forward(network)
  151. def test_network_reset_io(self):
  152. option = LiteOptions()
  153. option.var_sanity_check_first_run = 0
  154. config = LiteConfig(option=option)
  155. input_io = LiteIO("data")
  156. ios = LiteNetworkIO()
  157. ios.add_input(input_io)
  158. network = LiteNetwork(config=config, io=ios)
  159. network.load(self.model_path)
  160. input_tensor = network.get_io_tensor("data")
  161. assert input_tensor.device_type == LiteDeviceType.LITE_CPU
  162. self.do_forward(network)
  163. def test_network_by_share(self):
  164. network = LiteNetwork()
  165. network.load(self.model_path)
  166. input_name = network.get_input_name(0)
  167. input_tensor = network.get_io_tensor(input_name)
  168. output_name = network.get_output_name(0)
  169. output_tensor = network.get_io_tensor(output_name)
  170. assert input_tensor.device_type == LiteDeviceType.LITE_CPU
  171. layout = LiteLayout(self.input_data.shape, self.input_data.dtype)
  172. tensor_tmp = LiteTensor(layout=layout)
  173. tensor_tmp.set_data_by_share(self.input_data)
  174. input_tensor.share_memory_with(tensor_tmp)
  175. for i in range(3):
  176. network.forward()
  177. network.wait()
  178. output_data = output_tensor.to_numpy()
  179. self.check_correct(output_data)
  180. def test_network_share_weights(self):
  181. option = LiteOptions()
  182. option.var_sanity_check_first_run = 0
  183. config = LiteConfig(option=option)
  184. src_network = LiteNetwork(config=config)
  185. src_network.load(self.model_path)
  186. new_network = LiteNetwork()
  187. new_network.enable_cpu_inplace_mode()
  188. new_network.share_weights_with(src_network)
  189. self.do_forward(src_network)
  190. self.do_forward(new_network)
  191. def test_network_share_runtime_memory(self):
  192. option = LiteOptions()
  193. option.var_sanity_check_first_run = 0
  194. config = LiteConfig(option=option)
  195. src_network = LiteNetwork(config=config)
  196. src_network.load(self.model_path)
  197. new_network = LiteNetwork()
  198. new_network.enable_cpu_inplace_mode()
  199. new_network.share_runtime_memroy(src_network)
  200. new_network.load(self.model_path)
  201. self.do_forward(src_network)
  202. self.do_forward(new_network)
  203. # def test_network_async(self):
  204. # count = 0
  205. # finished = False
  206. #
  207. # def async_callback():
  208. # nonlocal finished
  209. # finished = True
  210. # return 0
  211. #
  212. # option = LiteOptions()
  213. # option.var_sanity_check_first_run = 0
  214. # config = LiteConfig(option=option)
  215. #
  216. # network = LiteNetwork(config=config)
  217. # network.load(self.model_path)
  218. #
  219. # network.async_with_callback(async_callback)
  220. #
  221. # input_tensor = network.get_io_tensor(network.get_input_name(0))
  222. # output_tensor = network.get_io_tensor(network.get_output_name(0))
  223. #
  224. # input_tensor.set_data_by_share(self.input_data)
  225. # network.forward()
  226. #
  227. # while not finished:
  228. # count += 1
  229. #
  230. # assert count > 0
  231. # output_data = output_tensor.to_numpy()
  232. # self.check_correct(output_data)
  233. #
  234. # def test_network_start_callback(self):
  235. # network = LiteNetwork()
  236. # network.load(self.model_path)
  237. # start_checked = False
  238. #
  239. # @start_finish_callback
  240. # def start_callback(ios):
  241. # nonlocal start_checked
  242. # start_checked = True
  243. # assert len(ios) == 1
  244. # for key in ios:
  245. # io = key
  246. # data = ios[key].to_numpy().flatten()
  247. # input_data = self.input_data.flatten()
  248. # assert data.size == input_data.size
  249. # assert io.name.decode("utf-8") == "data"
  250. # for i in range(data.size):
  251. # assert data[i] == input_data[i]
  252. # return 0
  253. #
  254. # network.set_start_callback(start_callback)
  255. # self.do_forward(network, 1)
  256. # assert start_checked == True
  257. #
  258. # def test_network_finish_callback(self):
  259. # network = LiteNetwork()
  260. # network.load(self.model_path)
  261. # finish_checked = False
  262. #
  263. # @start_finish_callback
  264. # def finish_callback(ios):
  265. # nonlocal finish_checked
  266. # finish_checked = True
  267. # assert len(ios) == 1
  268. # for key in ios:
  269. # io = key
  270. # data = ios[key].to_numpy().flatten()
  271. # output_data = self.correct_data.flatten()
  272. # assert data.size == output_data.size
  273. # for i in range(data.size):
  274. # assert data[i] == output_data[i]
  275. # return 0
  276. #
  277. # network.set_finish_callback(finish_callback)
  278. # self.do_forward(network, 1)
  279. # assert finish_checked == True
  280. def test_enable_profile(self):
  281. network = LiteNetwork()
  282. network.load(self.model_path)
  283. network.enable_profile_performance("./profile.json")
  284. self.do_forward(network)
  285. fi = open("./profile.json", "r")
  286. fi.close()
  287. os.remove("./profile.json")
  288. def test_io_txt_dump(self):
  289. network = LiteNetwork()
  290. network.load(self.model_path)
  291. network.io_txt_dump("./io_txt.txt")
  292. self.do_forward(network)
  293. def test_io_bin_dump(self):
  294. import shutil
  295. folder = "./out"
  296. network = LiteNetwork()
  297. network.load(self.model_path)
  298. if not os.path.exists(folder):
  299. os.mkdir(folder)
  300. network.io_bin_dump(folder)
  301. self.do_forward(network)
  302. shutil.rmtree(folder)
  303. def test_algo_workspace_limit(self):
  304. network = LiteNetwork()
  305. network.load(self.model_path)
  306. print("modify the workspace limit.")
  307. network.set_network_algo_workspace_limit(10000)
  308. self.do_forward(network)
  309. def test_network_algo_policy(self):
  310. network = LiteNetwork()
  311. network.load(self.model_path)
  312. network.set_network_algo_policy(
  313. LiteAlgoSelectStrategy.LITE_ALGO_PROFILE
  314. | LiteAlgoSelectStrategy.LITE_ALGO_REPRODUCIBLE
  315. )
  316. self.do_forward(network)
  317. def test_network_algo_policy_ignore_batch(self):
  318. network = LiteNetwork()
  319. network.load(self.model_path)
  320. network.set_network_algo_policy(
  321. LiteAlgoSelectStrategy.LITE_ALGO_PROFILE,
  322. shared_batch_size=1,
  323. binary_equal_between_batch=True,
  324. )
  325. self.do_forward(network)

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