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.

group_conv.cpp 7.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. /**
  2. * \file dnn/test/cuda/group_conv.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 "megdnn/oprs/nn.h"
  12. #include "test/cuda/fixture.h"
  13. #include "test/common/benchmarker.h"
  14. #include "test/common/checker.h"
  15. #include "test/common/convolution.h"
  16. #include "src/cuda/utils.h"
  17. namespace megdnn {
  18. namespace test {
  19. TEST_F(CUDA, GROUP_CONV_FORWARD)
  20. {
  21. bool is_int_available = cuda::is_compute_capability_required(6, 1);
  22. auto run = [&](size_t N, size_t IC, size_t IH, size_t IW,
  23. size_t FH, size_t FW,
  24. size_t OC, size_t /* OH */, size_t /* OW */,
  25. size_t PH, size_t PW,
  26. size_t SH, size_t SW,
  27. size_t DH, size_t DW,
  28. size_t group)
  29. {
  30. {
  31. // float case
  32. Checker<Convolution> checker(handle_cuda());
  33. Convolution::Param param;
  34. param.sparse = Convolution::Param::Sparse::GROUP;
  35. param.pad_h = PH;
  36. param.pad_w = PW;
  37. param.stride_h = SH;
  38. param.stride_w = SW;
  39. param.dilate_h = DH;
  40. param.dilate_w = DW;
  41. auto ICg = IC / group;
  42. auto OCg = OC / group;
  43. checker.set_param(param).exec({{N, IC, IH, IW},
  44. {group, OCg, ICg, FH, FW}, {}});
  45. }
  46. if (is_int_available) {
  47. // int 8x8x32 case
  48. Checker<Convolution> checker(handle_cuda());
  49. Convolution::Param param;
  50. param.sparse = Convolution::Param::Sparse::GROUP;
  51. param.format = Convolution::Param::Format::NHWC;
  52. param.pad_h = PH;
  53. param.pad_w = PW;
  54. param.stride_h = SH;
  55. param.stride_w = SW;
  56. param.dilate_h = DH;
  57. param.dilate_w = DW;
  58. auto ICg = IC / group;
  59. auto OCg = OC / group;
  60. UniformIntRNG rng(-4, 4);
  61. checker.set_param(param).
  62. set_dtype(0, dtype::Int8()).
  63. set_dtype(1, dtype::Int8()).
  64. set_dtype(2, dtype::Int32()).
  65. set_rng(0, &rng).
  66. set_rng(1, &rng).
  67. exec({{N, IH, IW, IC}, {group, OCg, FH, FW, ICg}, {}});
  68. }
  69. };
  70. // normal case
  71. run(2, 64, 7, 7,
  72. 3, 3,
  73. 32, 5, 5,
  74. 0, 0,
  75. 1, 1,
  76. 1, 1,
  77. 2);
  78. // padded case
  79. run(2, 32, 7, 7,
  80. 3, 3,
  81. 64, 7, 7,
  82. 1, 1,
  83. 1, 1,
  84. 1, 1,
  85. 4);
  86. // strided case
  87. run(2, 32, 7, 7,
  88. 3, 3,
  89. 64, 3, 3,
  90. 0, 0,
  91. 2, 2,
  92. 1, 1,
  93. 8);
  94. // dilated case
  95. run(2, 32, 7, 7,
  96. 3, 3,
  97. 64, 3, 3,
  98. 0, 0,
  99. 1, 1,
  100. 2, 2,
  101. 8);
  102. }
  103. TEST_F(CUDA, GROUP_CONV_FORWARD_1x1) {
  104. auto run = [&](size_t N, size_t IC, size_t IH, size_t IW,
  105. size_t FH, size_t FW,
  106. size_t OC, size_t group) {
  107. Checker<Convolution> checker(handle_cuda());
  108. #if CUDNN_MAJOR <= 6
  109. std::string conv1x1_name =
  110. ConvBiasForward::algo_name<ConvBiasForward::MatmulParam>(
  111. "BATCHEDMATMUL", {});
  112. checker.set_before_exec_callback(
  113. AlgoChecker<ConvolutionForward>(ExecutionPolicyAlgoName{
  114. "DEFAULT",
  115. {{ConvBiasForward::algo_name<
  116. ConvBiasForward::DirectParam>(
  117. ssprintf("%s:%s", "CUDA:GROUP_CONV",
  118. conv1x1_name.c_str())
  119. .c_str(),
  120. {})
  121. .c_str(),
  122. {}}}}));
  123. #endif
  124. Convolution::Param param;
  125. param.sparse = Convolution::Param::Sparse::GROUP;
  126. auto ICg = IC / group;
  127. auto OCg = OC / group;
  128. checker.set_param(param).exec({{N, IC, IH, IW},
  129. {group, OCg, ICg, FH, FW}, {}});
  130. };
  131. size_t ic = 192;
  132. for (size_t g = 2; g <= 3; g += 1) {
  133. for (size_t ih = 8; ih <= 128; ih *= 4) {
  134. size_t iw = ih;
  135. run(2, ic, ih, iw, 1, 1, ic / g, g);
  136. run(2, ic, ih+1, iw+1, 1, 1, ic / g, g);
  137. }
  138. }
  139. }
  140. TEST_F(CUDA, GROUP_CONV_BACKWARD_DATA)
  141. {
  142. auto run = [&](size_t N, size_t IC, size_t IH, size_t IW,
  143. size_t FH, size_t FW,
  144. size_t OC, size_t OH, size_t OW,
  145. size_t PH, size_t PW,
  146. size_t SH, size_t SW,
  147. size_t group)
  148. {
  149. Checker<ConvolutionBackwardData> checker(handle_cuda());
  150. ConvolutionBackwardData::Param param;
  151. param.sparse = Convolution::Param::Sparse::GROUP;
  152. param.pad_h = PH;
  153. param.pad_w = PW;
  154. param.stride_h = SH;
  155. param.stride_w = SW;
  156. auto ICg = IC / group;
  157. auto OCg = OC / group;
  158. checker.set_param(param).exec({{group, OCg, ICg, FH, FW},
  159. {N, OC, OH, OW}, {N, IC, IH, IW}});
  160. };
  161. // normal case
  162. run(2, 64, 7, 7,
  163. 3, 3,
  164. 32, 5, 5,
  165. 0, 0,
  166. 1, 1,
  167. 2);
  168. // padded case
  169. run(2, 32, 7, 7,
  170. 3, 3,
  171. 64, 7, 7,
  172. 1, 1,
  173. 1, 1,
  174. 4);
  175. // strided case
  176. run(2, 32, 7, 7,
  177. 3, 3,
  178. 64, 3, 3,
  179. 0, 0,
  180. 2, 2,
  181. 8);
  182. }
  183. TEST_F(CUDA, GROUP_CONV_BACKWARD_FILTER)
  184. {
  185. auto run = [&](size_t N, size_t IC, size_t IH, size_t IW,
  186. size_t FH, size_t FW,
  187. size_t OC, size_t OH, size_t OW,
  188. size_t PH, size_t PW,
  189. size_t SH, size_t SW,
  190. size_t group)
  191. {
  192. Checker<ConvolutionBackwardFilter> checker(handle_cuda());
  193. ConvolutionBackwardFilter::Param param;
  194. param.sparse = Convolution::Param::Sparse::GROUP;
  195. param.pad_h = PH;
  196. param.pad_w = PW;
  197. param.stride_h = SH;
  198. param.stride_w = SW;
  199. auto ICg = IC / group;
  200. auto OCg = OC / group;
  201. checker.set_param(param).exec({{N, IC, IH, IW},
  202. {N, OC, OH, OW}, {group, OCg, ICg, FH, FW}});
  203. };
  204. // normal case
  205. run(2, 64, 7, 7,
  206. 3, 3,
  207. 32, 5, 5,
  208. 0, 0,
  209. 1, 1,
  210. 2);
  211. // padded case
  212. run(2, 32, 7, 7,
  213. 3, 3,
  214. 64, 7, 7,
  215. 1, 1,
  216. 1, 1,
  217. 4);
  218. // strided case
  219. run(2, 32, 7, 7,
  220. 3, 3,
  221. 64, 3, 3,
  222. 0, 0,
  223. 2, 2,
  224. 8);
  225. }
  226. } // namespace test
  227. } // namespace megdnn
  228. // vim: syntax=cpp.doxygen

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