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.9 kB

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