pytorch模型载入之gpu和cpu互转

Pytorch训练模型fine-tunning、模型推理等环节常常涉及到模型加载,其中会涉及到将不同平台、版本的模型相互转化:

Case-1.载入多GPU模型

pretained_model = torch.load(’muti_gpus_model.pth‘)    # 网络+权重
# 载入为单gpu模型
gpu_model       = pretrained_model.module  # GPU-version
# 载入为cpu模型
model           = ModelArch()
pretained_dict  = pretained_model.module.state_dict()
model.load_state_dict(pretained_dict)  # CPU-version

Case-2.载入多GPU权重

model = ModelArch(para).cuda(0)   # 网络结构
model = torch.nn.DataParallel(model, device_ids=[0])  # 将model转为muit-gpus模式
checkpoint = torch.load(model_path, map_location=lambda storage, loc: storage) # 载入weights
model.load_state_dict(checkpoint)  # 用weights初始化网络
# 载入为单gpu模型
gpu_model = model.module           # GPU-version
# 载入为cpu模型
model = ModelArch(para)
model.load_state_dict(gpu_model.state_dict())
torch.save(cpu_model.state_dict(), 'cpu_mode.pth') # cpu模型存储, 注意这里的state_dict后的()必须加上,否则报'function' object has no attribute 'copy'错误

Case-3.载入CPU权重 | [inference]

# 载入为cpu版本
model = ModelArch(para)
checkpoint = torch.load(model_path, map_location=lambda storage, loc: storage) # 载入weights

# 载入为gpu版本
model = ModelArch(para).cuda()   # 网络结构
checkpoint = torch.load(model_path, map_location=lambda storage, loc: storage.cuda(0)) # 载入weights
model.load_state_dict(checkpoint)  # 用weights初始化网络

# 载入为muti-gpus版本
model = ModelArch(para).cuda()   # 网络结构
model = torch.nn.DataParallel(model, device_ids=[0, 1]) # device_ids根据自己需求改!
checkpoint = torch.load(model_path, map_location=lambda storage, loc: storage.cuda(0)) # 载入weights
model.module.load_state_dict(checkpoint)  # 用weights初始化网络

 

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 可以使用以下代码将PyTorch模型GPU转移到CPU: ```python model.to('cpu') ``` 这将把模型中的所有参数和缓存转移到CPU上。如果你之前使用了`model.cuda()`将模型转移到GPU上,那么现在可以使用上述代码将其转移到CPU上。 ### 回答2: PyTorch是深度学习的开源框架,支持在GPU上进行加速计算,而将PyTorch模型GPU转移到CPU可以通过以下几步来实现: 1. 停止使用GPU进行运算 首先,需要使用以下代码将模型GPU移回CPU: ``` model.cpu() ``` 这个操作可以将模型中所有的参数和缓存都转移到CPU上,以便在CPU上进行后续计算。 2. 如果层中有BatchNorm层,则设置batchnorm层为eval状态 如果你的PyTorch模型中有BatchNorm层,则需要将其设置为eval状态。BatchNorm层在训练和测试的过程中行为不一样,请确保相应的行为。可以使用下面的代码将其设置为eval状态: ``` model.eval() ``` 这样做有助于确保BatchNorm层中的均值和方差与CPU上的计算一致。 3. 在GPU上进行计算时,包含数据的变量会放在GPU的内存上,因此需要将它们转移到CPU上 接下来,需要使用以下代码将数据从GPU移回CPU: ``` data.cpu() ``` 这个操作可以将数据从GPU的内存中复制到CPU的内存中,以便在CPU上运行。 4. 将模型和数据都设置为volatile 最后,需要将模型和数据都设置为volatile,以便PyTorch能够将其视为只读。可以在代码中添加以下内容来设置它们为volatile: ``` with torch.no_grad(): output = model(data) ``` 这将确保PyTorch不会更新模型的参数或缓存,也不会存储梯度信息或计算图信息。 总之,将PyTorch模型GPU转移回CPU需要使用几个简单的步骤。在转移过程中,需要确保模型、数据和BatchNorm层的状态与CPU上的状态相同。通过这些步骤,可以在CPU上使用PyTorch进行深度学习计算。 ### 回答3: PyTorch是一个基于Python的科学计算库,支持多种硬件的加速计算,其中包括GPU。然而,在某些情况下,例如训练好的模型需要在没有GPU的设备上运行,或者需要获取特定部件的输出等,需要将PyTorch模型GPU转换为CPU。 将PyTorch模型GPU转换到CPU的过程非常简单,仅需使用模型的to方法。例如,如果我们有一个在GPU上训练的模型model,可以使用以下代码将其转换为CPU: model.cpu() 这会将模型中的参数和缓冲区从GPU转移到CPU。然后,我们可以将模型进行保存或评估。例如,我们可以使用以下代码保存模型torch.save(model.state_dict(), "model_cpu.pth") 这将保存一个只包含参数和缓冲区的文件“model_cpu.pth”,可以在CPU上加载和使用。例如,我们可以使用以下代码在CPU上加载模型并对样本进行预测: model_cpu = Model() model_cpu.load_state_dict(torch.load("model_cpu.pth", map_location=torch.device('cpu'))) # predict a sample sample = torch.randn(1, 3, 224, 224) output = model_cpu(sample) print(output) 需要注意的是,在GPU上训练的模型往往比在CPU上训练的模型更大,因为它们需要存储显存中的参数和中间缓存。如果在GPU上训练的模型较大,可能会导致在CPU上内存不足的情况。因此,转换模型之前,我们应该考虑模型的内存使用情况,并在必要时进行优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReLuJie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值