如何提高GPU利用率(更新中)
核心宗旨:通過調整網絡結構,batcsize大小,worker 數量,讓數據讀取的時間與網絡前向傳播和反向更新時間大致相同
-
一般的瓶頸就在 I/O 上面,因此可以預先把很多圖片、特征等小文件存儲到 LMDB 數據庫,加快磁盤 I/O 速度,工具傳送門, 項目首頁有安裝方法。
-
如果網絡本身很簡單,那么增加batchsize是無濟於事的,因為網絡訓練很快,時間還是在等數據,因此應該適當降低 batchsize 大小,並同時增加 worker 數量,進而減少一個 batch 數據讀取時間,力求達到與網絡前向,后向時間一致,充分發揮多 worker 的優勢。可以通過
top
命令估計 worker 的數量,如果每個 worker 的 CPU 利用率都不是0,那么就是合適的。
注意:
- batchsize 並不是越大越好,一方面,batchsize越大那么 variance 估計越准確,但是導致 bias 估計不准,模型未必有好的效果。另一方面,簡單網絡增加batchsize會讓數據准備時間更長,GPU利用率顯然上不去。
- worker 並不是越大越好,worker 越多進程之間通信越復雜,內存占用也很高,並且通過觀察發現,pytroch 的 batch 讀取通常是根據 worker 的數量一次性讀取完成才會給出一個 batch。舉例:batchsize 20,worker 3,那么當獲得到第一個 batch 即數據為20的時候,並不會開始模型的訓練,而是等待
20*3
讀取完成之后才會進行模型訓練,並且后兩個2*20
batch 的讀取時間極短,大部分時間都集中在第一個 batch 上。