最近测试一个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]页面文件太小,无法完成操作”解决了问题,但是不知道为何。
不知道各位大佬,有谁可以帮忙指点一二,在此谢过。