PyTorch:RuntimeError:输入、输出和索引必须在当前设备上
Posted
技术标签:
【中文标题】PyTorch:RuntimeError:输入、输出和索引必须在当前设备上【英文标题】:PyTorch: RuntimeError: Input, output and indices must be on the current device 【发布时间】:2021-03-02 23:47:38 【问题描述】:我正在 Torch 上运行 BERT 模型。这是一个多类情感分类任务,大约有 30,000 行。我已经将所有内容都放在 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
任何建议将不胜感激。谢谢!
【问题讨论】:
您可以使用以下命令将 cuda 初始化为设备:torch.device("cuda" if torch.cuda.is_available() else "cpu")
;然后在outputs = model(**inputs)
之前添加inputs.to(device)
另外,model.to(device)
在构建模型之后。
【参考方案1】:
你应该把你的模型放在设备上,这可能是 cuda:
device = "cuda:0"
model = model.to(device)
然后确保模型(输入)的输入也在同一设备上:
input = input.to(device)
应该可以了!
【讨论】:
以上是关于PyTorch:RuntimeError:输入、输出和索引必须在当前设备上的主要内容,如果未能解决你的问题,请参考以下文章
Pytorch RNN 错误:RuntimeError:输入必须有 3 个维度得到 1
RuntimeError:/pytorch/aten/src/THCUNN/generic/ClassNLLCriterion.cu:15____ 不支持多目标
Pytorch RuntimeError: CUDA error: out of memory at loss.backward() , 使用 CPU 时没有错误
PyTorch - RuntimeError:后端 CPU 的预期对象,但为参数 #2 'weight' 获得了后端 CUDA
RuntimeError:cuDNN 错误:CUDNN_STATUS_NOT_INITIALIZED 使用 pytorch