pytorch训练报OSError: [WinError 1455] 页面文件太小,无法完成操作

本文主要是介绍pytorch训练报OSError: [WinError 1455] 页面文件太小,无法完成操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在windows下用pytorch训练的时候,比如用yolov5(yolov8等等也一样,只要是涉及到多进程,如dataloader的num_workers设的比较大),就有可能会遇到“OSError: [WinError 1455] 页面文件太小,无法完成操作”的错误。

 上图就是用yolov5训练报的错,训练命令为:

python train.py --data data/worker_data/dataset.yaml --cfg models/yolov5s.yaml --weights weights/yolov5s.pt --batch-size 16 --epochs 200 --cache 

这里只指定了batch-size为16,workers没设,用的默认值就是8,实际num_workers取的是逻辑cpu核数(我的是16)、batch-size、workers三者的最小值,那就是取8啦。不过训练集、验证集的dataloader都会用到多进程。

 如果把batch-size改小,或者是把workers改小,那就有可能不报这个错啦,但是这明显不是解决问题的好办法,因为太小的batch-size或者workers都会降低你的训练速度。

一。问题原因

完整的来龙去脉可以看这个issue:[WinError 1455] The paging file is too small for this operation to complete. Error loading "C:\ProgramData\Anaconda3\lib\site-packages\torch\lib\caffe2_detectron_ops_gpu.dll" or one of its dependencies · Issue #1643 · ultralytics/yolov3 · GitHub

简述一下,就是pytorch里面有一些cuda相关的dll文件非常大,并且只要你导入了pytorch相关的包,就会去加载这些文件,而且在开启多进程的时候,每个进程都会去加载这些文件,实际上可能并没有用到,所以在windows下用的是虚拟内存。但如果你的虚拟内存不够大的话,那就会报页面文件太小的错了。下图就是我报错的时候截的图,我的内存是32G,虚拟内存设的是20G,全占满了。

 而在linux下就不会有这个问题,这也是很多人可能根本就没遇到这个问题的原因,因为他们都是在linux服务器上训练的。在Linux服务器上,如果是申请实际上用不到的内存,那就是表面上申请一下,什么内存都没有分配,自然不存在够不够的问题啦。

二。解决办法

1.调大虚拟内存

很明显,一个简单粗暴的办法就是,调大虚拟内存呗,到于调多大,看你实际的需要啦,反正我上面的情况基本上要分配80G到100G的虚拟内存才够。设置虚拟内存的方法可以参照其它的帖子,我就不赘述了,不过提几点:

(1)C盘空间不够没关系,虚拟内存可以分配到其它分区,而且还能配置到多个分区上

(2)最好用固态硬盘啦,机械硬盘会慢一些

2.升级pytorch版本

办法1其实也不是个好办法啦,硬盘上莫名其妙地就少了100G,有点可惜,而且如果每次它都是实打实地给你把硬盘上的内容写一遍,还是蛮伤硬盘的,尤其是固态硬盘。。。

先直接给出一个最佳方案,正如上面那个issue里所说,这个问题可能跟pytorch有关,也可能跟英伟达有关,反正你们那个dll太大啦,或者别让我每次都得加载这些dll也行。我们可以尝试一下安装更新版本的pytorch,看看这个问题解决了没有!

之前报错的环境是在conda里面,pytorch用的是1.10.1+cu113

现在来尝试一下1.13.1+cu117(cuda自然也要更新一下啦,没有尝试最新的pytorch2.0是因为yolov5貌似还不支持pytorch2.0)

 还是执行上面同样的命令,这次不报错了,虚拟内存用的还是20G,可以看到虽然仍然用了一些虚拟内存,但是跟之前需要的80G甚至100G来说,已经小很多了!

 3.使用fixNvPe.py

但是如果由于某些原因,你不能升级pytorch版本,只能用某个版本的pytorch,又不想用那么大的虚拟内存,那就可以参考上面那个issue里的解决方案

https://github.com/ultralytics/yolov3/issues/1643

1.先把fixNvPe.py下下来,比如我就放在D:\ai\pytorch\fixNvPe.py

2.pip install pefile

3.执行fixNvPe.py

cd D:\ai\pytorch\

