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_options.cpp 12 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. /**
  2. * \file test/test_network_options.cpp
  3. *
  4. * This file is part of MegEngine, a deep learning framework developed by
  5. * Megvii.
  6. *
  7. * \copyright Copyright (c) 2020-2021 Megvii Inc. All rights reserved.
  8. */
  9. #include "lite_build_config.h"
  10. #if LITE_BUILD_WITH_MGE
  11. #include "../src/common.h"
  12. #include "../src/misc.h"
  13. #include "../src/mge/network_impl.h"
  14. #include "lite/global.h"
  15. #include "megbrain/tensor.h"
  16. #include "test_common.h"
  17. #include <string.h>
  18. #include <chrono>
  19. #include <memory>
  20. #include <random>
  21. using namespace lite;
  22. TEST(TestNetWorkOptions, no_var_sanity_check_and_record) {
  23. Config config;
  24. auto tensor = get_input_data("./input_data.npy");
  25. std::string model_path = "./shufflenet.mge";
  26. std::string input_name = "data";
  27. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  28. config.options.var_sanity_check_first_run = false;
  29. config.options.comp_node_seq_record_level = 1;
  30. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  31. network->load_model(model_path);
  32. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  33. auto src_ptr = tensor->get_memory_ptr();
  34. auto src_layout = tensor->get_layout();
  35. input_tensor->reset(src_ptr, src_layout);
  36. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  37. auto result_tensor = std::make_shared<Tensor>(
  38. LiteDeviceType::LITE_CPU,
  39. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  40. void* out_data = result_tensor->get_memory_ptr();
  41. output_tensor->reset(out_data, result_tensor->get_layout());
  42. network->forward();
  43. network->wait();
  44. compare_lite_tensor<float>(output_tensor, result_mgb);
  45. }
  46. TEST(TestNetWorkOptions, const_shape) {
  47. Config config;
  48. auto tensor = get_input_data("./input_data.npy");
  49. std::string model_path = "./shufflenet.mge";
  50. std::string input_name = "data";
  51. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  52. config.options.var_sanity_check_first_run = false;
  53. config.options.const_shape = true;
  54. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  55. network->load_model(model_path);
  56. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  57. auto src_ptr = tensor->get_memory_ptr();
  58. auto src_layout = tensor->get_layout();
  59. input_tensor->reset(src_ptr, src_layout);
  60. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  61. auto result_tensor = std::make_shared<Tensor>(
  62. LiteDeviceType::LITE_CPU,
  63. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  64. void* out_data = result_tensor->get_memory_ptr();
  65. output_tensor->reset(out_data, result_tensor->get_layout());
  66. network->forward();
  67. network->wait();
  68. compare_lite_tensor<float>(output_tensor, result_mgb);
  69. }
  70. TEST(TestNetWorkOptions, NCHW44) {
  71. Config config;
  72. auto tensor = get_input_data("./input_data.npy");
  73. std::string model_path = "./shufflenet.mge";
  74. std::string input_name = "data";
  75. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  76. config.options.var_sanity_check_first_run = false;
  77. config.options.enable_nchw44 = true;
  78. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  79. Runtime::set_network_algo_policy(
  80. network, LiteAlgoSelectStrategy::LITE_ALGO_PROFILE |
  81. LiteAlgoSelectStrategy::LITE_ALGO_REPRODUCIBLE);
  82. network->load_model(model_path);
  83. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  84. auto src_ptr = tensor->get_memory_ptr();
  85. auto src_layout = tensor->get_layout();
  86. input_tensor->reset(src_ptr, src_layout);
  87. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  88. auto result_tensor = std::make_shared<Tensor>(
  89. LiteDeviceType::LITE_CPU,
  90. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  91. void* out_data = result_tensor->get_memory_ptr();
  92. output_tensor->reset(out_data, result_tensor->get_layout());
  93. network->forward();
  94. network->wait();
  95. compare_lite_tensor<float>(output_tensor, result_mgb);
  96. }
  97. TEST(TestNetWorkOptions, test_cache) {
  98. Config config;
  99. auto tensor = get_input_data("./input_data.npy");
  100. std::string model_path = "./shufflenet.mge";
  101. std::string input_name = "data";
  102. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  103. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  104. set_persistent_cache("./algo_cache.txt", true);
  105. network->load_model(model_path);
  106. Runtime::set_network_algo_policy(
  107. network, LiteAlgoSelectStrategy::LITE_ALGO_PROFILE |
  108. LiteAlgoSelectStrategy::LITE_ALGO_REPRODUCIBLE);
  109. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  110. auto src_ptr = tensor->get_memory_ptr();
  111. auto src_layout = tensor->get_layout();
  112. input_tensor->reset(src_ptr, src_layout);
  113. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  114. auto result_tensor = std::make_shared<Tensor>(
  115. LiteDeviceType::LITE_CPU,
  116. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  117. void* out_data = result_tensor->get_memory_ptr();
  118. output_tensor->reset(out_data, result_tensor->get_layout());
  119. network->forward();
  120. network->wait();
  121. compare_lite_tensor<float>(output_tensor, result_mgb);
  122. dump_persistent_cache("./algo_cache.txt");
  123. ASSERT_TRUE(fopen("./algo_cache.txt", "r"));
  124. set_persistent_cache("./algo_cache.txt");
  125. network->forward();
  126. network->wait();
  127. compare_lite_tensor<float>(output_tensor, result_mgb);
  128. }
  129. TEST(TestNetWorkOptions, FastRunIgnorBatch) {
  130. Config config;
  131. auto tensor = get_input_data("./input_data.npy");
  132. std::string model_path = "./shufflenet.mge";
  133. std::string input_name = "data";
  134. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  135. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  136. set_persistent_cache("./algo_cache.txt");
  137. network->load_model(model_path);
  138. Runtime::set_network_algo_policy(
  139. network,
  140. LiteAlgoSelectStrategy::LITE_ALGO_PROFILE |
  141. LiteAlgoSelectStrategy::LITE_ALGO_REPRODUCIBLE,
  142. 1, true);
  143. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  144. auto src_ptr = tensor->get_memory_ptr();
  145. auto src_layout = tensor->get_layout();
  146. input_tensor->reset(src_ptr, src_layout);
  147. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  148. auto result_tensor = std::make_shared<Tensor>(
  149. LiteDeviceType::LITE_CPU,
  150. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  151. void* out_data = result_tensor->get_memory_ptr();
  152. output_tensor->reset(out_data, result_tensor->get_layout());
  153. network->forward();
  154. network->wait();
  155. compare_lite_tensor<float>(output_tensor, result_mgb);
  156. dump_persistent_cache("./algo_cache.txt");
  157. ASSERT_TRUE(fopen("./algo_cache.txt", "r"));
  158. }
  159. #if LITE_WITH_CUDA
  160. TEST(TestNetWorkOptions, NCHW4) {
  161. Config config;
  162. config.device_type = LiteDeviceType::LITE_CUDA;
  163. auto tensor = get_input_data("./input_data.npy");
  164. std::string model_path = "./shufflenet.mge";
  165. std::string input_name = "data";
  166. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  167. config.options.enable_nchw4 = 1;
  168. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  169. network->load_model(model_path);
  170. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  171. auto src_ptr = tensor->get_memory_ptr();
  172. auto src_layout = tensor->get_layout();
  173. input_tensor->reset(src_ptr, src_layout);
  174. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  175. auto result_tensor = std::make_shared<Tensor>(
  176. LiteDeviceType::LITE_CPU,
  177. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  178. void* out_data = result_tensor->get_memory_ptr();
  179. output_tensor->reset(out_data, result_tensor->get_layout());
  180. network->forward();
  181. network->wait();
  182. compare_lite_tensor<float>(output_tensor, result_mgb);
  183. }
  184. TEST(TestNetWorkOptions, NCHW32) {
  185. Config config;
  186. config.device_type = LiteDeviceType::LITE_CUDA;
  187. auto tensor = get_input_data("./input_data.npy");
  188. std::string model_path = "./shufflenet.mge";
  189. std::string input_name = "data";
  190. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  191. config.options.enable_nchw32 = 1;
  192. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  193. Runtime::set_network_algo_policy(
  194. network, LiteAlgoSelectStrategy::LITE_ALGO_PROFILE |
  195. LiteAlgoSelectStrategy::LITE_ALGO_REPRODUCIBLE);
  196. network->load_model(model_path);
  197. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  198. auto src_ptr = tensor->get_memory_ptr();
  199. auto src_layout = tensor->get_layout();
  200. input_tensor->reset(src_ptr, src_layout);
  201. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  202. auto result_tensor = std::make_shared<Tensor>(
  203. LiteDeviceType::LITE_CPU,
  204. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  205. void* out_data = result_tensor->get_memory_ptr();
  206. output_tensor->reset(out_data, result_tensor->get_layout());
  207. network->forward();
  208. network->wait();
  209. compare_lite_tensor<float>(output_tensor, result_mgb);
  210. }
  211. TEST(TestNetWorkOptions, jit_level) {
  212. Config config;
  213. config.device_type = LiteDeviceType::LITE_CUDA;
  214. auto tensor = get_input_data("./input_data.npy");
  215. std::string model_path = "./shufflenet.mge";
  216. std::string input_name = "data";
  217. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  218. config.options.jit_level = 1;
  219. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  220. network->load_model(model_path);
  221. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  222. auto src_ptr = tensor->get_memory_ptr();
  223. auto src_layout = tensor->get_layout();
  224. input_tensor->reset(src_ptr, src_layout);
  225. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  226. auto result_tensor = std::make_shared<Tensor>(
  227. LiteDeviceType::LITE_CPU,
  228. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  229. void* out_data = result_tensor->get_memory_ptr();
  230. output_tensor->reset(out_data, result_tensor->get_layout());
  231. network->forward();
  232. network->wait();
  233. compare_lite_tensor<float>(output_tensor, result_mgb);
  234. }
  235. #endif
  236. #if MGB_ENABLE_TENSOR_RT && LITE_WITH_CUDA
  237. TEST(TestNetWorkOptions, TensorRT) {
  238. Config config;
  239. config.device_type = LiteDeviceType::LITE_CUDA;
  240. auto tensor = get_input_data("./input_data.npy");
  241. std::string model_path = "./shufflenet.mge";
  242. std::string input_name = "data";
  243. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  244. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  245. Runtime::use_tensorrt(network);
  246. set_tensor_rt_cache("./tensorrt_cache.txt");
  247. network->load_model(model_path);
  248. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  249. auto src_ptr = tensor->get_memory_ptr();
  250. auto src_layout = tensor->get_layout();
  251. input_tensor->reset(src_ptr, src_layout);
  252. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  253. auto result_tensor = std::make_shared<Tensor>(
  254. LiteDeviceType::LITE_CPU,
  255. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  256. void* out_data = result_tensor->get_memory_ptr();
  257. output_tensor->reset(out_data, result_tensor->get_layout());
  258. network->forward();
  259. network->wait();
  260. dump_tensor_rt_cache();
  261. ASSERT_TRUE(fopen("./tensorrt_cache.txt", "r"));
  262. compare_lite_tensor<float>(output_tensor, result_mgb);
  263. }
  264. #endif
  265. #endif
  266. // vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}}

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