Python PyTorch:RuntimeError:输入、输出和索引必须在当前设备上

Python PyTorch:RuntimeError:输入、输出和索引必须在当前设备上,python,nlp,pytorch,bert-language-model,Python,Nlp,Pytorch,Bert Language Model,我在火炬上运行一个伯特模型。这是一个多类情绪分类任务,大约有30000行。我已经将所有内容都放在cuda上,但不确定为什么会出现以下运行时错误。这是我的密码: for epoch in tqdm(range(1, epochs+1)): model.train() loss_train_total = 0 progress_bar = tqdm(dataloader_train, desc='Epoch {:1d}'.format(epoch), l

我在火炬上运行一个伯特模型。这是一个多类情绪分类任务,大约有30000行。我已经将所有内容都放在cuda上,但不确定为什么会出现以下运行时错误。这是我的密码:

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
tqdm中历元的
(范围(1,历元+1)):
模型列车()
损失列车总数=0
进度条=tqdm(数据加载程序列,desc='Epoch{:1d}'。格式(Epoch),左=假,禁用=假)
对于批处理进行中\u栏:
模型0_梯度()
批次=元组(批次中b的b.to(设备)
输入={'input_id':批处理[0],
“注意事项”:批次[1],
“标签”:批次[2],
}       
输出=模型(**输入)
损失=输出[0]
损失\u列车\u总数+=损失项目()
loss.backward()
torch.nn.utils.clip\u grad\u norm\u(model.parameters(),1.0)
optimizer.step()
scheduler.step()
进度条。设置后缀({'training_loss':{.3f})。格式(loss.item()/len(batch))})
save(model.state_dict(),f'fineted_BERT_epoch_u{epoch}.model')
tqdm.write(f'\nEpoch{epoch}')
损失列车平均值=损失列车总数/长度(数据装载机列车)
写入(f'Training loss:{loss\u train\u avg})
val\u损失、预测、真值\u val=评估(数据加载程序\u验证)
val_f1=f1_分数_func(预测,真值)
写入(f'Validation loss:{val_loss}')
tqdm.write(f'F1分数(加权):{val_F1}')
---------------------------------------------------------------------------
运行时错误回溯(上次最近调用)
在()
17                  }       
18
--->19输出=型号(**输入)
20
21损失=输出[0]
8帧
/嵌入中的usr/local/lib/python3.6/dist-packages/torch/nn/functional.py(输入、重量、填充idx、最大规范、规范类型、比例梯度、频率、稀疏)
1850#一旦脚本支持set#grad#enabled,则删除
1851年(权重、输入、最大范数、范数类型)
->1852返回火炬。嵌入(重量、输入、填充idx、比例、梯度、稀疏)
1853
1854
运行时错误:输入、输出和索引必须在当前设备上

如有任何建议,将不胜感激。谢谢

您应该将您的型号放在设备上,可能是cuda:

device = "cuda:0"
model = model.to(device)
 
然后确保模型的输入(输入)也在同一设备上:

input = input.to(device)

它应该有用

您可以使用以下命令将cuda初始化为设备:
torch.device(“cuda”如果torch.cuda.is_可用()否则为“cpu”)
;然后将
输入添加到(设备)
输出=模型(**输入)
之前,也在构建模型后将
模型添加到(设备)