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

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