[問題描述]在Win10下訓(xùn)練YOLOv5時(shí)報(bào)錯(cuò): [WinError 1455] The paging file is too small for this operation to complete,如下圖所示

[原因分析]YOLOv5的dataloader workers數(shù)量默認(rèn)是8,當(dāng)batch-size大而內(nèi)存不夠時(shí),會(huì)發(fā)生上述錯(cuò)誤。
[解決方案一,可以解決問題,但會(huì)降低訓(xùn)練速度] 訓(xùn)練時(shí)添加參數(shù) --workers 1, 即將dataloader workers數(shù)量設(shè)置為1,這種方式雖然解決了報(bào)錯(cuò)問題,但又引入了訓(xùn)練速度陡降的問題!
那么,如何在Win10上,高效率的運(yùn)行PyTorch的多進(jìn)程呢?
用下面的代碼測(cè)試
# multi_processes_demo.py
from subprocess import Popen
import sys
procs = []
for seed in range(50):
procs.append(Popen([sys.executable, "ml_model.py", str(seed)]))
for proc in procs:
proc.wait()
# ml_model.py
import torch
import time
time.sleep(10)
運(yùn)行結(jié)果會(huì)報(bào)錯(cuò):OSError: [WinError 1455] 頁面文件太小,無法完成操作
上面的demo說明:當(dāng) Python 導(dǎo)入“torch”時(shí),它會(huì)加載這些CUDA的DLL,并將其映射到內(nèi)存中。每個(gè)加載這些 DLL 的 Python 進(jìn)程都會(huì)提交幾 GB 的內(nèi)存來加載這些 DLL。因此,如果 1 個(gè) Python 進(jìn)程正在浪費(fèi) 2GB 的內(nèi)存,運(yùn)行 8 個(gè)工作線程,則需要 16GB 的內(nèi)存來加載 DLL
[解決方法二,不能解決問題]不要勾選“自動(dòng)管理所有驅(qū)動(dòng)器的分頁大小”,然后重啟計(jì)算機(jī)。

測(cè)試結(jié)果命令如下,
python train.py --img 640 --batch-size 16 --epochs 3 --data coco.yaml --weights yolov5s.pt --optimizer Adam --workers 6
測(cè)試結(jié)果:失敗:

[解決方法三,最優(yōu)]
Python Script to disable ASLR and make nv fatbins read-only to reduce memory commit
下載:https://gist.github.com/cobryan05/7d1fe28dd370e110a372c4d268dcb2e5 到本地,然后安裝依賴包:
python -m pip install pefile
并執(zhí)行下面的命令,用于修改報(bào)信息錯(cuò)路徑下面的*.dll
python fixNvPe.py --input C:\Users\Administrator\anaconda3\envs\pytorch\Lib\site-packages\torch\lib*.dll

然后運(yùn)行:
python train.py --img 640 --batch-size 16 --epochs 3 --data coco.yaml --weights yolov5s.pt --optimizer Adam --workers 6

小tips: 調(diào)試時(shí),運(yùn)行: wandb disabled, 把wandb先關(guān)掉
總結(jié):
- DataLoader 中設(shè)置的workers數(shù)量與創(chuàng)建的 Python 進(jìn)程的數(shù)量直接相關(guān)
- 每個(gè) Python 進(jìn)程導(dǎo)入 pytorch 時(shí),它都會(huì)加載相關(guān)的 DLL。這些 DLL 中有很大一部分?jǐn)?shù)據(jù)并沒有真正使用,但無論如何都會(huì)在內(nèi)存中為它們保留空間。
- 在Linux上不會(huì)遇到上述問題,是因?yàn)長(zhǎng)inux會(huì)為內(nèi)存請(qǐng)求保留內(nèi)存空間,即便請(qǐng)求的內(nèi)存空間大于實(shí)際的物理空間,只要沒有使用,就不會(huì)有問題
- 在Win10上會(huì)遇到上述問題,是因?yàn)榧幢銢]有使用,只要請(qǐng)求的內(nèi)存空間大于實(shí)際的物理控件,Windows 就會(huì)報(bào)錯(cuò)。因此,在 Windows 上 必須滿足:NumPythonProcesses x MemoryPerProcess < RAM + PageFileSize
- 解決方案一,降低 workers數(shù)量是減少 NumPythonProcesses,可以解決,但降低了訓(xùn)練速度
- 解決方案二,修改頁面文件大小是增加 PageFileSize,實(shí)測(cè)沒作用
- 解決方案三,使用 FixNvPe.py 腳本是減少了 MemoryPerProcess,可以解決,不會(huì)降低訓(xùn)練速度!
參考資料: