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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  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/misc.h"
  15. #include "../src/mge/network_impl.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,
  41. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  42. void* out_data = result_tensor->get_memory_ptr();
  43. output_tensor->reset(out_data, result_tensor->get_layout());
  44. network->forward();
  45. network->wait();
  46. compare_lite_tensor<float>(output_tensor, result_mgb);
  47. }
  48. TEST(TestNetWorkOptions, const_shape) {
  49. Config config;
  50. auto tensor = get_input_data("./input_data.npy");
  51. std::string model_path = "./shufflenet.mge";
  52. std::string input_name = "data";
  53. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  54. config.options.var_sanity_check_first_run = false;
  55. config.options.const_shape = true;
  56. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  57. network->load_model(model_path);
  58. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  59. auto src_ptr = tensor->get_memory_ptr();
  60. auto src_layout = tensor->get_layout();
  61. input_tensor->reset(src_ptr, src_layout);
  62. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  63. auto result_tensor = std::make_shared<Tensor>(
  64. LiteDeviceType::LITE_CPU,
  65. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  66. void* out_data = result_tensor->get_memory_ptr();
  67. output_tensor->reset(out_data, result_tensor->get_layout());
  68. network->forward();
  69. network->wait();
  70. compare_lite_tensor<float>(output_tensor, result_mgb);
  71. }
  72. TEST(TestNetWorkOptions, NCHW44) {
  73. Config config;
  74. auto tensor = get_input_data("./input_data.npy");
  75. std::string model_path = "./shufflenet.mge";
  76. std::string input_name = "data";
  77. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  78. config.options.var_sanity_check_first_run = false;
  79. config.options.enable_nchw44 = true;
  80. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  81. Runtime::set_network_algo_policy(
  82. network, LiteAlgoSelectStrategy::LITE_ALGO_PROFILE |
  83. LiteAlgoSelectStrategy::LITE_ALGO_REPRODUCIBLE);
  84. network->load_model(model_path);
  85. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  86. auto src_ptr = tensor->get_memory_ptr();
  87. auto src_layout = tensor->get_layout();
  88. input_tensor->reset(src_ptr, src_layout);
  89. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  90. auto result_tensor = std::make_shared<Tensor>(
  91. LiteDeviceType::LITE_CPU,
  92. 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,
  118. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  119. void* out_data = result_tensor->get_memory_ptr();
  120. output_tensor->reset(out_data, result_tensor->get_layout());
  121. network->forward();
  122. network->wait();
  123. compare_lite_tensor<float>(output_tensor, result_mgb);
  124. dump_persistent_cache("./algo_cache.txt");
  125. ASSERT_TRUE(fopen("./algo_cache.txt", "r"));
  126. set_persistent_cache("./algo_cache.txt");
  127. network->forward();
  128. network->wait();
  129. compare_lite_tensor<float>(output_tensor, result_mgb);
  130. }
  131. TEST(TestNetWorkOptions, FastRunIgnorBatch) {
  132. Config config;
  133. auto tensor = get_input_data("./input_data.npy");
  134. std::string model_path = "./shufflenet.mge";
  135. std::string input_name = "data";
  136. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  137. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  138. set_persistent_cache("./algo_cache.txt");
  139. network->load_model(model_path);
  140. Runtime::set_network_algo_policy(
  141. network,
  142. LiteAlgoSelectStrategy::LITE_ALGO_PROFILE |
  143. LiteAlgoSelectStrategy::LITE_ALGO_REPRODUCIBLE,
  144. 1, true);
  145. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  146. auto src_ptr = tensor->get_memory_ptr();
  147. auto src_layout = tensor->get_layout();
  148. input_tensor->reset(src_ptr, src_layout);
  149. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  150. auto result_tensor = std::make_shared<Tensor>(
  151. LiteDeviceType::LITE_CPU,
  152. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  153. void* out_data = result_tensor->get_memory_ptr();
  154. output_tensor->reset(out_data, result_tensor->get_layout());
  155. network->forward();
  156. network->wait();
  157. compare_lite_tensor<float>(output_tensor, result_mgb);
  158. dump_persistent_cache("./algo_cache.txt");
  159. ASSERT_TRUE(fopen("./algo_cache.txt", "r"));
  160. }
  161. #if LITE_WITH_CUDA
  162. TEST(TestNetWorkOptions, NCHW4) {
  163. Config config;
  164. config.device_type = LiteDeviceType::LITE_CUDA;
  165. auto tensor = get_input_data("./input_data.npy");
  166. std::string model_path = "./shufflenet.mge";
  167. std::string input_name = "data";
  168. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  169. config.options.enable_nchw4 = 1;
  170. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  171. network->load_model(model_path);
  172. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  173. auto src_ptr = tensor->get_memory_ptr();
  174. auto src_layout = tensor->get_layout();
  175. input_tensor->reset(src_ptr, src_layout);
  176. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  177. auto result_tensor = std::make_shared<Tensor>(
  178. LiteDeviceType::LITE_CPU,
  179. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  180. void* out_data = result_tensor->get_memory_ptr();
  181. output_tensor->reset(out_data, result_tensor->get_layout());
  182. network->forward();
  183. network->wait();
  184. compare_lite_tensor<float>(output_tensor, result_mgb);
  185. }
  186. TEST(TestNetWorkOptions, NCHW32) {
  187. Config config;
  188. config.device_type = LiteDeviceType::LITE_CUDA;
  189. auto tensor = get_input_data("./input_data.npy");
  190. std::string model_path = "./shufflenet.mge";
  191. std::string input_name = "data";
  192. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  193. config.options.enable_nchw32 = 1;
  194. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  195. Runtime::set_network_algo_policy(
  196. network, LiteAlgoSelectStrategy::LITE_ALGO_PROFILE |
  197. LiteAlgoSelectStrategy::LITE_ALGO_REPRODUCIBLE);
  198. network->load_model(model_path);
  199. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  200. auto src_ptr = tensor->get_memory_ptr();
  201. auto src_layout = tensor->get_layout();
  202. input_tensor->reset(src_ptr, src_layout);
  203. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  204. auto result_tensor = std::make_shared<Tensor>(
  205. LiteDeviceType::LITE_CPU,
  206. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  207. void* out_data = result_tensor->get_memory_ptr();
  208. output_tensor->reset(out_data, result_tensor->get_layout());
  209. network->forward();
  210. network->wait();
  211. compare_lite_tensor<float>(output_tensor, result_mgb);
  212. }
  213. TEST(TestNetWorkOptions, jit_level) {
  214. Config config;
  215. config.device_type = LiteDeviceType::LITE_CUDA;
  216. auto tensor = get_input_data("./input_data.npy");
  217. std::string model_path = "./shufflenet.mge";
  218. std::string input_name = "data";
  219. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  220. config.options.jit_level = 1;
  221. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  222. network->load_model(model_path);
  223. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  224. auto src_ptr = tensor->get_memory_ptr();
  225. auto src_layout = tensor->get_layout();
  226. input_tensor->reset(src_ptr, src_layout);
  227. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  228. auto result_tensor = std::make_shared<Tensor>(
  229. LiteDeviceType::LITE_CPU,
  230. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  231. void* out_data = result_tensor->get_memory_ptr();
  232. output_tensor->reset(out_data, result_tensor->get_layout());
  233. network->forward();
  234. network->wait();
  235. compare_lite_tensor<float>(output_tensor, result_mgb);
  236. }
  237. #endif
  238. #if MGB_ENABLE_TENSOR_RT && LITE_WITH_CUDA
  239. TEST(TestNetWorkOptions, TensorRT) {
  240. Config config;
  241. config.device_type = LiteDeviceType::LITE_CUDA;
  242. auto tensor = get_input_data("./input_data.npy");
  243. std::string model_path = "./shufflenet.mge";
  244. std::string input_name = "data";
  245. auto result_mgb = mgb_lar(model_path, config, input_name, tensor);
  246. std::shared_ptr<Network> network = std::make_shared<Network>(config);
  247. Runtime::use_tensorrt(network);
  248. set_tensor_rt_cache("./tensorrt_cache.txt");
  249. network->load_model(model_path);
  250. std::shared_ptr<Tensor> input_tensor = network->get_io_tensor(input_name);
  251. auto src_ptr = tensor->get_memory_ptr();
  252. auto src_layout = tensor->get_layout();
  253. input_tensor->reset(src_ptr, src_layout);
  254. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  255. auto result_tensor = std::make_shared<Tensor>(
  256. LiteDeviceType::LITE_CPU,
  257. Layout{{1, 1000}, 2, LiteDataType::LITE_FLOAT});
  258. void* out_data = result_tensor->get_memory_ptr();
  259. output_tensor->reset(out_data, result_tensor->get_layout());
  260. network->forward();
  261. network->wait();
  262. dump_tensor_rt_cache();
  263. ASSERT_TRUE(fopen("./tensorrt_cache.txt", "r"));
  264. compare_lite_tensor<float>(output_tensor, result_mgb);
  265. }
  266. #endif
  267. #endif
  268. // vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}}

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