【Yolov5】RuntimeError: DataLoader worker (pid 25795) is killed by signal: Bus error.

本文针对PyTorch DataLoader在多线程环境下出现Bus error的问题进行了详细分析,并提供了有效的解决方案,包括调整num_workers参数及提高Docker容器内的共享内存限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Traceback (most recent call last):
  File "train.py", line 461, in <module>
    train(hyp, opt, device, tb_writer)
  File "train.py", line 271, in train
    pred = model(imgs)  # forward
  File "/usr/local/lib/python3.8/dist-packages/torch/nn/modules/module.py", line 722, in _call_impl
    result = self.forward(*input, **kwargs)
  File "/usr/local/lib/python3.8/dist-packages/torch/nn/parallel/data_parallel.py", line 154, in forward
    replicas = self.replicate(self.module, self.device_ids[:len(inputs)])
  File "/usr/local/lib/python3.8/dist-packages/torch/nn/parallel/data_parallel.py", line 159, in replicate
    return replicate(module, device_ids, not torch.is_grad_enabled())
  File "/usr/local/lib/python3.8/dist-packages/torch/nn/parallel/replicate.py", line 113, in replicate
    replica = module._replicate_for_data_parallel()
  File "/usr/local/lib/python3.8/dist-packages/torch/nn/modules/module.py", line 1378, in _replicate_for_data_parallel
    replica.__dict__ = self.__dict__.copy()
  File "/usr/local/lib/python3.8/dist-packages/torch/nn/modules/module.py", line 775, in __setattr__
    def remove_from(*dicts_or_sets):
  File "/usr/local/lib/python3.8/dist-packages/torch/utils/data/_utils/signal_handling.py", line 66, in handler
    _error_if_any_worker_fails()
RuntimeError: DataLoader worker (pid 25795) is killed by signal: Bus error. It is possible that dataloader's workers are out of shared memory. Please try to raise your shared memory limit.

排雷

1. 有些同学说只要 dataloader.num_workers = 0,可以解决,已经亲自试过,无法解决问题

2. 调小bach_size,当然,这个方法是可以让程序跑起来,但是看看GPU利用率吧,单张卡显存跑不满,GPU利用率也很低

错误原因:

由于在docker镜像中默认限制了shm(shared memory),然而数据处理时pythorch则使用了shm。这就导致了在运行多线程时会将超出限制的DataLoader并直接被kill掉。

dataloader从RAM中找本轮迭代要用的batch,如果找到了就使用。如果没找到,就要num_worker个worker继续加载batch到内存,直到dataloader在RAM中找到目标batch。

num_worker设置得大,好处是寻batch速度快,因为下一轮迭代的batch很可能在上一轮/上上一轮…迭代时已经加载好了。

坏处是内存开销大,也加重了CPU负担(worker加载数据到RAM的进程是CPU复制的嘛)。

num_workers的经验设置值是自己电脑/服务器的CPU核心数,如果CPU很强、RAM也很充足,就可以设置得更大些。

解决办法:

在起Docker容器时,设置 –shm-size

docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=2,3 --shm-size 8G -it --rm dev:v1 /bin/bash 

[PS] 注意这里的 --shm-size 8G 其大小可以根据个人电脑的配置设置适合自己的大小

参考资料:

Dataloader中的num_workers设置与docker的shared memory相关问题

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二十四桥下一句

您的鼓励是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值