pytorch 运行时错误:恢复训练时,预期所有Tensor都在同一设备上,但发现至少两个设备:cuda:0和cpu!

blpfk2vs  于 2022-11-09  发布在  其他
关注(0)|答案(4)|浏览(391)

我保存了一个检查点,而trainig上的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 ==真,我把模型,所有的数据,和损失函数传递给cuda,不知何故,cpu上仍然有一个Tensor,有人能找出什么问题吗?

  • 谢谢-谢谢
esbemjvw

esbemjvw1#

可能存在issue,且设备参数为on:
如果您需要通过.cuda()将模型移动到GPU,请在为模型构造优化器之前移动模型,模型在.cuda()之后的参数将与调用之前的参数是不同的对象。
一般而言,在建构和使用最佳化工具时,您应该确定最佳化的参数位于一致的位置。

zujrkrfu

zujrkrfu2#

请确保将.to(device)添加到模型和模型输入。

7eumitmz

7eumitmz3#

我在文件的开头添加了下面的代码。它解决了我的问题
操作系统环境['CUDA可视设备']='0'

gc0ot86w

gc0ot86w4#

Shirley Ow的这个回答帮助我确保将.to(设备)添加到模型和模型输入中。

img = torch.from_numpy(img).to(device) # Code in yolov7

相关问题