PyTorch 多GPU下模型的保存与加载(踩坑笔记)

作者:叶罅 时间:2023-07-20 15:39:18 

这几天在一机多卡的环境下,用pytorch训练模型,遇到很多问题。现总结一个实用的做实验方式:

多GPU下训练,创建模型代码通常如下:


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()

官方建议的模型保存方式,只保存参数:


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!')

来源:https://www.cnblogs.com/blog4ljy/p/11711173.html

标签:PyTorch,GPU,模型
0
投稿

猜你喜欢

  • python面向对象实现名片管理系统文件版

    2022-11-25 16:27:45
  • Python全栈之学习CSS(2)

    2022-11-11 13:04:54
  • Python对XML文件实现增删改查操作

    2023-11-19 20:42:03
  • 一起来看看五条Python中的隐含特性

    2023-06-30 12:46:43
  • python数字图像处理skimage读取显示与保存图片

    2023-07-28 17:33:00
  • Python利用Pytorch实现绘制ROC与PR曲线图

    2022-09-20 03:24:20
  • Python代码块及缓存机制原理详解

    2023-07-02 08:12:07
  • JavaScript设置获取和设置属性的方法

    2024-05-22 10:35:34
  • 从Oracle 表格行列转置说起第1/2页

    2009-09-24 12:51:00
  • MySQL8.0.21安装步骤及出现问题解决方案

    2024-01-22 20:43:44
  • python列表添加元素append(),extend(),insert(),+list的区别及说明

    2022-12-11 08:48:35
  • Python实现爬取需要登录的网站完整示例

    2022-08-09 11:40:33
  • Pandas聚合运算和分组运算的实现示例

    2023-11-10 03:49:14
  • 用SQL语句删除重复记录的四种方法

    2011-05-03 09:25:00
  • Python3 元组tuple入门基础

    2023-01-16 12:13:22
  • Python计算开方、立方、圆周率,精确到小数点后任意位的方法

    2023-05-21 21:01:52
  • 如何使用 SQL Server 数据库查询累计值

    2008-12-03 15:27:00
  • 还原大备份mysql文件失败的解决方法分享

    2024-01-26 17:42:04
  • dl+ol应用

    2008-06-21 17:04:00
  • python中sample函数的介绍与使用

    2021-02-02 15:38:56
  • asp之家 网络编程 m.aspxhome.com