? ? 博主電腦配置是AMD R5 3600,Nvidia RTX3060 12G,16G 3200MHz內(nèi)存,訓(xùn)練數(shù)據(jù)集是自建數(shù)據(jù)集,大約1200張圖片,3個檢測目標(biāo)。
? ? 訓(xùn)練YOLOv5-5.0版本的模型參數(shù)設(shè)置,模型是yolov5s,epoch 150(如果想要更好的mAP@0.5:0.95指標(biāo)可以設(shè)置的更大,博主這個收斂的太快了就沒設(shè)太多),batchsize 32或者64,imgsize 640,640,其他均為默認(rèn)。
? ? 在最初訓(xùn)練模型的時候訓(xùn)練一次epoch大約需要3分鐘,而且不管怎么設(shè)置參數(shù),訓(xùn)練時間都不會改變太多,都在3分鐘左右,博主期初是因為自己沒用GPU跑,但是顯存是實實在在的吃滿了,但利率用始終在0%和4%之間波動,大多數(shù)還是在0%,博主百思不得其解,百度了許多方法都沒有用,看了大部分博主的文章,然后看了看運行時候的內(nèi)存,CPU和GPU,發(fā)現(xiàn)CPU使用率不高,但是內(nèi)存和顯存占用很高,那么也就排除了在用CPU跑模型的情況,思來想去大概是出在數(shù)據(jù)讀取上。下面來介紹一些訓(xùn)練模型速度慢可能的原因和解決方法:
? ? 1.GPU太差
? ? 博主之前用的自己的GTX960m的確跑不起來,如果自己顯卡太老,顯存太低,要么降低batchsize和worker,還有imgsize,要么就換一張顯卡。三個參數(shù)的設(shè)置在train.py的設(shè)置代碼如圖
? ??2.沒用到GPU,完全是CPU在跑
? ??這種情況也很好發(fā)現(xiàn),只需要看看顯存是否被占用或者有沒有安裝pytorch和cuda,可以用如下代碼來查看是否裝了pytorch和cuda,怎么安裝很多博主已經(jīng)介紹過了,隨便一查一大堆。
import torch
print(torch.__version__)
torch.cuda.is_available()
? ? 上面代碼結(jié)果如下圖,說明正確安裝CUDA和pytorch(記得要版本對應(yīng),不然會報錯),最好把cudnn也裝上。
?
? ? 如果是CPU在訓(xùn)練,可以設(shè)置下面的代碼來更換GPU訓(xùn)練模型,default設(shè)置成你GPU的編號就行,單顯卡就是0。
? ??3.訓(xùn)練瓶頸
? ? 3.1 CPU瓶頸
? ? CPU瓶頸很好判斷,那就是CPU占用率很高,同時GPU也在使用,這說明電腦CPU太差了。設(shè)置參數(shù),盡量不讓CPU占用率超過85%。
? ? 3.2 內(nèi)存瓶頸
? ? 簡單來說就是內(nèi)存爆了,基本上不存在內(nèi)存頻率跟不上的,同樣設(shè)置參數(shù),內(nèi)存占用也盡量不要超過85%-90%。
? ? 3.3 IO瓶頸
? ? 這種情況會復(fù)雜很多,這個IO可能是硬盤讀到內(nèi)存導(dǎo)致的,也有可能是從內(nèi)存到GPU導(dǎo)致的,也有可能是讀寫記錄的時候?qū)е碌?,反正雜七雜八的,最難看出哪里出了問題。
? ? 對于以上三種瓶頸可以通過瓶頸測試工具來測試出來,具體方法下面的博客說的很清楚。
(24條消息) PyTorch消除訓(xùn)練瓶頸 提速技巧_*pprp*的博客-CSDN博客
? ? 對于前兩種瓶頸,都可以通過設(shè)置batchsize,workers和imgsize來嘗試解決,或者更換yolov5的模型,使用最小的yolov5s來訓(xùn)練,如果以上方法解決不了,建議更換硬件或者租用云服務(wù)器。對于第三種情況基本只能通過預(yù)讀取數(shù)據(jù)和更換硬件來實現(xiàn)。
? ? 4.性能過剩? ? ??
? ? 對,你沒有看錯,性能過剩也會導(dǎo)致Yolov5訓(xùn)練速度過慢,原因也很讓人無語,在train.py中有這樣一行代碼,這行代碼旨在將數(shù)據(jù)讀到內(nèi)存中進行緩存,這樣就可以更快的存取數(shù)據(jù)。
? ? 這樣讀取數(shù)據(jù)就可以讓正在工作的GPU計算完數(shù)據(jù)后不會因為硬盤讀寫太慢而等待數(shù)據(jù)讀入,所以硬盤的讀取很重要,訓(xùn)練過程中,數(shù)據(jù)首先從硬盤讀入到內(nèi)存,然后再從內(nèi)存讀取到CPU或者GPU,所以一塊好的硬盤可以有效的加速模型的訓(xùn)練,特別是筆記本硬盤,筆記本硬盤讀取速度很慢,建議把數(shù)據(jù)放入SSD中。那么問題來了,如果GPU計算速度超過了從硬盤讀入內(nèi)存,再從內(nèi)存讀入GPU的速度,并且硬盤的讀取速度夠快,會發(fā)生什么,這也是導(dǎo)致博主訓(xùn)練速度太慢的原因。
? ? 對于小批量數(shù)據(jù)(很多自建數(shù)據(jù)都是小批量數(shù)據(jù)),一兩千張,檢測目標(biāo)數(shù)不多,模型不復(fù)雜的情況下,對于高端顯卡或者專業(yè)圖形卡都是小case,基本都用不到多少算力,GPU很快就計算完了一個batch的數(shù)據(jù),這時候就要等待數(shù)據(jù)讀入,如果硬盤讀寫夠快,數(shù)據(jù)從硬盤讀入內(nèi)存,GPU再從內(nèi)存讀出,相較于直接從硬盤讀入GPU,本來用作緩存的內(nèi)存反而成了額外的開銷,數(shù)據(jù)繞了遠路,IO讀取時間反而增大了。其實說白了還是IO問題造成的,只不過原因不是硬件太差。當(dāng)然,以上內(nèi)容是博主的猜測,僅供參考。
? ? 所以,對于擁有一個好的SSD,好顯卡,內(nèi)存和CPU性能好的計算機而言,在訓(xùn)練數(shù)據(jù)量小,模型不大的情況下,建議將cacheimages關(guān)掉,直接從硬盤讀入GPU,將action='store_true'替換為action='store_false'即可,關(guān)掉之后博主一次epoch從3分鐘變成了20s,提升巨大,而且訓(xùn)練結(jié)果沒有改變。
? ? 總結(jié)
? ? 大多數(shù)情況來說都是性能不足,存在瓶頸的情況,從而導(dǎo)致模型訓(xùn)練時間長,這也是深度學(xué)習(xí)中常有的事,但是在自己硬件條件好,數(shù)據(jù)量不大的情況下,模型訓(xùn)練仍然慢,就該考慮下是不是因為性能過剩,在數(shù)據(jù)存取上花了過多的時間造成的,這表現(xiàn)為內(nèi)存和顯存使用很大,但是CPU和GPU卻不怎么占用。經(jīng)過博主一些測試,博主發(fā)現(xiàn)不管有沒有用緩存,內(nèi)存和顯存使用都很大,這應(yīng)該是pytorch底層邏輯的關(guān)系,在用GPU跑模型的時候pytorch會自動把數(shù)據(jù)緩存到顯存里,內(nèi)存使用大小僅僅和batch_size有關(guān)。
? ? 值得一提的是,雖然訓(xùn)練速度大大增加,但是依然沒有解決GPU占用率低的問題,雖然GPU占用率很低,但是不會存在一段時間為0的情況,博主推測,可能是因為數(shù)據(jù)量太小,所需要檢測目標(biāo)數(shù)不多造成計算量太小的原因。博主之前在用VOC2012數(shù)據(jù)集進行訓(xùn)練時,GPU占用率就不低,但是仍然只占用了30%-60%,不知道使用這種方法有沒有效,因為學(xué)業(yè)問題只能先跑自己數(shù)據(jù)集,如果有時間博主會更新相關(guān)結(jié)論。文章來源:http://www.zghlxwxcb.cn/news/detail-792368.html
? ? 最后,博主計算機功底不算扎實,如果有問題,希望各位讀者指正。文章來源地址http://www.zghlxwxcb.cn/news/detail-792368.html
到了這里,關(guān)于YOLOv5訓(xùn)練速度慢的一些解決方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!