顯存占用 = 模型顯存占用 + batch_size × 每個樣本的顯存占用
時間更寶貴,盡可能使模型變快(減少 flop)
顯存占用不是和 batch size 簡單成正比,模型自身的參數及其延伸出來的數據也要占據顯存
batch size 越大,速度未必越快。在你充分利用計算資源的時候,加大 batch size 在速度上的提升很有限
尤其是 batch-size,假定 GPU 處理單元已經充分利用的情況下:
增大 batch size 能增大速度,但是很有限(主要是並行計算的優化)
增大 batch size 能減緩梯度震盪,需要更少的迭代優化次數,收斂的更快,但是每次迭代耗時更長。
增大 batch size 使得一個 epoch 所能進行的優化次數變少,收斂可能變慢,從而需要更多時間才能收斂(比如 batch_size 變成全部樣本數目)
完成每個epoch運算的所需的全部時間主要卡在:
load數據的時間,
每個epoch的iter數量。
因此對於每個epoch,不管是純計算時間還是全部時間,大體上還是大batch能夠更節約時間一點,但隨着batch增大,iter次數減小,完成每個epoch的時間更取決於加載數據所需的時間,此時也不見得大batch能帶來多少的速度增益了。
batch size過小,花費時間多,同時梯度震盪嚴重,不利於收斂;batch size過大,不同batch的梯度方向沒有任何變化,容易陷入局部極小值。
我們選取batch size時不妨這樣操作:
當有足夠算力時,選取batch size為32或更小一些。
算力不夠時,在效率和泛化性之間做trade-off,盡量選擇更小的batch size。
當模型訓練到尾聲,想更精細化地提高成績(比如論文實驗/比賽到最后),有一個有用的trick,就是設置batch size為1,即做純SGD,慢慢把error磨低。
step:一次梯度更新(一個batch跑完) epoch(數據集跑一遍) iter數量=數據集大小/batch size
參考:batchsize大小對訓練速度的影響 訓練時GPU顯存太小問題、batchsize 的大小跟GPU的顯存的關系 怎么選取訓練神經網絡時的Batch size?