时间:2021-05-22
这几天在一机多卡的环境下,用pytorch训练模型,遇到很多问题。现总结一个实用的做实验方式:
多GPU下训练,创建模型代码通常如下:
os.environ['CUDA_VISIBLE_DEVICES'] = args.cudamodel = MyModel(args)if torch.cuda.is_available() and args.use_gpu: model = torch.nn.DataParallel(model).cuda()官方建议的模型保存方式,只保存参数:
torch.save(model.module.state_dict(), "model.pkl")其实,这样很麻烦,我建议直接保存模型(参数+图):
torch.save(model, "model.pkl")这样做很实用,特别是我们需要反复建模和调试的时候。这种情况下模型的加载很方便,因为模型的图已经和参数保存在一起,我们不需要根据不同的模型设置相应的超参,更换对应的网络结构,如下:
if not (args.pretrained_model_path is None): print('load model from %s ...' % args.pretrained_model_path) model = torch.load(args.pretrained_model_path) print('success!')但是需要注意,这种方式加载的是多GPU下模型。如果服务器环境变化不大,或者和训练时候是同一个GPU环境,就不会出现问题。
如果系统环境发生了变化,或者,我们只想加载模型参数,亦或是遇到下面的问题:
AttributeError: 'model' object has no attribute 'copy'
或者
AttributeError: 'DataParallel' object has no attribute 'copy'
或者
RuntimeError: module must have its parameters and buffers on device cuda:0 (device_ids[0]) but found
这时候我们可以用下面的方式载入模型,先建立模型,然后加载参数。
os.environ['CUDA_VISIBLE_DEVICES'] = args.cuda# 建立模型model = MyModel(args)if torch.cuda.is_available() and args.use_gpu: model = torch.nn.DataParallel(model).cuda()if not (args.pretrained_model_path is None): print('load model from %s ...' % args.pretrained_model_path) # 获得模型参数 model_dict = torch.load(args.pretrained_model_path).module.state_dict() # 载入参数 model.module.load_state_dict(model_dict) print('success!')到此这篇关于PyTorch 多GPU下模型的保存与加载(踩坑笔记)的文章就介绍到这了,更多相关PyTorch 多GPU下模型的保存与加载内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
1Pytorch以ONNX方式保存模型defsaveONNX(model,filepath):'''保存ONNX模型:parammodel:神经网络模型:par
今天用pytorch保存模型时遇到bugCan'tpickle在google上查找原因,发现是保存时保存了整个模型的原因,而模型中有一些自定义的参数将torch
在使用pytorch训练模型,经常需要加载大量图片数据,因此pytorch提供了好用的数据加载工具Dataloader。为了实现小批量循环读取大型数据集,在Da
背景在公司用多卡训练模型,得到权值文件后保存,然后回到实验室,没有多卡的环境,用单卡训练,加载模型时出错,因为单卡机器上,没有使用DataParallel来加载
本文适合多GPU的机器,并且每个用户需要单独使用GPU训练。虽然pytorch提供了指定gpu的几种方式,但是使用不当的话会遇到outofmemory的问题,主