PyTorch: RuntimeError: Input, output and indices must be on the current device

23,111

You should put your model on the device, which is probably cuda:

device = "cuda:0"
model = model.to(device)
 

Then make sure the inputs of the model(input) are on the same device as well:

input = input.to(device)

It should work!

Share:
23,111
Roy
Author by

Roy

Updated on January 07, 2021

Comments

  • Roy
    Roy over 3 years

    I am running a BERT model on torch. It's a multi-class sentiment classification task with about 30,000 rows. I have already put everything on cuda, but not sure why I'm getting the following run time error. Here is my code:

    for epoch in tqdm(range(1, epochs+1)):
        
        model.train()
        
        loss_train_total = 0
    
        progress_bar = tqdm(dataloader_train, desc='Epoch {:1d}'.format(epoch), leave=False, disable=False)
        for batch in progress_bar:
    
            model.zero_grad()
            
            batch = tuple(b.to(device) for b in batch)
            
            inputs = {'input_ids':      batch[0],
                      'attention_mask': batch[1],
                      'labels':         batch[2],
                     }       
    
            outputs = model(**inputs)
            
            loss = outputs[0]
            loss_train_total += loss.item()
            loss.backward()
    
            torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
    
            optimizer.step()
            scheduler.step()
            
            progress_bar.set_postfix({'training_loss': '{:.3f}'.format(loss.item()/len(batch))})
             
            
        torch.save(model.state_dict(), f'finetuned_BERT_epoch_{epoch}.model')
            
        tqdm.write(f'\nEpoch {epoch}')
        
        loss_train_avg = loss_train_total/len(dataloader_train)            
        tqdm.write(f'Training loss: {loss_train_avg}')
        
        val_loss, predictions, true_vals = evaluate(dataloader_validation)
        val_f1 = f1_score_func(predictions, true_vals)
        tqdm.write(f'Validation loss: {val_loss}')
        tqdm.write(f'F1 Score (Weighted): {val_f1}')
    
    ---------------------------------------------------------------------------
    RuntimeError                              Traceback (most recent call last)
    <ipython-input-67-9306225bb55a> in <module>()
         17                  }       
         18 
    ---> 19         outputs = model(**inputs)
         20 
         21         loss = outputs[0]
    
    8 frames
    /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py in embedding(input, weight, padding_idx, max_norm, norm_type, scale_grad_by_freq, sparse)
       1850         # remove once script supports set_grad_enabled
       1851         _no_grad_embedding_renorm_(weight, input, max_norm, norm_type)
    -> 1852     return torch.embedding(weight, input, padding_idx, scale_grad_by_freq, sparse)
       1853 
       1854 
    
    RuntimeError: Input, output and indices must be on the current device
    

    Any suggestions would be appreciated. Thanks!