深度學習的Batchsize必須是2的n次方嗎?
大家或多或少都已經(jīng)默認了,batchsize一般都是2,8,36,64,128...因為基本上所有論文都是這么設置默認超參數(shù),大家久而久之就習慣了,至少這樣設置總不會錯吧。
其實我也有這么一個迷思,如果不設置為2的n次方會怎么樣?效果變差?效率變低?還是...
基本理論
一般而言,選擇batchsize為2的冪背后的主要思想來自于:內(nèi)存對齊和浮點效率。
內(nèi)存對齊
將batchsize選擇為2的冪的主要論點之一是CPU和GPU內(nèi)存架構是以2的冪組織的。有一個內(nèi)存頁的概念,它本質上是一個連續(xù)的內(nèi)存塊。如果使用的是macOS或Linux,可以通過在終端中執(zhí)行getconf PAGESIZE來檢查頁面大小,這應該返回一個2的冪。
這個想法是將一個或多個批次整齊地放在一個頁面上,幫助GPU中的并行處理?;蛘邠Q句話說,選擇批量大小為2,以獲得更好的內(nèi)存對齊。這與在視頻游戲開發(fā)和圖形設計中使用OpenGL和DirectX時選擇2的冪次紋理類似(并且可能受到啟發(fā))。
浮點效率
Nvidia有一個矩陣乘法背景指南,解釋了矩陣維數(shù)和圖形處理單元(GPU)計算效率之間的關系。建議將矩陣維數(shù)選擇為8的倍數(shù),在有Tensor Core的GPU上進行混合精度訓練更有效率。
將兩個矩陣A和B相乘的一種方式是通過計算矩陣A的行向量與矩陣B的列向量之間的點積。如下所示,這些是k元素向量對的點積:
每個點積由一個“加”和一個“乘”操作組成,我們有 M×N 個這樣的點積。因此,總的來說,我們有 2×M×N×K 浮點運算(FLOPS)。如果這時候使用GPU例如V100,當矩陣維度( MM , NN 和 KK )對齊為16字節(jié)的倍數(shù)時,計算效率會更好(根據(jù)Nvidia的指南)。具體來說,在FP16混合精度訓練的情況下,8的倍數(shù)是效率的最佳選擇。
實驗驗證
以下驗證都是基于在CIFAR-10上訓練MobileNetV3模型測試。
小Batchsize驗證
看起來,將批量大小減少1(127)或將批量大小增加1(129)確實會導致訓練性能稍慢。這里的差異幾乎不明顯,可以忽略不計。
大Batchsize驗證
批量大小為2的冪(或8的倍數(shù))確實會產(chǎn)生很小但幾乎不明顯的差異。
多GPU下Batchsize驗證
這一次,2的冪和8的倍數(shù)的批量大小(256)沒有快于257,所以其實實際上稍微改變Batchsize,在現(xiàn)實中影響并沒有那么明顯。
結論
如果按實踐指南來說,建議還是以2的n次方來設置batchsize比較穩(wěn)妥,一個是有理論基礎,另外一個是誰也不想因為Batchsize的個性化導致漫長的訓練過程變得更漫長。但從實際簡單的測試來看,好像影響又不是很明顯,但總體來說,Batchsize一般設置在16-256之間,是比較有效且穩(wěn)妥的做法,可供參考。
https://docs.nvidia.com/deeplearning/performance/dl-performance-matrix-multiplication/index.html#gpu-imple
??https://sebastianraschka.com/blog/2022/batch-size-2.html??
本文轉載自 ??沐白AI筆記??,作者: 楊沐白
