為什麼有時Depthwise 卷積比正常卷積更耗時

2021-09-25 08:02:11 字數 1787 閱讀 2658

首先,caffe 原先的gpu實現 group convolution 很糟糕,用for迴圈每次算乙個卷積,速度極慢。

其次,cudnn7.0之後直接支援了group convolution,但本人實測,速度比github上幾個直接寫cuda kernel計算的depthwise convolution速度慢。例如對於n

=128,c

=512,h

=32,w

=32,g

roup

=512

n=128,c=512,h=32,w=32,group=512

n=128,

c=51

2,h=

32,w

=32,

grou

p=51

2的卷積,跑100次,cudnn7.0裡的group convolution需要4秒多,而yonghenglh6/depthwiseconvolution大概只需要1秒。

但本人分析了一下depthwise conv和標準卷積的理論計算複雜度,舉例如下:

這裡flops的計算和引數數量的計算參考自

對於乙個標準卷積層,假設其大小是h×w

×c×n

h\times w\times c\times n

h×w×c×

n,其中c

cc是輸入通道數,n

nn是輸出通道數,h,w

h,wh,

w分別是卷積核的高度和寬度,輸出的特徵圖大小是h′×

w′

h'\times w'

h′×w

′,則該卷積層

n um

para

ms=n

×(h×

w×c+

1)

num_ = n\times (h\times w\times c + 1)

numpar

ams​

=n×(

h×w×

c+1)

n um

flop

s=h′

×w′×

n×(h

×w×c

+1

)num_ = h'\times w' \times n\times (h\times w\times c+1)

numflo

ps​=

h′×w

′×n×

(h×w

×c+1

)即flop

s=h′

×w′×

nump

aram

sflops=h'\times w'\times num_

flops=

h′×w

′×nu

mpar

ams​

.可以看到卷積2肯定比卷積1快,因為計算量下降到了1

/256

1/256

1/25

6,但卷積2實際上無法達到卷積1速度的256倍(我記得我測得結果大概是快10倍左右),因為工作集記憶體大小並沒有顯著降低。卷積2也無法達到卷積3的速度,雖然flops相同,但工作集記憶體大小相差了很多倍,因此單位資料的計算密度小很多,很難充分利用gpu的計算單元。

cudnn 7 才開始支援 depthwise convolution,cudnn支援之前,大部分gpu下的實現都是for迴圈遍歷所有group,所以group很多時極慢。

正確的應該用這個

優化:optimize deep learning gpu operators with tvm: a depthwise convolution example

為什麼UDP有時比TCP更有優勢

隨著網路技術飛速發展,網速已不再是傳輸的瓶頸,udp協議以其簡單 傳輸快的優勢,在越來越多場景下取代了tcp,如網頁瀏覽 流 實時遊戲 物聯網。cdn服務商akamai nasdaq akam 報告從2008年到2015年7年時間,各個國家網路平均速率由1.5mbps提公升為5.1mbps,網速提公...

為什麼UDP有時比TCP更有優勢

隨著網路技術飛速發展,網速已不再是傳輸的瓶頸,udp協議以其簡單 傳輸快的優勢,在越來越多場景下取代了tcp,如網頁瀏覽 流 實時遊戲 物聯網。cdn服務商akamai nasdaq akam 報告從2008年到2015年7年時間,各個國家網路平均速率由1.5mbps提公升為5.1mbps,網速提公...

為什麼UDP有時比TCP更有優勢

網速的提公升給udp的穩定性提供可靠網路保障,丟包率很低,如果使用應用層重傳,能夠確保傳輸的可靠性。tcp為了實現網路通訊的可靠性,使用了複雜的擁塞控制演算法,建立了繁瑣的握手過程,由於 tcp內建的系統協議棧中,極難對其進行改進。採用 tcp,一旦發生丟包,tcp會將後續的包快取起來,等前面的包重...