【问题标题】:Pytorch CPU Device index must not be negativePytorch CPU 设备索引不能为负
【发布时间】:2022-10-03 04:03:15
【问题描述】:

我有一个用 cuda 训练的张量,我想在 cpu 上部署它。我让模型在Google Colab GPU 运行时上运行,切换到 cpu 运行时并尝试将其移植过来。

很抱歉没有包含可重现的示例,如果数据集在我的谷歌驱动器上,我真的不知道最佳实践是什么。

model = mymodel()
device = torch.device(\"cpu\")
state_dict = torch.load(loadckpt,map_location=device)
model.load_state_dict(state_dict[\'model\'])
model.eval()
result = model(sample)

当我运行它时,我收到以下回溯错误

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-25-5336d222ce8f> in <module>()
      8 # right_pad_np = sample[\"right_pad\"]
      9 # disp_est_uint = np.round(disp_est_np * 256).astype(np.uint16)
---> 10 test_sample(sample)

8 frames
/content/CFNet/utils/experiment.py in wrapper(*f_args, **f_kwargs)
     28     def wrapper(*f_args, **f_kwargs):
     29         with torch.no_grad():
---> 30             ret = func(*f_args, **f_kwargs)
     31         return ret
     32 

<ipython-input-25-5336d222ce8f> in test_sample(sample)
      2 def test_sample(sample):
      3     model.eval()
----> 4     disp_ests, pred1_s3_up, pred2_s4 = model(sample[\'left\'], sample[\'right\'])
      5     return disp_ests[-1]
      6 # disp_est_np = tensor2numpy(test_sample(sample))

/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
   1100         if not (self._backward_hooks or self._forward_hooks or self._forward_pre_hooks or _global_backward_hooks
   1101                 or _global_forward_hooks or _global_forward_pre_hooks):
-> 1102             return forward_call(*input, **kwargs)
   1103         # Do not call functions when jit is used
   1104         full_backward_hooks, non_full_backward_hooks = [], []

/usr/local/lib/python3.7/dist-packages/torch/nn/parallel/data_parallel.py in forward(self, *inputs, **kwargs)
    148         with torch.autograd.profiler.record_function(\"DataParallel.forward\"):
    149             if not self.device_ids:
--> 150                 return self.module(*inputs, **kwargs)
    151 
    152             for t in chain(self.module.parameters(), self.module.buffers()):

/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
   1100         if not (self._backward_hooks or self._forward_hooks or self._forward_pre_hooks or _global_backward_hooks
   1101                 or _global_forward_hooks or _global_forward_pre_hooks):
-> 1102             return forward_call(*input, **kwargs)
   1103         # Do not call functions when jit is used
   1104         full_backward_hooks, non_full_backward_hooks = [], []

/content/CFNet/models/cfnet.py in forward(self, left, right)
    546 
    547         mindisparity_s3_1, maxdisparity_s3_1 = self.generate_search_range(self.sample_count_s3 + 1, mindisparity_s3, maxdisparity_s3, scale = 2)
--> 548         disparity_samples_s3 = self.generate_disparity_samples(mindisparity_s3_1, maxdisparity_s3_1, self.sample_count_s3).float()
    549         confidence_v_concat_s3, _ = self.cost_volume_generator(features_left[\"concat_feature3\"],
    550                                                             features_right[\"concat_feature3\"], disparity_samples_s3, \'concat\')

/content/CFNet/models/cfnet.py in generate_disparity_samples(self, min_disparity, max_disparity, sample_count)
    464             :disparity_samples:
    465         \"\"\"
--> 466         disparity_samples = self.uniform_sampler(min_disparity, max_disparity, sample_count)
    467 
    468         disparity_samples = torch.cat((torch.floor(min_disparity), disparity_samples, torch.ceil(max_disparity)),

/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
   1100         if not (self._backward_hooks or self._forward_hooks or self._forward_pre_hooks or _global_backward_hooks
   1101                 or _global_forward_hooks or _global_forward_pre_hooks):
-> 1102             return forward_call(*input, **kwargs)
   1103         # Do not call functions when jit is used
   1104         full_backward_hooks, non_full_backward_hooks = [], []

/content/CFNet/models/submodule.py in forward(self, min_disparity, max_disparity, number_of_samples)
    295 
    296         multiplier = (max_disparity - min_disparity) / (number_of_samples + 1)   # B,1,H,W
--> 297         range_multiplier = torch.arange(1.0, number_of_samples + 1, 1, device=device).view(number_of_samples, 1, 1)  #(number_of_samples, 1, 1)
    298         sampled_disparities = min_disparity + multiplier * range_multiplier
    299 

RuntimeError: Device index must not be negative

我最初的想法显然是什么是设备索引?

device=torch.device(\'cpu\')
print(device.index)

...Output...
None

不确定我错过了什么。火炬文档说这应该完全没问题。如果您想查看完整代码,请查看链接的 Colab。

    标签: python torch


    【解决方案1】:

    这可能有点晚了,但我刚刚遇到了类似的问题(从 gpu 转移到 cpu 后,在我的转发呼叫中也得到“设备索引不能为负”)。 在我的代码中的某个时刻,我用device = input_data.get_device() 创建了一个张量 而get_device() 似乎已经解决了这个问题。正在做 device = input_data.device 为我解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2021-08-28
      • 2023-01-03
      • 2018-10-16
      • 2023-02-25
      • 2022-12-24
      • 2022-11-12
      • 2021-11-05
      • 2020-10-06
      • 1970-01-01
      相关资源
      最近更新 更多