python fixNvPe.py --input C:\Users\kv183_pro\miniconda3\envs\torch1.0\Lib\site-packages\torch\lib\*.dll

这个dll的路径就是你pytorch里面的lib目录啦,其实都不用你自己去找,仔细看上面那个报错的图,就是红框里这个路径

好,执行完了

 下面再试一下,果然可以!而且内存占用比pytorch1.13还要少,牛逼!

 这个脚本改动的dll文件都给你备份了一份,脚本作者还是很贴心的~~

 脚本的内容并不长,为了防止有人访问不了,我直接给你贴在下面了,文件名fixNvPe.py

# Simple script to disable ASLR and make .nv_fatb sections read-only
# Requires: pefile  ( python -m pip install pefile )
# Usage:  fixNvPe.py --input path/to/*.dllimport argparse
import pefile
import glob
import os
import shutildef main(args):failures = []for file in glob.glob( args.input, recursive=args.recursive ):print(f"\n---\nChecking {file}...")pe = pefile.PE(file, fast_load=True)nvbSect = [ section for section in pe.sections if section.Name.decode().startswith(".nv_fatb")]if len(nvbSect) == 1:sect = nvbSect[0]size = sect.Misc_VirtualSizeaslr = pe.OPTIONAL_HEADER.IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASEwritable = 0 != ( sect.Characteristics & pefile.SECTION_CHARACTERISTICS['IMAGE_SCN_MEM_WRITE'] )print(f"Found NV FatBin! Size: {size/1024/1024:0.2f}MB  ASLR: {aslr}  Writable: {writable}")if (writable or aslr) and size > 0:print("- Modifying DLL")if args.backup:bakFile = f"{file}_bak"print(f"- Backing up [{file}] -> [{bakFile}]")if os.path.exists( bakFile ):print( f"- Warning: Backup file already exists ({bakFile}), not modifying file! Delete the 'bak' to allow modification")failures.append( file )continuetry:shutil.copy2( file, bakFile)except Exception as e:print( f"- Failed to create backup! [{str(e)}], not modifying file!")failures.append( file )continue# Disable ASLR for DLL, and disable writing for sectionpe.OPTIONAL_HEADER.DllCharacteristics &= ~pefile.DLL_CHARACTERISTICS['IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE']sect.Characteristics = sect.Characteristics & ~pefile.SECTION_CHARACTERISTICS['IMAGE_SCN_MEM_WRITE']try:newFile = f"{file}_mod"print( f"- Writing modified DLL to [{newFile}]")pe.write( newFile )pe.close()print( f"- Moving modified DLL to [{file}]")os.remove( file )shutil.move( newFile, file )except Exception as e:print( f"- Failed to write modified DLL! [{str(e)}]")failures.append( file )continueprint("\n\nDone!")if len(failures) > 0:print("***WARNING**** These files needed modification but failed: ")for failure in failures:print( f" - {failure}")def parseArgs():parser = argparse.ArgumentParser( description="Disable ASLR and make .nv_fatb sections read-only", formatter_class=argparse.ArgumentDefaultsHelpFormatter )parser.add_argument('--input', help="Glob to parse", default="*.dll")parser.add_argument('--backup', help="Backup modified files", default=True, required=False)parser.add_argument('--recursive', '-r', default=False, action='store_true', help="Recurse into subdirectories")return parser.parse_args()###############################
# program entry point
#
if __name__ == "__main__":args = parseArgs()main( args )

这篇关于pytorch训练报OSError: [WinError 1455] 页面文件太小,无法完成操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/566689

相关文章

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

Java Multimap实现类与操作的具体示例

《JavaMultimap实现类与操作的具体示例》Multimap出现在Google的Guava库中,它为Java提供了更加灵活的集合操作,:本文主要介绍JavaMultimap实现类与操作的... 目录一、Multimap 概述Multimap 主要特点:二、Multimap 实现类1. ListMult

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示

Pytorch介绍与安装过程

《Pytorch介绍与安装过程》PyTorch因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究和开发的主流工具之一,本文给大家介绍Pyto... 目录1、Pytorch介绍1.1、核心理念1.2、核心组件与功能1.3、适用场景与优势总结1.4、优

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源