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

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