车型比对 pt模型读取+集群显卡加载

问题情况:在将70.213上reid strong baseline工程相关数据移到80.2上后,原本保存时保存optimizer、model、param等多个模型,移动后保存的是一个模型
当前需要
1)将保存的一个模型运用起来测试模型效果
2)查看为什么之前多个模型分开保存而现在只保存一个模型
3)单独在集群上测试时没有gpu:0时模型的测试问题

答案:
1.在使用reid strong baseline的demo.py测试模型效果时,出现以下报错:
在这里插入图片描述
最下方是Key Error:‘model’
说明当前加载的模型字典中存在错误的无法解读的key
之前网络各层参数打印出来,key一般为各层名,value为权重矩阵,基本不会出现’model’这样的key,因此找到报错的地方,在modeling/baseline.py文件中

param_dict = torch.load(trained_path)
        # param_dict = torch.load(trained_path,map_location='cpu')  #不使用gpu加载模型测试
print("type(param_dict) ",type(param_dict))
print("########param_dict####### ",param_dict)

torch.load读取到模型后,打印出param_dict类型为dict,打印内部内容为
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可见,该模型数据存储使用’model’ ‘optimizer’ 'param_groups’等关键字key与对应权重形成字典dict形式存储,在70.213上model、optimizer等模型是分开多个pth文件存储权重的,但是在80.2上所有权重外包了一层dict存储到一个pt文件中

因此,将原本模型参数读取内容从

def load_param(self, trained_path):
    print("trained_path ",trained_path)
    # param_dict = torch.load(trained_path).state_dict()
    param_dict = torch.load(trained_path)
    # param_dict = torch.load(trained_path,map_location='cpu')  #不使用gpu加载模型测试
    # print("type(param_dict) ",type(param_dict))
    # print("########param_dict####### ",param_dict)
    for i in param_dict:
        if 'classifier' in i:
            continue
        self.state_dict()[i].copy_(param_dict[i])

变为

def load_param(self, trained_path):
    print("trained_path ",trained_path)
    # param_dict = torch.load(trained_path).state_dict()
    param_dict = torch.load(trained_path)
    # param_dict = torch.load(trained_path,map_location='cpu')  #不使用gpu加载模型测试
    # print("type(param_dict) ",type(param_dict))
    # print("########param_dict####### ",param_dict)
    for i in param_dict['model']:
        if 'classifier' in i:
            continue
        if 'model' in i:
            continue
        self.state_dict()[i].copy_(param_dict['model'][i])

即可将model中的权重读取出来

另:

param_dict = torch.load(trained_path)['model']

只修改上述语句不能实现对应功能,会报错

2.集群测试gpu与cpu选择
当直接在集群上测试但是没有申请显卡时,会报错:

RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is Fal

在torch.load中加map_location='cpu’为不使用gpu加载模型

param_dict = torch.load(trained_path)
param_dict = torch.load(trained_path,map_location='cpu') #不使用gpu加载模型测试

使用cpu加载模型需要搭配demo_chexing_wqs.py中下面的逻辑

model.load_param(cfg.TEST.WEIGHT)
device = cfg.MODEL.DEVICE   #此时获取的device默认为'cuda'
#print("device--------",device)
#device='cpu'  #打开这句则是使用cpu测试
model = model.to(device)
model.eval()

在集群上申请显卡进行测试

srun -p algorithm-chejian -N 1 --gres=gpu:1 python tools/my/demo_chexing_wqs.py

此时可以打开cuda或者gpu

另:
https://blog.csdn.net/weixin_36670529/article/details/104367696

pytorch中model=model.to(device)
代表将模型加载到指定设备上。其中,device=torch.device(“cpu”)代表的使用cpu,而device=torch.device(“cuda”)则代表的使用GPU。

当我们指定了设备之后,就需要将模型加载到相应设备中,此时需要使用model=model.to(device),将模型加载到相应的设备中。

将由GPU保存的模型加载到CPU上。
将torch.load()函数中的map_location参数设置为torch.device(‘cpu’)

device = torch.device('cpu')
model = TheModelClass(*args, **kwargs)
model.load_state_dict(torch.load(PATH, map_location=device))

将由GPU保存的模型加载到GPU上。确保对输入的tensors调用input = input.to(device)方法。

device = torch.device("cuda")
model = TheModelClass(*args, **kwargs)
model.load_state_dict(torch.load(PATH))
model.to(device)

将由CPU保存的模型加载到GPU上。确保对输入的tensors调用input = input.to(device)方法。map_location是将模型加载到GPU上,model.to(torch.device(‘cuda’))是将模型参数加载为CUDA的tensor。最后保证使用.to(torch.device(‘cuda’))方法将需要使用的参数放入CUDA。

device = torch.device("cuda")
model = TheModelClass(*args, **kwargs)
model.load_state_dict(torch.load(PATH, map_location="cuda:0"))  # Choose whatever GPU device number you want
model.to(device)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值