首先,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會將後續的包快取起來,等前面的包重...