pytorch中dataloader的prefetch_factor出错

作者在使用HuggingFace的图像分类示例时遇到prefetch_factor报错,发现该选项仅在num_workers>0时有效。通过查阅源码和GitHub讨论,作者修改了代码以确保在单进程模式下正确处理,解决了问题。
摘要由CSDN通过智能技术生成

今天跑huggingface的示例的时候,遇到了最让我头疼的问题,国内网上还没有对应的解释,我可能是第一人(汗)先看看报错:

Traceback (most recent call last):
  File "F:\transformer\transformers\examples\pytorch\image-classification\run_image_classification.py", line 451, in <module>
    main()
  File "F:\transformer\transformers\examples\pytorch\image-classification\run_image_classification.py", line 425, in main
    train_result = trainer.train(resume_from_checkpoint=checkpoint)
  File "F:\anaconda\envs\gpu\lib\site-packages\transformers-4.38.0.dev0-py3.9.egg\transformers\trainer.py", line 1597, in train
    return inner_training_loop(
  File "F:\anaconda\envs\gpu\lib\site-packages\transformers-4.38.0.dev0-py3.9.egg\transformers\trainer.py", line 1635, in _inner_training_loop
    train_dataloader = self.get_train_dataloader()
  File "F:\anaconda\envs\gpu\lib\site-packages\transformers-4.38.0.dev0-py3.9.egg\transformers\trainer.py", line 845, in get_train_dataloader
    return self.accelerator.prepare(DataLoader(train_dataset, **dataloader_params))
  File "F:\anaconda\envs\gpu\lib\site-packages\torch\utils\data\dataloader.py", line 241, in __init__
    raise ValueError('prefetch_factor option could only be specified in multiprocessing.'
ValueError: prefetch_factor option could only be specified in multiprocessing.let num_workers > 0 to enable multiprocessing.

可以看到报错信息是:prefetch_factor这个属性只有在num_workers大于0的时候才能被定义。但是我去看了看源码,很明显train源码中定义没有问题啊!
在这里插入图片描述然后我在github上的pytorch的issue中发现了有人提出了疑问问题在此

 if num_workers == 0 and prefetch_factor != 2: 
     raise ValueError('prefetch_factor option could only be specified in multiprocessing.' 
                      'let num_workers > 0 to enable multiprocessing.') 

上面这段是pytorch的源码,num_workers表示要用于数据加载的子进程数,prefetch_factor表示提前加载的batch数,也就是每个 worker 提前加载 的 sample 数量。虽然我现在不是很懂为什么要这么写,但是我可以确定的是当num_workers=0的时候prefetch_factor应该是没有意义的(关于里面的细节我没有深入,希望明白原理的人看到之后能在评论区补充,谢谢),所以源码这么写就一定会报错了,然后我根据github上某人的代码,修改如下:

if num_workers > 0:
    if prefetch_factor is None:
        prefetch_factor = 2   # default value
else:
    if prefetch_factor is not None:
        raise ValueError('prefetch_factor option could only be specified in multiprocessing.' 
                         'let num_workers > 0 to enable multiprocessing, otherwise set prefetch_factor to None.')

成功运行起来了!这是跑示例遇到的最后一个坑!感谢!

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值