【深度學習】踩坑日記:模型訓練速度過慢,GPU利用率低

問題描述

最近課程實驗在與同學交流的過程中發現自己的模型訓練速度比別人慢很多,而且使用AI Studio的Tesla V100速度與自己筆記本的GTX1050速度差別不大,跑一個ResNet50的epoch要12分鐘,一度讓我懷疑百度給我提供的是閹割版的顯卡。
尤其是訓練ResNet和VGG的時候更加發現了這個問題,使用nvidia-smi查看了一下結果如下:

顯然GPU利用率爲0就很不正常,但是有顯存佔用說明模型應該是在跑的。後來既然GPU利用不起來,我乾脆同時跑多個模型,想充分利用,但是效果還不是很明顯,速度依然都很慢。
查了查資料發現可以在Dataloader里加pin_memory=True, num_workers=8,這樣能將數據放入顯存,並且通過多線程減少數據讀入的時間,模型訓練速度會快一些。但是我試了試也沒有明顯的效果,就很奇怪。
當然也試過增大batch size,但是治標不治本。

問題原因

所以到底爲什麼導致了這個原因呢?
後來我偶然爲了減小最後的tensorboard log文件,我把一些用不到的tensorboard的寫入比如直方圖給刪掉了,發現速度瞬間提上來了,然後再減小訓練時的輸出間隔,速度也有提升。立刻明白了,是因爲訓練的主要時間都花在了寫日誌上,文件IO耗時特別多,尤其是我設置的寫入間隔還很小,所以GPU計算一瞬間,然後寫很久的記錄,計算一瞬間,再寫很久的記錄,最終導致速度特別慢。這也正是爲了速度和我筆記本的GTX1050一樣,因爲大家比的都是寫文件的速度。
最後的效果還是很好的,不愧是Tesla V100。ResNet50從最初跑一個epoch12分鐘提升到四十多秒,如果刪掉日誌寫入還能更快。而VGG16也只要二十多秒,訓練100個epoch分分鐘的事情。
另外這麼快的速度也不全是顯卡,跟前面提到的pin_memory也有關係,以及使用了PyTorch的半精度來提高速度,精度也沒有受到很大影響。
這個問題解決後我也明白爲啥之前的AlexNet跑一個epoch還要三四分鐘,五六分鐘,時間都花在寫日誌上了。以及之前跑的一個比較大的模型,也有了提速的方法,之前需要50分鐘,現在估計五六分鐘。可以很方便的做各種對比實驗與測試,效率提高的不是一點點。

總結

最後總結一下,有的時候模型訓練慢並不是因爲顯卡不行或者模型太大,而是在跑模型過程中有一些其他的操作導致速度很慢,尤其是文件的IO操作,這會導致GPU得不到連續性使用,整體速度特別慢。

模型提速技巧

  • 減少日誌IO操作頻率
  • 使用pin_memory和num_workers
  • 使用半精度訓練
  • 更好的顯卡,更輕的模型

另外也可以通過增大batch size提高epoch速度,但是收斂速度也會變慢,需要再適當升高學習率

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章