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

发布于:2022-12-16 ⋅ 阅读:(476) ⋅ 点赞:(0)

最近测试一个python脚本,为了避免GPU抢占的问题,程序全部使用了CPU模式,即使用参数 “--gpu_ids -1”运行。

测试发现:

进程运行,程序无问题。

线程运行,程序无问题,但是采用多线程的时候,程序变得不稳定,具体表现为:

当使用3个及以下线程时,程序正常运行。

当使用4个线程时,部分出错,但是一旦出错之后,后面全部出错。

当使用超过4个线程时,全部出错。

出错界面如下:

 网上搜索这个错误,一般说增加虚拟内存资源即可解决问题,但是根据我的亲自测试,这个方法无效,增加了程序所在的盘的虚拟内存自动管理,问题依旧。

以下,贴出模块代码:

//author:autumoon
//mail:9506#163.com
//日期:2022-09-15 
from argparse import ArgumentParser

import utils
import torch
from models.basic_model import CDEvaluator

import os

"""
quick start

sample files in ./samples

save prediction files in the ./samples/predict

"""


def get_args():
    # ------------
    # args
    # ------------
    parser = ArgumentParser()

    #autumoon
    # parser.add_argument('--imgpathA', default='', type=str)
    # parser.add_argument('--imgpathB', default='', type=str)
    # parser.add_argument('--imgPathDst', default='', type=str)
    parser.add_argument('--imgPathA', default='D:\\Personal\\Desktop\\A.tif', type=str)
    parser.add_argument('--imgPathB', default='D:\\Personal\\Desktop\\B.tif', type=str)

    parser.add_argument('--project_name', default='BIT_LEVIR', type=str)
    parser.add_argument('--gpu_ids', type=str, default='0', help='gpu ids: e.g. 0  0,1,2, 0,2. use -1 for CPU')
    parser.add_argument('--checkpoint_root', default='checkpoints', type=str)
    parser.add_argument('--output_folder', default='D:\\Personal\\Desktop\\', type=str)

    # data
    parser.add_argument('--num_workers', default=0, type=int)
    parser.add_argument('--dataset', default='user_input', type=str)
    parser.add_argument('--data_name', default='user_name', type=str)

    parser.add_argument('--batch_size', default=1, type=int)
    parser.add_argument('--split', default="user", type=str)
    parser.add_argument('--img_size', default=256, type=int)

    # model
    parser.add_argument('--n_class', default=2, type=int)
    parser.add_argument('--net_G', default='base_transformer_pos_s4_dd8_dedim8', type=str,
                        help='base_resnet18 | base_transformer_pos_s4_dd8 | base_transformer_pos_s4_dd8_dedim8|')
    parser.add_argument('--checkpoint_name', default='best_ckpt.pt', type=str)

    args = parser.parse_args()
    return args


if __name__ == '__main__':

    args = get_args()
    utils.get_device(args)
    device = torch.device("cuda:%s" % args.gpu_ids[0]
                          if torch.cuda.is_available() and len(args.gpu_ids)>0
                        else "cpu")
    args.checkpoint_dir = os.path.join(args.checkpoint_root, args.project_name)
    os.makedirs(args.output_folder, exist_ok=True)

    log_path = os.path.join(args.output_folder, 'log_vis.txt')

    data_loader = utils.get_loader(args.data_name, img_size=args.img_size,
                                   batch_size=args.batch_size,
                                   split=args.split, is_train=False,
                                   dataset='MyDataset', imgPathA=args.imgPathA, imgPathB=args.imgPathB)

    model = CDEvaluator(args)
    model.load_checkpoint(args.checkpoint_name)
    model.eval()

    #only predict one group
    assert (data_loader.batch_size == 1)

    for i, batch in enumerate(data_loader):
        name = batch['name']
        print('process: %s' % name)
        score_map = model._forward_pass(batch)
        model._save_predictions()

因为个人电脑配置较高,实测过程中内存的占用率都很低,平均20%以下,总虚拟内存设置也达到18G左右,CPU占用率也不高,平均40%以下,所以怀疑不是配置问题。

个人想到一个办法,如果将python程序封装为exe,是不是就可以保证各线程独立了呢,于是将python程序封装为exe,一番调试之后,问题没有任何变化,之前问题什么样的,现在问题依旧。

 本次出错信息如下:

OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading "D:\MyItems\CDMatrix\install\bin\debug\inference_cd\torch\lib\cudnn_adv_infer64_8.dll" or one of its dependencies.

发现,封装python,没有任何帮助,后台可以查看到,封装的本质仍然是调用了python.exe对脚本进行解释。

目前,从错误提示看,或跟虚拟内存有关,或者跟cudnn有关,但问题暂时不知如何解决。

目前暂时使用“OSError: [WinError 1455]页面文件太小,无法完成操作”解决了问题,但是不知道为何。

不知道各位大佬,有谁可以帮忙指点一二,在此谢过。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到