Guardé un punto de control mientras entrenaba en gpu. después de recargar el punto de control y continuar entrenando, aparece el siguiente error.
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!
mi código de entrenamiento es:
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() ....
el proceso de ahorro ocurre después de terminar cada época.
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')
No puedo entender por qué recibo este error. args.gpu == True, y estoy pasando el modelo, todos los datos y la función de pérdida a cuda, de alguna manera todavía hay un tensor en la CPU, ¿alguien podría averiguar qué está mal?
Gracias.
Puede haber un problema con los parámetros del dispositivo:
Si necesita mover un modelo a GPU a través de
.cuda()
, hágalo antes de construir optimizadores para él. Los parámetros de un modelo después de.cuda()
serán objetos diferentes a los de antes de la llamada.
En general, debe asegurarse de que los parámetros optimizados vivan en ubicaciones coherentes cuando se construyan y utilicen los optimizadores.