【PyTorch】DataLoader 设置 num_workers > 0 时,出现 CUDA with multipr ...

打印 上一主题 下一主题

主题 1871|帖子 1871|积分 5617

1 报错信息

  1. RuntimeError: Caught RuntimeError in DataLoader worker process 0.
  2. RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the 'spawn' start method
复制代码
2 报错分析

2.1 原因

Tensor 默认是在 CPU 上创建的,当我在数据集 Class 的 __getitem__() 中 return 时,将 Tensor 转移到了 GPU 上
  1. return (
  2.         color.to(self.device).type(self.dtype),
  3.         depth.to(self.device).type(self.dtype),
  4.         intrinsics.to(self.device).type(self.dtype),
  5.         pose.to(self.device).type(self.dtype),
  6.         # self.retained_inds[index].item(),
  7. )
复制代码
同时,我在 DataLoader 定义时,设置了 num_workers,导致数据在多历程加载时使用了 CUDA Tensor
  1. data_loader = DataLoader(dataset, num_workers=dataset_config['num_workers'])
  2. # Iterate over Scan
  3. for time_idx, batch in tqdm(enumerate(data_loader)):
复制代码
2.2 结论

   参考文档: Link
  



  • 不建议在多历程加载时返回 CUDA Tensor,因为在多历程中使用 CUDA 以及共享 CUDA Tensor 有一些要留意的点
  • 相反,可以使用 DataLoader 中的 pin_memory,将数据传输到共享内存中,然后再将 Tensor 转移到 CUDA GPU 上
3 解决方法

   参考discuss: Link
  修改数据集 Class 的 __getitem__(),在 return 时不将 Tensor 转移到 GPU 上。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表