RuntimeError: 预期所有张量都在同一设备上,但发​​现至少有两个设备,cpu 和 cuda:0!使用我的模型进行预测时

Pab*_*don 11 python pytorch huggingface-transformers

我使用变压器(BertForSequenceClassification)训练了一个序列分类模型,但出现错误:

\n

预计所有张量都在同一设备上,但发​​现至少有两个设备,cpu 和 cuda:0!(在方法wrapper__index_select中检查参数索引时)

\n

我真的不明白问题出在哪里,如果问题出在我的模型上,问题出在我如何标记数据上,或者是什么。

\n

这是我的代码:

\n

加载预训练模型

\n
model_state_dict = torch.load("../MODELOS/TRANSFORMERS/TransformersNormal",  map_location='cpu') #Doesnt work with map_location='cuda:0' neither\nmodel = BertForSequenceClassification.from_pretrained(pretrained_model_name_or_path="bert-base-uncased", state_dict=model_state_dict, cache_dir='./data')\n
Run Code Online (Sandbox Code Playgroud)\n

创建数据加载

\n
def crearDataLoad(dfv,tokenizer): \n\n  dft=dfv  # usamos el del validacion para que nos salga los resultados y no tener que cambiar mucho codigo\n\n  #validation=dfv['text']  \n  validation=dfv['text'].str.lower()  # para modelos uncased  # el fichero que hemos llamado test es usado en la red neuronal\n  validation_labels=dfv['label']\n  \n  validation_inputs = crearinputs (validation,tokenizer)\n  validation_masks= crearmask (validation_inputs)\n  \n  validation_inputs = torch.tensor(validation_inputs)\n  \n  validation_labels = torch.tensor(validation_labels.values)\n  \n \n  validation_masks = torch.tensor(validation_masks)\n  \n  from torch.utils.data import TensorDataset, DataLoader, RandomSampler, SequentialSampler# The DataLoader needs to know our batch size for training, so we specify it \n\n  #Colab\n  batch_size = 32\n  #local\n  #batch_size = 15\n  \n  validation_data = TensorDataset(validation_inputs, validation_masks, validation_labels)\n  validation_sampler = SequentialSampler(validation_data)\n  validation_dataloader = DataLoader(validation_data, sampler=validation_sampler, batch_size=batch_size)\n\n  return validation_dataloader\n
Run Code Online (Sandbox Code Playgroud)\n

显示结果

\n
def resultados(validation_dataloader, model, tokenizer):\n    \n  model.eval()\n\n  # Tracking variables \n  predictions , true_labels = [], []\n  pred = []\n  t_label =[]\n  # Predict \n  for batch in validation_dataloader:    \n    # Add batch to GPU , como no tengo lo dejo aqu\xc3\xad\n    batch = tuple(t.to(device) for t in batch)\n  \n    # Unpack the inputs from our dataloader\n    b_input_ids, b_input_mask, b_labels = batch\n  \n    # Telling the model not to compute or store gradients, saving memory and \n    # speeding up prediction\n    with torch.no_grad():\n      # Forward pass, calculate logit predictions\n      outputs = model(b_input_ids, #toktype_ids=None, #\n                      attention_mask=b_input_mask) #I GET THE ERROR HERE\n     \n    logits = outputs[0]\n \n  \n    # Move logits and labels to CPU\n    logits = logits.detach().cpu().numpy()\n    label_ids = b_labels.to('cpu').numpy()\n  \n    # Store predictions and true labels\n    # Store predictions and true labels\n    predictions.append(logits)\n    true_labels.append(label_ids)\n \n    for l in logits:\n      # para cada tupla del logits, se selecciona 0 o 1 dependiendo del valor\n      # que sea el mayor (argmax)\n      pred_labels_i = np.argmax(l).item()\n      pred.append(pred_labels_i)\n  \n  #Si no me equivoco, en pred guardamos las predicciones hechas por el modelo\n  pred=np.asarray(pred).tolist()\n  t_label = [val for sublist in true_labels for val in sublist] # para aplanar la lista de etiquetas\n  #print('predicciones',pred)\n  #print('t_labels',t_label)\n  #print('validation_labels',validation_labels )\n  print("RESULTADOS KFOLD validacion cruzada")\n  from sklearn.metrics import confusion_matrix\n  from sklearn.metrics import classification_report\n  print(classification_report(t_label, pred))\n  print ("Distribution test {}".format(Counter(t_label)))\n  from sklearn.metrics import confusion_matrix\n  print(confusion_matrix(t_label, pred))\n  from sklearn.metrics import roc_auc_score\n  print('AUC ROC:')\n  print(roc_auc_score(t_label, pred))\n  from sklearn.metrics import f1_score\n  result=f1_score(t_label, pred, average='binary',labels=[0,1],pos_label=1,zero_division=0)\n  print('f1-score macro:')\n  print(result)\n  print("****************************************************************")\n  return result\n
Run Code Online (Sandbox Code Playgroud)\n

我在函数 resultados 中的这一行收到错误

\n
with torch.no_grad():\n     # Forward pass, calculate logit predictions\n     outputs = model(b_input_ids, #toktype_ids=None, #\n                     attention_mask=b_input_mask) #Esto falla\n
Run Code Online (Sandbox Code Playgroud)\n

主要程序

\n
trial_data = pd.DataFrame(trial_dataset)\n\ndevice_name = tf.test.gpu_device_name()\nif device_name != '/device:GPU:0':\n  print('no hay gpu')\nprint('Found GPU at: {}'.format(device_name))\n\n#import torch# If there's a GPU available...\nif torch.cuda.is_available():  # Tell PyTorch to use the GPU. \n device = torch.device("cuda") \n print('There are %d GPU(s) available.' % torch.cuda.device_count()) \n print('We will use the GPU:', torch.cuda.get_device_name(0)) # If not...\nelse:\n print('No GPU available, using the CPU instead.')\n device = torch.device("cpu")\n\ntokenizer = BertTokenizer.from_pretrained('bert-base-uncased')\n\nvalidation_dataloader = crearDataLoad(trial_data,tokenizer)\n# obteniendo metricas del modelo generado en el paso anterior\nmodel.eval() \nresult= resultados(validation_dataloader, model,tokenizer)\n
Run Code Online (Sandbox Code Playgroud)\n

Sha*_*hai 18

您没有将模型移至device,而仅将数据移至 。您需要model.to(device)在使用位于 上的数据之前调用它device

  • 太感谢了!它工作得很好:) (2认同)