web-dev-qa-db-fra.com

PYTORCH: RuntimeError: entrée, sortie et indices doit être sur le périphérique actuel.

Je suis en train d'exécuter un modèle Bert sur la torche. C'est une tâche de classification de sentiment multi-classe avec environ 30 000 rangées. J'ai déjà tout mis sur Cuda, mais je ne sais pas pourquoi je reçois l'erreur d'exécution suivante. Voici mon 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

Toute suggestion serait appréciée. Merci!

6
Roy

Vous devez mettre votre modèle sur l'appareil, ce qui est probablement cuda:

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

Assurez-vous ensuite que les entrées du modèle (entrée) sont également sur le même appareil:

input = input.to(device)

Ça devrait marcher!

2
Farzad Amirjavid