3D數(shù)據(jù)的深度學(xué)習(xí)目前研究遠(yuǎn)不如2D深度學(xué)習(xí)成熟,其中最大的一個(gè)原因之一就是收到硬件條件的限制。3D數(shù)據(jù)雖說只比2D數(shù)據(jù)增加了一個(gè)維度,但所占據(jù)的內(nèi)存卻是成倍的增長。對于3D數(shù)據(jù)的深度學(xué)習(xí),我們會分析其在CPU內(nèi)存和GPU顯存兩方面的限制,希望大家能夠充分利用自己的資源進(jìn)行深度學(xué)習(xí)。
1. 硬件配置推薦
CPU: 大內(nèi)存,多核(很關(guān)鍵,越多越好)高性能CPU
GPU: 大顯存(24G以上),比如A6000(48G),TeslaV100(32G)
服務(wù)器集群: 每個(gè)節(jié)點(diǎn)多CPU,大內(nèi)存,多卡(GPU)
2. 深度學(xué)習(xí)流程及遇到的問題
在深度學(xué)習(xí)代碼中,以pytorch為例,CPU往往負(fù)責(zé)著數(shù)據(jù)讀取/加載,數(shù)據(jù)增強(qiáng)的部分。而GPU負(fù)責(zé)模型模型的訓(xùn)練。
在CPU上完成數(shù)據(jù)讀取,數(shù)據(jù)增強(qiáng)之后,將數(shù)據(jù)傳到GPU上進(jìn)行訓(xùn)練。所以我們的數(shù)據(jù)要同時(shí)滿足CPU和GPU的限制。在執(zhí)行程序時(shí),我們既不能超過CPU內(nèi)存的限制(否則會發(fā)生線程中斷,程序卡死),也不能超過GPU顯存的限制(否則會發(fā)生OOM)。但同時(shí),我們也希望盡可能最大化的利用內(nèi)存和顯存,提高我們的訓(xùn)練速度,特別對于3D數(shù)據(jù),一般只能使用較小的batch_size, 所以訓(xùn)練時(shí)間往往非常長,正確的參數(shù)設(shè)置可以大大提高我們的訓(xùn)練時(shí)間。下面我會像大家介紹如何在不超過自己內(nèi)存/顯存限制的情況下優(yōu)化參數(shù)配置,加速訓(xùn)練。
3. CPU內(nèi)存限制及參數(shù)設(shè)置
首先我們要知道,在進(jìn)行訓(xùn)練時(shí),我們的cpu并不是每次一讀取batch個(gè)數(shù)據(jù)進(jìn)行網(wǎng)絡(luò)更新,再讀取下一個(gè)batch數(shù)據(jù)進(jìn)行訓(xùn)練。這里有一個(gè)關(guān)鍵參數(shù):num_workers Pytorch dataloader中的num_workers (選擇最合適的num_workers值)
dataloader一次性創(chuàng)建num_worker個(gè)worker,(也可以說dataloader一次性創(chuàng)建num_worker個(gè)工作進(jìn)程,worker也是普通的工作進(jìn)程),并用batch_sampler將指定batch分配給指定worker,worker將它負(fù)責(zé)的batch加載進(jìn)RAM。
num_worker設(shè)置得大,好處是尋batch速度快,因?yàn)橄乱惠喌腷atch很可能在上一輪/上上一輪…迭代時(shí)已經(jīng)加載好了。壞處是內(nèi)存開銷大,也加重了CPU負(fù)擔(dān)(worker加載數(shù)據(jù)到RAM的進(jìn)程是CPU復(fù)制的嘛)。num_workers的經(jīng)驗(yàn)設(shè)置值是自己電腦/服務(wù)器的CPU核心數(shù),如果CPU很強(qiáng)、RAM也很充足,就可以設(shè)置得更大些。
num_worker小了的情況,主進(jìn)程采集完最后一個(gè)worker的batch。此時(shí)需要回去采集第一個(gè)worker產(chǎn)生的第二個(gè)batch。如果該worker此時(shí)沒有采集完,主線程會卡在這里等。(這種情況出現(xiàn)在,num_works數(shù)量少或者batchsize 比較小,顯卡很快就計(jì)算完了,CPU對GPU供不應(yīng)求。
num_works數(shù)量越多,CPU準(zhǔn)備數(shù)據(jù)越快 pytorch dataloader 使用batch和 num_works參數(shù)的原理是什么?
紅線情況:數(shù)據(jù)很大,num_works很少GPU計(jì)算完成后想要拿到下一個(gè)批次的數(shù)據(jù)時(shí)發(fā)現(xiàn)CPU還沒準(zhǔn)備好數(shù)據(jù)。要等待很久才能開始下一次計(jì)算,從而影響到GPU使用率。是3D數(shù)據(jù)訓(xùn)練時(shí)常見到的情況。
最好的情況是紫線這種:GPU計(jì)算的過程中CPU已經(jīng)準(zhǔn)備好數(shù)據(jù)了。等GPU計(jì)算完上一個(gè)批次數(shù)據(jù),直接把下一個(gè)批次數(shù)據(jù)發(fā)給GPU。
由于3D數(shù)據(jù)很大,我們的batch_size因?yàn)轱@存的限制往往只能設(shè)置的很小(比如2,4,6)所以網(wǎng)絡(luò)在收到小batch_size個(gè)數(shù)據(jù)之后往往很快就完成了訓(xùn)練,等待下一批batch數(shù)據(jù)到來。因此,對于體積較大的3D數(shù)據(jù),其時(shí)間限制主要來自于數(shù)據(jù)讀取部分,因此,數(shù)據(jù)的并行讀取比較重要,我們希望使用盡量多個(gè)CPU同時(shí)讀取數(shù)據(jù)。也就是說,在不超過我們的內(nèi)存限制的情況下,num_worker越大越好。
對于PC,首先我們需要查看自己的硬件配置,有多少個(gè)CPU,num_worker不能超過CPU個(gè)數(shù)。
對于服務(wù)器,多個(gè)腳本程序往往在一個(gè)節(jié)點(diǎn)上執(zhí)行,這些程序共享這個(gè)節(jié)點(diǎn)的內(nèi)存和CPU,所以我們要合理安排每個(gè)程序的CPU使用數(shù)量以及內(nèi)存占用率。如果是特別大的3D數(shù)據(jù),建議一個(gè)節(jié)點(diǎn)只執(zhí)行這一個(gè)程序,來充分利用CPU資源
我們可以使用htop
命令來查看自己的CPU個(gè)數(shù)以及內(nèi)存使用情況
如圖,我一共有64個(gè)CPU,內(nèi)存最大為188G
理論上說,我的num_worker最大可以設(shè)置為64,但實(shí)際上,當(dāng)64個(gè)CPU同時(shí)加載數(shù)據(jù),很容易超出188G內(nèi)存的限制,如果我們使用服務(wù)器的話,可以使用以下命令對每個(gè)CPU所使用的最大內(nèi)存做出限制:
#SBATCH --mem-per-cpu=3G
180G內(nèi)存/60個(gè)CPU = 3G,當(dāng)每個(gè)CPU只使用3G內(nèi)存,就不會超過最大內(nèi)存了。
然而,當(dāng)我們的數(shù)據(jù)非常大,我們就需要降低num_worker的個(gè)數(shù)來避免超出內(nèi)存,比如說我們的原始數(shù)據(jù)大小為(834,224,834,3),在多個(gè)CPU讀取數(shù)據(jù)時(shí)會占用特別大的內(nèi)存,所以我們要測試num_worker對于不同數(shù)據(jù)的最大值
經(jīng)過測試,對于(834,224,834,3)的3D數(shù)據(jù),num_workers最大值為18,如果再大的話多個(gè)CPU讀取數(shù)據(jù)產(chǎn)生的峰值會超過內(nèi)存限制,從而引起程序中斷
4. GPU顯存限制及參數(shù)設(shè)置
對于3D數(shù)據(jù)訓(xùn)練,超過GPU顯存最大值(OOM)是最常遇到的問題。減小Batch_size是簡單的做法,但是很多情況下Batch_size已經(jīng)很小了,沒法再小。
下面是三種解決辦法,根據(jù)不同的情況選擇:
- DataParallel: 模型不算很大,batch_size 較小時(shí)能夠運(yùn)行沒有OOM,但效果不好,希望增大batch_size進(jìn)行訓(xùn)練??梢允褂媚P筒⑿袛U(kuò)大batch_size, 使用4張卡同時(shí)訓(xùn)練的話可以將batch_size擴(kuò)大4倍。
- Model parallel:模型非常大,一張卡放不下,可以將模型的不同部分放到不同卡上進(jìn)行訓(xùn)練。適用于多支路網(wǎng)絡(luò),將不同支路放到不同卡上,不會對訓(xùn)練時(shí)間造成太大影響。若是單支路網(wǎng)絡(luò)使用模型并行,訓(xùn)練時(shí)間會變長。
- Gradient checkpointing:模型非常大,一張卡放不下,但是只有一張卡。將模型分段保存,在訓(xùn)練時(shí)會分段進(jìn)行訓(xùn)練,會明顯增長訓(xùn)練時(shí)間,預(yù)算有限的情況下可以使用。
服務(wù)器集群上的DataParallel詳情見我之前的教程:[pytorch] 分布式訓(xùn)練 Distributed Data-Parallel Training (DDP)
模型并行Model parallel的教程會在以后發(fā)文章來源:http://www.zghlxwxcb.cn/news/detail-497013.html
因?yàn)閎atch_size很小,所以各種加速訓(xùn)練的技巧表現(xiàn)都不是很好,我們只討論OOM的解決辦法文章來源地址http://www.zghlxwxcb.cn/news/detail-497013.html
到了這里,關(guān)于[3D數(shù)據(jù)深度學(xué)習(xí)] (PC/服務(wù)器集群cluster)CPU內(nèi)存/GPU顯存限制及解決辦法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!