最近测试一个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 后查看