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 15 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  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 "megbrain/utils/infile_persistent_cache.h"
  9. #include "megbrain/utils/persistent_cache.h"
  10. #include "test_common.h"
  11. #include <string.h>
  12. #include <chrono>
  13. #include <memory>
  14. #include <random>
  15. using namespace lite;
  16. TEST(TestNetWorkOptions, no_var_sanity_check_and_record) {
  17. Config config;
  18. auto tensor = get_input_data("./input_data.npy");
  19. std::string model_path = "./shufflenet.mge";
  20. std::string input_name = "data";
  21. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  22. config.options.var_sanity_check_first_run = false;
  23. config.options.comp_node_seq_record_level = 1;
  24. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  25. network->load_model(model_path);
  26. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  27. auto src_ptr = tensor->get_memory_ptr();
  28. auto src_layout = tensor->get_layout();
  29. input_tensor->reset(src_ptr, src_layout);
  30. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  31. auto result_tensor = std::make_shared<Tensor>(
  32. LiteDeviceType::LITE_CPU, Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  33. void* out_data = result_tensor->get_memory_ptr();
  34. output_tensor->reset(out_data, result_tensor->get_layout());
  35. network->forward();
  36. network->wait();
  37. compare_lite_tensor<float>(output_tensor, result_mgb);
  38. }
  39. TEST(TestNetWorkOptions, auto_optimize_inference_layout) {
  40. Config config;
  41. auto tensor = get_input_data("./input_data.npy");
  42. std::string model_path = "./shufflenet.mge";
  43. std::string input_name = "data";
  44. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  45. config.auto_optimize_inference = true;
  46. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  47. network->load_model(model_path);
  48. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  49. auto src_ptr = tensor->get_memory_ptr();
  50. auto src_layout = tensor->get_layout();
  51. input_tensor->reset(src_ptr, src_layout);
  52. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  53. auto result_tensor = std::make_shared<Tensor>(
  54. LiteDeviceType::LITE_CPU, Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  55. void* out_data = result_tensor->get_memory_ptr();
  56. output_tensor->reset(out_data, result_tensor->get_layout());
  57. network->forward();
  58. network->wait();
  59. compare_lite_tensor<float>(output_tensor, result_mgb);
  60. }
  61. TEST(TestNetWorkOptions, const_shape) {
  62. Config config;
  63. auto tensor = get_input_data("./input_data.npy");
  64. std::string model_path = "./shufflenet.mge";
  65. std::string input_name = "data";
  66. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  67. config.options.var_sanity_check_first_run = false;
  68. config.options.const_shape = true;
  69. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  70. network->load_model(model_path);
  71. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  72. auto src_ptr = tensor->get_memory_ptr();
  73. auto src_layout = tensor->get_layout();
  74. input_tensor->reset(src_ptr, src_layout);
  75. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  76. auto result_tensor = std::make_shared<Tensor>(
  77. LiteDeviceType::LITE_CPU, Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  78. void* out_data = result_tensor->get_memory_ptr();
  79. output_tensor->reset(out_data, result_tensor->get_layout());
  80. network->forward();
  81. network->wait();
  82. compare_lite_tensor<float>(output_tensor, result_mgb);
  83. }
  84. TEST(TestNetWorkOptions, record2) {
  85. Config config;
  86. std::string model_path = "./shufflenet.mge";
  87. config.options.var_sanity_check_first_run = false;
  88. config.options.const_shape = true;
  89. config.options.comp_node_seq_record_level = 2;
  90. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  91. network->load_model(model_path);
  92. for (int i = 0; i < 3; i++) {
  93. network->forward();
  94. network->wait();
  95. }
  96. }
  97. TEST(TestNetWorkOptions, NCHW44) {
  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. config.options.var_sanity_check_first_run = false;
  104. config.options.enable_nchw44 = true;
  105. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  106. Runtime::set_network_algo_policy(
  107. network, LiteAlgoSelectStrategy::LITE_ALGO_PROFILE |
  108. LiteAlgoSelectStrategy::LITE_ALGO_REPRODUCIBLE);
  109. network->load_model(model_path);
  110. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  111. auto src_ptr = tensor->get_memory_ptr();
  112. auto src_layout = tensor->get_layout();
  113. input_tensor->reset(src_ptr, src_layout);
  114. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  115. auto result_tensor = std::make_shared<Tensor>(
  116. LiteDeviceType::LITE_CPU, 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. }
  123. TEST(TestNetWorkOptions, test_cache) {
  124. Config config;
  125. auto tensor = get_input_data("./input_data.npy");
  126. std::string model_path = "./shufflenet.mge";
  127. std::string input_name = "data";
  128. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  129. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  130. set_persistent_cache("./algo_cache.txt", true);
  131. network->load_model(model_path);
  132. Runtime::set_network_algo_policy(
  133. network, LiteAlgoSelectStrategy::LITE_ALGO_PROFILE |
  134. LiteAlgoSelectStrategy::LITE_ALGO_REPRODUCIBLE);
  135. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  136. auto src_ptr = tensor->get_memory_ptr();
  137. auto src_layout = tensor->get_layout();
  138. input_tensor->reset(src_ptr, src_layout);
  139. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  140. auto result_tensor = std::make_shared<Tensor>(
  141. LiteDeviceType::LITE_CPU, Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  142. void* out_data = result_tensor->get_memory_ptr();
  143. output_tensor->reset(out_data, result_tensor->get_layout());
  144. network->forward();
  145. network->wait();
  146. compare_lite_tensor<float>(output_tensor, result_mgb);
  147. dump_persistent_cache("./algo_cache.txt");
  148. ASSERT_TRUE(fopen("./algo_cache.txt", "r"));
  149. set_persistent_cache("./algo_cache.txt");
  150. network->forward();
  151. network->wait();
  152. compare_lite_tensor<float>(output_tensor, result_mgb);
  153. }
  154. TEST(TestNetWorkOptions, DisableModelInfo) {
  155. //! clear the cache set by other test
  156. mgb::PersistentCache::inst().set_impl(
  157. std::make_shared<mgb::InMemoryPersistentCache>());
  158. Config config;
  159. auto tensor = get_input_data("./input_data.npy");
  160. std::string model_path = "./test_pack_cache_to_model.lite";
  161. std::string model_path2 = "./test_pack_cache_to_model.lite";
  162. std::string input_name = "data";
  163. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  164. network->extra_configure({true});
  165. Runtime::set_cpu_inplace_mode(network);
  166. network->load_model(model_path);
  167. //! the fast-run cache will not configure, so it is not support dump
  168. ASSERT_EQ(mgb::PersistentCache::inst().support_dump_cache(), false);
  169. ASSERT_EQ(Runtime::is_cpu_inplace_mode(network), true);
  170. std::shared_ptr<Network> network2 = std::make_shared<Network>(config);
  171. network2->load_model(model_path2);
  172. //! the fast-run cache is configured by the model information
  173. ASSERT_EQ(mgb::PersistentCache::inst().support_dump_cache(), true);
  174. }
  175. TEST(TestNetWorkOptions, FastRunIgnorBatch) {
  176. Config config;
  177. auto tensor = get_input_data("./input_data.npy");
  178. std::string model_path = "./shufflenet.mge";
  179. std::string input_name = "data";
  180. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  181. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  182. set_persistent_cache("./algo_cache.txt");
  183. network->load_model(model_path);
  184. Runtime::set_network_algo_policy(
  185. network,
  186. LiteAlgoSelectStrategy::LITE_ALGO_PROFILE |
  187. LiteAlgoSelectStrategy::LITE_ALGO_REPRODUCIBLE,
  188. 1, true);
  189. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  190. auto src_ptr = tensor->get_memory_ptr();
  191. auto src_layout = tensor->get_layout();
  192. input_tensor->reset(src_ptr, src_layout);
  193. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  194. auto result_tensor = std::make_shared<Tensor>(
  195. LiteDeviceType::LITE_CPU, Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  196. void* out_data = result_tensor->get_memory_ptr();
  197. output_tensor->reset(out_data, result_tensor->get_layout());
  198. network->forward();
  199. network->wait();
  200. compare_lite_tensor<float>(output_tensor, result_mgb);
  201. dump_persistent_cache("./algo_cache.txt");
  202. ASSERT_TRUE(fopen("./algo_cache.txt", "r"));
  203. }
  204. #if LITE_WITH_CUDA
  205. TEST(TestNetWorkOptions, NCHW4) {
  206. Config config;
  207. config.device_type = LiteDeviceType::LITE_CUDA;
  208. auto tensor = get_input_data("./input_data.npy");
  209. std::string model_path = "./shufflenet.mge";
  210. std::string input_name = "data";
  211. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  212. config.options.enable_nchw4 = 1;
  213. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  214. network->load_model(model_path);
  215. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  216. auto src_ptr = tensor->get_memory_ptr();
  217. auto src_layout = tensor->get_layout();
  218. input_tensor->reset(src_ptr, src_layout);
  219. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  220. auto result_tensor = std::make_shared<Tensor>(
  221. LiteDeviceType::LITE_CPU, Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  222. void* out_data = result_tensor->get_memory_ptr();
  223. output_tensor->reset(out_data, result_tensor->get_layout());
  224. network->forward();
  225. network->wait();
  226. compare_lite_tensor<float>(output_tensor, result_mgb);
  227. }
  228. TEST(TestNetWorkOptions, NCHW32) {
  229. Config config;
  230. config.device_type = LiteDeviceType::LITE_CUDA;
  231. auto tensor = get_input_data("./input_data.npy");
  232. std::string model_path = "./shufflenet.mge";
  233. std::string input_name = "data";
  234. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  235. config.options.enable_nchw32 = 1;
  236. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  237. Runtime::set_network_algo_policy(
  238. network, LiteAlgoSelectStrategy::LITE_ALGO_PROFILE |
  239. LiteAlgoSelectStrategy::LITE_ALGO_REPRODUCIBLE);
  240. network->load_model(model_path);
  241. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  242. auto src_ptr = tensor->get_memory_ptr();
  243. auto src_layout = tensor->get_layout();
  244. input_tensor->reset(src_ptr, src_layout);
  245. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  246. auto result_tensor = std::make_shared<Tensor>(
  247. LiteDeviceType::LITE_CPU, Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  248. void* out_data = result_tensor->get_memory_ptr();
  249. output_tensor->reset(out_data, result_tensor->get_layout());
  250. network->forward();
  251. network->wait();
  252. compare_lite_tensor<float>(output_tensor, result_mgb);
  253. }
  254. TEST(TestNetWorkOptions, jit_level) {
  255. Config config;
  256. config.device_type = LiteDeviceType::LITE_CUDA;
  257. auto tensor = get_input_data("./input_data.npy");
  258. std::string model_path = "./shufflenet.mge";
  259. std::string input_name = "data";
  260. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  261. config.options.jit_level = 1;
  262. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  263. network->load_model(model_path);
  264. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  265. auto src_ptr = tensor->get_memory_ptr();
  266. auto src_layout = tensor->get_layout();
  267. input_tensor->reset(src_ptr, src_layout);
  268. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  269. auto result_tensor = std::make_shared<Tensor>(
  270. LiteDeviceType::LITE_CPU, Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  271. void* out_data = result_tensor->get_memory_ptr();
  272. output_tensor->reset(out_data, result_tensor->get_layout());
  273. network->forward();
  274. network->wait();
  275. compare_lite_tensor<float>(output_tensor, result_mgb);
  276. }
  277. #endif
  278. #if MGB_ENABLE_TENSOR_RT && LITE_WITH_CUDA
  279. TEST(TestNetWorkOptions, TensorRT) {
  280. Config config;
  281. config.device_type = LiteDeviceType::LITE_CUDA;
  282. auto tensor = get_input_data("./input_data.npy");
  283. std::string model_path = "./shufflenet.mge";
  284. std::string input_name = "data";
  285. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  286. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  287. Runtime::use_tensorrt(network);
  288. set_tensor_rt_cache("./tensorrt_cache.txt");
  289. network->load_model(model_path);
  290. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  291. auto src_ptr = tensor->get_memory_ptr();
  292. auto src_layout = tensor->get_layout();
  293. input_tensor->reset(src_ptr, src_layout);
  294. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  295. auto result_tensor = std::make_shared<Tensor>(
  296. LiteDeviceType::LITE_CPU, Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  297. void* out_data = result_tensor->get_memory_ptr();
  298. output_tensor->reset(out_data, result_tensor->get_layout());
  299. network->forward();
  300. network->wait();
  301. dump_tensor_rt_cache();
  302. ASSERT_TRUE(fopen("./tensorrt_cache.txt", "r"));
  303. compare_lite_tensor<float>(output_tensor, result_mgb);
  304. }
  305. #endif
  306. #endif
  307. // vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}}