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_conv3d.cpp 9.6 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. /**
  2. * \file dnn/test/cuda/group_conv3d.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/common/benchmarker.h"
  13. #include "test/common/checker.h"
  14. #include "test/common/convolution3d.h"
  15. #include "test/cuda/fixture.h"
  16. #include "src/cuda/utils.h"
  17. namespace megdnn {
  18. namespace test {
  19. TEST_F(CUDA, GROUP_CONVOLUTION3D_FORWARD) {
  20. bool is_int_available = cuda::is_compute_capability_required(6, 1);
  21. static_cast<void>(is_int_available);
  22. auto run = [&](size_t N, size_t IC, size_t ID, size_t IH, size_t IW,
  23. size_t FD, size_t FH, size_t FW, size_t OC, size_t PD,
  24. size_t PH, size_t PW, size_t SD, size_t SH, size_t SW,
  25. size_t DD, size_t DH, size_t DW, size_t group) {
  26. {
  27. // float case
  28. Checker<Convolution3D> checker(handle_cuda());
  29. Convolution3D::Param param;
  30. param.sparse = Convolution3D::Param::Sparse::GROUP;
  31. param.pad_d = PD;
  32. param.pad_h = PH;
  33. param.pad_w = PW;
  34. param.stride_d = SD;
  35. param.stride_h = SH;
  36. param.stride_w = SW;
  37. param.dilate_d = DD;
  38. param.dilate_h = DH;
  39. param.dilate_w = DW;
  40. auto ICpg = IC / group;
  41. auto OCpg = OC / group;
  42. checker.set_param(param).exec(
  43. {{N, IC, ID, IH, IW}, {group, OCpg, ICpg, FD, FH, FW}, {}});
  44. }
  45. };
  46. // normal case
  47. run(2, 64, 7, 7, 7, 1, 1, 1, 32, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2);
  48. run(1, 2, 2, 2, 2, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2);
  49. run(2, 64, 7, 7, 7, 3, 3, 3, 32, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2);
  50. // padded case
  51. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 2, 2, 2, 1, 1, 1, 1, 1, 1, 4);
  52. // strided case
  53. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 0, 0, 0, 2, 2, 2, 1, 1, 1, 8);
  54. // dilated case
  55. #if CUDNN_MAJOR >= 6
  56. run(10, 4, 64, 64, 12, 3, 2, 2, 64, 0, 0, 0, 1, 1, 1, 3, 4, 2, 4);
  57. #else
  58. #endif
  59. }
  60. TEST_F(CUDA, GROUP_CONVOLUTION3D_FORWARD_1x1x1) {
  61. auto run = [&](size_t N, size_t IC, size_t ID, size_t IH, size_t IW,
  62. size_t FD, size_t FH, size_t FW, size_t OC, size_t group) {
  63. Checker<Convolution3D> checker(handle_cuda());
  64. checker.set_before_exec_callback(AlgoChecker<Convolution3DForward>(
  65. ExecutionPolicyAlgoName{"CUDA:GROUP_CONV3D_FORWARD",
  66. {{"1x1x1",
  67. {}}}}));
  68. Convolution3D::Param param;
  69. param.sparse = Convolution3D::Param::Sparse::GROUP;
  70. auto ICg = IC / group;
  71. auto OCg = OC / group;
  72. checker.set_param(param).exec(
  73. {{N, IC, ID, IH, IW}, {group, OCg, ICg, FD, FH, FW}, {}});
  74. };
  75. size_t ic = 192;
  76. for (size_t g = 2; g <= 4; g += 1) {
  77. for (size_t id = 4; id <= 16; id *= 2) {
  78. size_t iw = id, ih = id;
  79. run(2, ic, id, ih, iw, 1, 1, 1, ic / g, g);
  80. run(2, ic, id + 1, ih + 1, iw + 1, 1, 1, 1, ic / g, g);
  81. }
  82. }
  83. }
  84. TEST_F(CUDA, GROUP_CONVOLUTION3D_BACKWARD_DATA) {
  85. auto run = [&](size_t N, size_t IC, size_t ID, size_t IH, size_t IW,
  86. size_t FD, size_t FH, size_t FW, size_t OC, size_t OD,
  87. size_t OH, size_t OW, size_t PD, size_t PH, size_t PW,
  88. size_t SD, size_t SH, size_t SW, size_t group) {
  89. Checker<Convolution3DBackwardData> checker(handle_cuda());
  90. Convolution3DBackwardData::Param param;
  91. param.sparse = Convolution3D::Param::Sparse::GROUP;
  92. param.pad_d = PD;
  93. param.pad_h = PH;
  94. param.pad_w = PW;
  95. param.stride_d = SD;
  96. param.stride_h = SH;
  97. param.stride_w = SW;
  98. auto ICg = IC / group;
  99. auto OCg = OC / group;
  100. checker.set_param(param).exec({{group, OCg, ICg, FD, FH, FW},
  101. {N, OC, OD, OH, OW},
  102. {N, IC, ID, IH, IW}});
  103. };
  104. // bug case in prev ver
  105. run(1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 0, 0, 1, 1, 1, 1, 2);
  106. run(1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 0, 0, 1, 1, 1, 2, 2);
  107. run(1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 0, 1, 0, 1, 2, 1, 2);
  108. run(1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 0, 0, 2, 1, 1, 2);
  109. // normal case
  110. run(2, 64, 7, 7, 7, 3, 3, 3, 32, 5, 5, 5, 0, 0, 0, 1, 1, 1, 2);
  111. // padded case
  112. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 7, 7, 7, 1, 1, 1, 1, 1, 1, 4);
  113. // strided case
  114. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 3, 3, 3, 0, 0, 0, 2, 2, 2, 8);
  115. // bigger case
  116. run(2, 32, 64, 64, 64, 3, 3, 3, 32, 62, 62, 62, 0, 0, 0, 1, 1, 1, 4);
  117. }
  118. TEST_F(CUDA, GROUP_CONVOLUTION3D_BACKWARD_DATA_CUDNN) {
  119. auto run = [&](size_t N, size_t IC, size_t ID, size_t IH, size_t IW,
  120. size_t FD, size_t FH, size_t FW, size_t OC, size_t OD,
  121. size_t OH, size_t OW, size_t PD, size_t PH, size_t PW,
  122. size_t SD, size_t SH, size_t SW, size_t group) {
  123. Checker<Convolution3DBackwardData> checker(handle_cuda());
  124. checker.set_before_exec_callback(
  125. AlgoChecker<Convolution3DBackwardData>(ExecutionPolicyAlgoName{
  126. "CUDA:GROUP_CONV3D_BACKWARD_DATA", {{"CUDNN", {}}}}));
  127. Convolution3DBackwardData::Param param;
  128. param.sparse = Convolution3D::Param::Sparse::GROUP;
  129. param.pad_d = PD;
  130. param.pad_h = PH;
  131. param.pad_w = PW;
  132. param.stride_d = SD;
  133. param.stride_h = SH;
  134. param.stride_w = SW;
  135. auto ICg = IC / group;
  136. auto OCg = OC / group;
  137. checker.set_param(param).exec({{group, OCg, ICg, FD, FH, FW},
  138. {N, OC, OD, OH, OW},
  139. {N, IC, ID, IH, IW}});
  140. };
  141. // bug case in prev ver
  142. run(1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 0, 0, 1, 1, 1, 1, 2);
  143. run(1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 0, 0, 1, 1, 1, 2, 2);
  144. run(1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 0, 1, 0, 1, 2, 1, 2);
  145. run(1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 0, 0, 2, 1, 1, 2);
  146. // normal case
  147. run(2, 64, 7, 7, 7, 3, 3, 3, 32, 5, 5, 5, 0, 0, 0, 1, 1, 1, 2);
  148. // padded case
  149. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 7, 7, 7, 1, 1, 1, 1, 1, 1, 4);
  150. // strided case
  151. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 3, 3, 3, 0, 0, 0, 2, 2, 2, 8);
  152. // bigger case
  153. run(2, 32, 64, 64, 64, 3, 3, 3, 32, 62, 62, 62, 0, 0, 0, 1, 1, 1, 4);
  154. }
  155. TEST_F(CUDA, GROUP_CONVOLUTION3D_BACKWARD_FILTER) {
  156. auto run = [&](size_t N, size_t IC, size_t ID, size_t IH, size_t IW,
  157. size_t FD, size_t FH, size_t FW, size_t OC, size_t OD,
  158. size_t OH, size_t OW, size_t PD, size_t PH, size_t PW,
  159. size_t SD, size_t SH, size_t SW, size_t group) {
  160. Checker<Convolution3DBackwardFilter> checker(handle_cuda());
  161. Convolution3DBackwardFilter::Param param;
  162. param.sparse = Convolution3D::Param::Sparse::GROUP;
  163. param.pad_d = PD;
  164. param.pad_h = PH;
  165. param.pad_w = PW;
  166. param.stride_d = SD;
  167. param.stride_h = SH;
  168. param.stride_w = SW;
  169. auto ICg = IC / group;
  170. auto OCg = OC / group;
  171. checker.set_param(param).exec({{N, IC, ID, IH, IW},
  172. {N, OC, OD, OH, OW},
  173. {group, OCg, ICg, FD, FH, FW}});
  174. };
  175. // normal case
  176. run(2, 64, 7, 7, 7, 3, 3, 3, 32, 5, 5, 5, 0, 0, 0, 1, 1, 1, 2);
  177. // padded case
  178. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 7, 7, 7, 1, 1, 1, 1, 1, 1, 4);
  179. // strided case
  180. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 3, 3, 3, 0, 0, 0, 2, 2, 2, 8);
  181. }
  182. TEST_F(CUDA, GROUP_CONVOLUTION3D_BACKWARD_FILTER_CUDNN) {
  183. auto run = [&](size_t N, size_t IC, size_t ID, size_t IH, size_t IW,
  184. size_t FD, size_t FH, size_t FW, size_t OC, size_t OD,
  185. size_t OH, size_t OW, size_t PD, size_t PH, size_t PW,
  186. size_t SD, size_t SH, size_t SW, size_t group) {
  187. Checker<Convolution3DBackwardFilter> checker(handle_cuda());
  188. checker.set_before_exec_callback(
  189. AlgoChecker<Convolution3DBackwardFilter>(
  190. ExecutionPolicyAlgoName{
  191. "CUDA:GROUP_CONV3D_BACKWARD_FILTER",
  192. {{"CUDNN", {}}}}));
  193. Convolution3DBackwardFilter::Param param;
  194. param.sparse = Convolution3D::Param::Sparse::GROUP;
  195. param.pad_d = PD;
  196. param.pad_h = PH;
  197. param.pad_w = PW;
  198. param.stride_d = SD;
  199. param.stride_h = SH;
  200. param.stride_w = SW;
  201. auto ICg = IC / group;
  202. auto OCg = OC / group;
  203. checker.set_param(param).exec({{N, IC, ID, IH, IW},
  204. {N, OC, OD, OH, OW},
  205. {group, OCg, ICg, FD, FH, FW}});
  206. };
  207. // normal case
  208. run(2, 64, 7, 7, 7, 3, 3, 3, 32, 5, 5, 5, 0, 0, 0, 1, 1, 1, 2);
  209. // padded case
  210. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 7, 7, 7, 1, 1, 1, 1, 1, 1, 4);
  211. // strided case
  212. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 3, 3, 3, 0, 0, 0, 2, 2, 2, 8);
  213. }
  214. } // namespace test
  215. } // namespace megdnn
  216. // vim: syntax=cpp.doxygen

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