1. 程式人生 > >為什麼depthwise convolution 比 convolution更加耗時? 2018年08月07日 11:33:48 文尹習習 閱讀數:608更多

為什麼depthwise convolution 比 convolution更加耗時? 2018年08月07日 11:33:48 文尹習習 閱讀數:608更多

轉自:https://blog.csdn.net/liu1152239/article/details/81478463

首先,caffe原先的gpu實現group convolution很糟糕,用for迴圈每次算一個卷積,速度極慢。 第二,cudnn7.0及之後直接支援group convolution,但本人實測,速度比github上幾個直接寫cuda kernel計算的dw convolution速度慢。例如對於n=128, c=512, h=32, w=32, group=512的卷積跑100次,cudnn 7.0裡的group convolution需要4秒多,而yonghenglh6/DepthwiseConvolution大概只需要1秒。   本人分析了一下dw convolution與普通convolution的理論計算複雜度,舉例如下: 卷積1:普通卷積,輸入為64*64*256,輸出為64*64*256,卷積核大小為3*3。 引數為3*3*256*256=590K,計算量為64*64*256*3*3*256=2.42G,計算過程的工作集記憶體總量(輸入輸出資料+引數)為64*64*256*2 + 3*3*256*256 = 2.69M。   卷積2:dw卷積,輸入為64*64*256,輸出為64*64*256,卷積核大小為3*3。 引數為3*3*256=2.3K個,計算量為64*64*256*3*3=9.44M,計算過程的工作集記憶體總量為64*64*256*2 + 3*3*256=2.10M。   卷積3:普通卷積,輸入為64*64*16,輸出為64*64*16,卷積核大小為3*3。 引數為3*3*16*16=2.3K個,計算量為64*64*16*3*3*16=9.44M,計算過程的工作集記憶體總量為64*64*16*2 + 3*3*16*16=133K。   可以看到卷積2肯定比卷積1快,因為計算量下降到1/256了,但卷積2實際上無法達到卷積1的256倍速度(我記得我測得結果大概是快10倍左右),因為工作集記憶體大小並沒有顯著降低。卷積2也無法達到卷積3的速度,因為雖然FLOPS相同,但工作集記憶體大小相差了很多倍,因此單位資料的計算密度小很多,很難充分利用GPU上的計算單元。