python - RuntimeError: Expected all tensors to be on the same device,但发现至少有两个设备,cuda:0 和 cpu!恢复训练时
问题描述
我在 gpu 上训练时保存了一个检查点。重新加载检查点并继续训练后,我收到以下错误。
Traceback (most recent call last):
File "main.py", line 140, in <module>
train(model,optimizer,train_loader,val_loader,criteria=args.criterion,epoch=epoch,batch=batch)
File "main.py", line 71, in train
optimizer.step()
File "/opt/conda/lib/python3.7/site-packages/torch/autograd/grad_mode.py", line 26, in decorate_context
return func(*args, **kwargs)
File "/opt/conda/lib/python3.7/site-packages/torch/optim/sgd.py", line 106, in step
buf.mul_(momentum).add_(d_p, alpha=1 - dampening)
RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!
我的培训代码是:
def train(model,optimizer,train_loader,val_loader,criteria,epoch=0,batch=0):
batch_count = batch
if criteria == 'l1':
criterion = L1_imp_Loss()
elif criteria == 'l2':
criterion = L2_imp_Loss()
if args.gpu and torch.cuda.is_available():
model.cuda()
criterion = criterion.cuda()
print(f'{datetime.datetime.now().time().replace(microsecond=0)} Starting to train..')
while epoch <= args.epochs-1:
print(f'********{datetime.datetime.now().time().replace(microsecond=0)} Epoch#: {epoch+1} / {args.epochs}')
model.train()
interval_loss, total_loss= 0,0
for i , (input,target) in enumerate(train_loader):
batch_count += 1
if args.gpu and torch.cuda.is_available():
input, target = input.cuda(), target.cuda()
input, target = input.float(), target.float()
pred = model(input)
loss = criterion(pred,target)
optimizer.zero_grad()
loss.backward()
optimizer.step()
....
保存过程发生在每个时期完成后。
torch.save({'epoch': epoch,'batch':batch_count,'model_state_dict': model.state_dict(),'optimizer_state_dict':
optimizer.state_dict(),'loss': total_loss/len(train_loader),'train_set':args.train_set,'val_set':args.val_set,'args':args}, f'{args.weights_dir}/FastDepth_Final.pth')
我不知道为什么我会收到这个错误。args.gpu == True ,我将模型、所有数据和损失函数传递给 cuda,不知何故 cpu 上还有一个张量,有人能找出问题所在吗?
谢谢。
解决方案
设备参数打开可能存在问题:
如果您需要通过 将模型移动到 GPU
.cuda()
,请在为其构建优化器之前执行此操作。模型的参数之后.cuda()
将与调用之前的对象不同。
通常,在构建和使用优化器时,您应该确保优化的参数位于一致的位置。
推荐阅读
- python - CV 线性回归 KeyError:“不再支持将列表喜欢传递给带有任何缺失标签的 .loc 或 []
- r - 在 R 中结合来自 Tidymodels 的嵌套和 rolling_origin
- json - 赛普拉斯:json 字段比较的断言错误
- django - 一键更新一组 Django 对象
- flutter - Flutter/Dart 创建新用户时自动创建容器
- android - 无法在 jetpack 数据存储类中写入首选项未找到异常
- java - 使用 JPA 表示同一个表的不同实体,有和没有连接
- javascript - 通过输入显示按年/月/周 asp.net core mvc 过滤的数据库中的行
- javascript - 切换按钮保持查询结果的状态并通过单击按钮在不刷新屏幕的情况下更新数据库
- flutter - 提供者 .read() 与 .watch()