PyTorch: ошибка с несколькими графическими процессорами: ошибка RuntimeError: binary_op(): ожидалось, что оба входа будут на одном устройстве, но вход a находится на cuda: 0, а вход b — на cuda: 7

#gpu #pytorch #multi-gpu

#графический процессор #pytorch #мульти-графический процессор

Вопрос:

Когда я использую несколько графических процессоров
, а также когда я использую .cuda () для тензоров
в середине обучения, я получил следующую ошибку

 RuntimeError: binary_op(): expected both inputs to be on same device, 
but input a is on cuda:0 and input b is on cuda:7
  

что означает, что следующее R2 находится на cuda: 7 (не уверен, что R2 включен на cuda: 0 или cuda: 7) и
R1 находится на cuda: 0
таким образом, операция невозможна, потому что они на разных графических процессорах

 R2=torch.where(R2<1e-4,torch.Tensor([1e-4]).squeeze().cuda(),R2)
div_R1_R2=torch.div(R1,R2)
  

Я получаю точно такую же ошибку в следующем коде

жалоба O_img_tc и R_gt_img_tc не может быть вычислена

потому что они на разных графических процессорах

 R_gt_img_tc=torch.where(
  torch.abs(R_gt_img_tc)<1e-4,
  torch.Tensor([1e-4]).squeeze().cuda(),R_gt_img_tc)
sha=torch.clamp(torch.div(O_img_tc,R_gt_img_tc),0.0,1.3)[:,0,:,:].unsqueeze(1)
  

Как это решить, и что я делаю не так?


Что я пробовал:
— Использовать horovod: получил ту же ошибку.
— Проверьте номер графического процессора с помощью dense_O_img_tc.get_device() и dense_S_gt_img_tc.get_device()
Когда они были похожи на dense_O_img_tc.get_device() возвращенные 0 , dense_S_gt_img_tc.get_device() вернулись 7

И я попробовал это

 same_cuda=torch.device('cuda:' str(dense_O_img_tc.get_device()))
dense_S_gt_img_tc=torch.where(
  torch.abs(dense_S_gt_img_tc)<1e-4,
  # Note here that I'm using cuda(same_cuda)
  torch.Tensor([1e-4]).squeeze().cuda(same_cuda),dense_S_gt_img_tc)

ref=torch.div(dense_O_img_tc,dense_S_gt_img_tc)
  

На самом деле это могло решить «проблему с другим графическим процессором»

но использовался только GPU: 0, что привело к полной ошибке GPU: 0.

  • Итак, я попытался переместить dense_O_img_tc то, что находится на GPU: 0, в сторону GPU: 7 (или в любом месте, где включен dense_S_gt_img_tc, используя dense_S_gt_img_tc.get_device()), я, возможно, получил следующую ошибку незаконного доступа к памяти
 RuntimeError: cuda runtime error (77) : an illegal memory access was encountered at /opt/conda/conda-bld/pytorch_1544199946412/work/aten/src/THC/generic/THCTensorMath.cu:238
  

Комментарии:

1. Если у кого-то возникли трудности с несколькими графическими процессорами на PyTorch, это решение, по крайней мере, для моего случая, discuss.pytorch.org/t/difference-device-error-when-i-use-multiple-gpus-with-creating-new-cuda-tensor/41676