Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you

一、问题

使用了自己创建的dataset和collate_fn,使用了默认的dataloader,当设置num_worker的时候,超过0则报如下错误:

RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the 'spawn' start method

二、原因

查看了平时其他人的代码,发现自己在collate_fn对tensor使用了.to(device),而别人则是在从dataloader取出数据后,放入模型前,将其移到device中,例如:

    for epoch in range(max_epoch):
        for batch_idx, (en_id, att_mask_en, zh_id, att_mask_zh) in enumerate(data_loader): 
                en_id = en_id.to(device)

而我则是错误地在collate_fn中将数据移至device中:

def collate_fn(batch):
    en, zh = list(zip(*batch))
    en_output = tokenizer.encode_batch(en,is_pretokenized=True)
    zh_id,att_mask_zh = zh_mapper.encode_batch(zh)
    en_id =[]
    att_mask_en = []
    for item in en_output:
        en_id.append(item.ids)
        att_mask_en.append(item.attention_mask)
    en_id = torch.tensor(en_id, dtype=torch.long).to(device)
    att_mask_en = torch.tensor(att_mask_en, dtype=torch.bool).to(device)
    zh_id = torch.tensor(zh_id, dtype=torch.long).to(device)
    att_mask_zh = torch.tensor(att_mask_zh, dtype=torch.bool).to(device)

    return en_id, att_mask_en, zh_id, att_mask_zh

当然,在定义dataset,方法__getitem__ 里把张量放到device里也会产生同样的错误。

此外,我还使用了官方建议的spawn:

if __name__ == '__main__':
    torch.multiprocessing.set_start_method('spawn')
    train()

但是gpu会卡住不运行数据加载。 

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当您在使用CUDA进行多进程编程时,如果出现"RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the 'spawn' start method"的错误提示,这是因为在使用fork方式创建子进程时,CUDA运行时不支持重新初始化CUDA。 为了解决这个问题,您可以使用'spawn'启动方法来创建子进程。在您的代码中添加以下内容可以解决这个问题: ```python if __name__=='__main__': torch.multiprocessing.set_start_method('spawn') ``` 这样就会使用'spawn'启动方法来创建子进程,从而解决了CUDA多进程编程的问题。同时,您可以参考以下链接来了解更多关于这个问题的信息: - [日志提示“RuntimeError: Cannot re-initialize CUDA in forked subprocess”](https://britishgeologicalsurvey.github.io/science/python-forking-vs-spawn/) - [Python中使用spawn或forkserver启动方法](https://www.pythonf.cn/read/65459) - [Stack Overflow上的相关问题和解答](https://stackoverflow.com/questions/64095876/multiprocessing-fork-vs-spawn) <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you](https://blog.csdn.net/weixin_37913042/article/details/103018611)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [pythonRuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing](https://blog.csdn.net/ResumeProject/article/details/125449639)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值