YOLOv5訓(xùn)練時(shí)報(bào)錯(cuò): [WinError 1455] The paging file is too small for this operation to complete

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

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] 頁面文件太小,無法完成操作
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ī)。

不要勾選“自動(dòng)管理...”

測(cè)試結(jié)果命令如下,

python train.py --img 640 --batch-size 16 --epochs 3 --data coco.yaml --weights yolov5s.pt --optimizer Adam --workers 6

測(cè)試結(jié)果:失敗

--workers 6,失敗

[解決方法三,最優(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

修改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)練速度!

參考資料:

  1. https://github.com/ultralytics/yolov3/issues/1643
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容