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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  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, const_shape) {
  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.options.var_sanity_check_first_run = false;
  46. config.options.const_shape = true;
  47. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  48. network->load_model(model_path);
  49. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  50. auto src_ptr = tensor->get_memory_ptr();
  51. auto src_layout = tensor->get_layout();
  52. input_tensor->reset(src_ptr, src_layout);
  53. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  54. auto result_tensor = std::make_shared<Tensor>(
  55. LiteDeviceType::LITE_CPU, Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  56. void* out_data = result_tensor->get_memory_ptr();
  57. output_tensor->reset(out_data, result_tensor->get_layout());
  58. network->forward();
  59. network->wait();
  60. compare_lite_tensor<float>(output_tensor, result_mgb);
  61. }
  62. TEST(TestNetWorkOptions, record2) {
  63. Config config;
  64. std::string model_path = "./shufflenet.mge";
  65. config.options.var_sanity_check_first_run = false;
  66. config.options.const_shape = true;
  67. config.options.comp_node_seq_record_level = 2;
  68. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  69. network->load_model(model_path);
  70. for (int i = 0; i < 3; i++) {
  71. network->forward();
  72. network->wait();
  73. }
  74. }
  75. TEST(TestNetWorkOptions, NCHW44) {
  76. Config config;
  77. auto tensor = get_input_data("./input_data.npy");
  78. std::string model_path = "./shufflenet.mge";
  79. std::string input_name = "data";
  80. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  81. config.options.var_sanity_check_first_run = false;
  82. config.options.enable_nchw44 = true;
  83. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  84. Runtime::set_network_algo_policy(
  85. network, LiteAlgoSelectStrategy::LITE_ALGO_PROFILE |
  86. LiteAlgoSelectStrategy::LITE_ALGO_REPRODUCIBLE);
  87. network->load_model(model_path);
  88. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  89. auto src_ptr = tensor->get_memory_ptr();
  90. auto src_layout = tensor->get_layout();
  91. input_tensor->reset(src_ptr, src_layout);
  92. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  93. auto result_tensor = std::make_shared<Tensor>(
  94. LiteDeviceType::LITE_CPU, Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  95. void* out_data = result_tensor->get_memory_ptr();
  96. output_tensor->reset(out_data, result_tensor->get_layout());
  97. network->forward();
  98. network->wait();
  99. compare_lite_tensor<float>(output_tensor, result_mgb);
  100. }
  101. TEST(TestNetWorkOptions, test_cache) {
  102. Config config;
  103. auto tensor = get_input_data("./input_data.npy");
  104. std::string model_path = "./shufflenet.mge";
  105. std::string input_name = "data";
  106. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  107. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  108. set_persistent_cache("./algo_cache.txt", true);
  109. network->load_model(model_path);
  110. Runtime::set_network_algo_policy(
  111. network, LiteAlgoSelectStrategy::LITE_ALGO_PROFILE |
  112. LiteAlgoSelectStrategy::LITE_ALGO_REPRODUCIBLE);
  113. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  114. auto src_ptr = tensor->get_memory_ptr();
  115. auto src_layout = tensor->get_layout();
  116. input_tensor->reset(src_ptr, src_layout);
  117. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  118. auto result_tensor = std::make_shared<Tensor>(
  119. LiteDeviceType::LITE_CPU, Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  120. void* out_data = result_tensor->get_memory_ptr();
  121. output_tensor->reset(out_data, result_tensor->get_layout());
  122. network->forward();
  123. network->wait();
  124. compare_lite_tensor<float>(output_tensor, result_mgb);
  125. dump_persistent_cache("./algo_cache.txt");
  126. ASSERT_TRUE(fopen("./algo_cache.txt", "r"));
  127. set_persistent_cache("./algo_cache.txt");
  128. network->forward();
  129. network->wait();
  130. compare_lite_tensor<float>(output_tensor, result_mgb);
  131. }
  132. TEST(TestNetWorkOptions, DisableModelInfo) {
  133. //! clear the cache set by other test
  134. mgb::PersistentCache::inst().set_impl(
  135. std::make_shared<mgb::InMemoryPersistentCache>());
  136. Config config;
  137. auto tensor = get_input_data("./input_data.npy");
  138. std::string model_path = "./test_pack_cache_to_model.lite";
  139. std::string model_path2 = "./test_pack_cache_to_model.lite";
  140. std::string input_name = "data";
  141. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  142. network->extra_configure({true});
  143. Runtime::set_cpu_inplace_mode(network);
  144. network->load_model(model_path);
  145. //! the fast-run cache will not configure, so it is not support dump
  146. ASSERT_EQ(mgb::PersistentCache::inst().support_dump_cache(), false);
  147. ASSERT_EQ(Runtime::is_cpu_inplace_mode(network), true);
  148. std::shared_ptr<Network> network2 = std::make_shared<Network>(config);
  149. network2->load_model(model_path2);
  150. //! the fast-run cache is configured by the model information
  151. ASSERT_EQ(mgb::PersistentCache::inst().support_dump_cache(), true);
  152. }
  153. TEST(TestNetWorkOptions, FastRunIgnorBatch) {
  154. Config config;
  155. auto tensor = get_input_data("./input_data.npy");
  156. std::string model_path = "./shufflenet.mge";
  157. std::string input_name = "data";
  158. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  159. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  160. set_persistent_cache("./algo_cache.txt");
  161. network->load_model(model_path);
  162. Runtime::set_network_algo_policy(
  163. network,
  164. LiteAlgoSelectStrategy::LITE_ALGO_PROFILE |
  165. LiteAlgoSelectStrategy::LITE_ALGO_REPRODUCIBLE,
  166. 1, true);
  167. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  168. auto src_ptr = tensor->get_memory_ptr();
  169. auto src_layout = tensor->get_layout();
  170. input_tensor->reset(src_ptr, src_layout);
  171. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  172. auto result_tensor = std::make_shared<Tensor>(
  173. LiteDeviceType::LITE_CPU, Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  174. void* out_data = result_tensor->get_memory_ptr();
  175. output_tensor->reset(out_data, result_tensor->get_layout());
  176. network->forward();
  177. network->wait();
  178. compare_lite_tensor<float>(output_tensor, result_mgb);
  179. dump_persistent_cache("./algo_cache.txt");
  180. ASSERT_TRUE(fopen("./algo_cache.txt", "r"));
  181. }
  182. #if LITE_WITH_CUDA
  183. TEST(TestNetWorkOptions, NCHW4) {
  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_nchw4 = 1;
  191. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  192. network->load_model(model_path);
  193. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  194. auto src_ptr = tensor->get_memory_ptr();
  195. auto src_layout = tensor->get_layout();
  196. input_tensor->reset(src_ptr, src_layout);
  197. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  198. auto result_tensor = std::make_shared<Tensor>(
  199. LiteDeviceType::LITE_CPU, Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  200. void* out_data = result_tensor->get_memory_ptr();
  201. output_tensor->reset(out_data, result_tensor->get_layout());
  202. network->forward();
  203. network->wait();
  204. compare_lite_tensor<float>(output_tensor, result_mgb);
  205. }
  206. TEST(TestNetWorkOptions, NCHW32) {
  207. Config config;
  208. config.device_type = LiteDeviceType::LITE_CUDA;
  209. auto tensor = get_input_data("./input_data.npy");
  210. std::string model_path = "./shufflenet.mge";
  211. std::string input_name = "data";
  212. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  213. config.options.enable_nchw32 = 1;
  214. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  215. Runtime::set_network_algo_policy(
  216. network, LiteAlgoSelectStrategy::LITE_ALGO_PROFILE |
  217. LiteAlgoSelectStrategy::LITE_ALGO_REPRODUCIBLE);
  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. TEST(TestNetWorkOptions, jit_level) {
  233. Config config;
  234. config.device_type = LiteDeviceType::LITE_CUDA;
  235. auto tensor = get_input_data("./input_data.npy");
  236. std::string model_path = "./shufflenet.mge";
  237. std::string input_name = "data";
  238. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  239. config.options.jit_level = 1;
  240. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  241. network->load_model(model_path);
  242. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  243. auto src_ptr = tensor->get_memory_ptr();
  244. auto src_layout = tensor->get_layout();
  245. input_tensor->reset(src_ptr, src_layout);
  246. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  247. auto result_tensor = std::make_shared<Tensor>(
  248. LiteDeviceType::LITE_CPU, Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  249. void* out_data = result_tensor->get_memory_ptr();
  250. output_tensor->reset(out_data, result_tensor->get_layout());
  251. network->forward();
  252. network->wait();
  253. compare_lite_tensor<float>(output_tensor, result_mgb);
  254. }
  255. #endif
  256. #if MGB_ENABLE_TENSOR_RT && LITE_WITH_CUDA
  257. TEST(TestNetWorkOptions, TensorRT) {
  258. Config config;
  259. config.device_type = LiteDeviceType::LITE_CUDA;
  260. auto tensor = get_input_data("./input_data.npy");
  261. std::string model_path = "./shufflenet.mge";
  262. std::string input_name = "data";
  263. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  264. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  265. Runtime::use_tensorrt(network);
  266. set_tensor_rt_cache("./tensorrt_cache.txt");
  267. network->load_model(model_path);
  268. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  269. auto src_ptr = tensor->get_memory_ptr();
  270. auto src_layout = tensor->get_layout();
  271. input_tensor->reset(src_ptr, src_layout);
  272. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  273. auto result_tensor = std::make_shared<Tensor>(
  274. LiteDeviceType::LITE_CPU, Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  275. void* out_data = result_tensor->get_memory_ptr();
  276. output_tensor->reset(out_data, result_tensor->get_layout());
  277. network->forward();
  278. network->wait();
  279. dump_tensor_rt_cache();
  280. ASSERT_TRUE(fopen("./tensorrt_cache.txt", "r"));
  281. compare_lite_tensor<float>(output_tensor, result_mgb);
  282. }
  283. #endif
  284. #endif
  285. // vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}}