这个坑值得记一笔。多进程用 torch.multiprocessing 共享一个 CUDA tensor,父进程把 tensor 放进 shared_memory 后子进程访问直接 bus error 并 core dump,驱动 535,torch 2.4,启动方式是 fork。

刚开始盯着「子进程继承了 CUDA context 但设备编号不一致」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。CUDA 显存不能跨进程用共享内存映射;tensor 的 storage 在 GPU 上,shm 只对 CPU 内存有效;用了 fork 启动,CUDA 上下文复制失败。

先确认 tensor 到底在哪个设备上

python -c "import torch;t=torch.zeros(4,device='cuda');print(t.device,t.is_shared())"

随后把数据搬到 CPU 再放进共享内存

python -c "import torch;t=torch.zeros(4).share_memory_();print(t.is_shared())"

接着改用 spawn 启动并限制可见设备

python -c "import torch.multiprocessing as mp;print(mp.get_start_method())"

子进程里先 to('cuda') 再使用

python -c "import torch;print(torch.zeros(4).to('cuda').device)"

这类问题以前遇到过,但这次的触发条件和上次不一样。

别只看报错消失,验证要多做一步。子进程能读到父进程写入的数据,张量值一致,进程不再 bus error,GPU 显存各自独立。

这里还有个坑。共享内存只解决 CPU 侧的零拷贝,GPU 显存没有跨进程共享这回事;多卡场景要么每个进程各自加载,要么用 NCCL 传张量。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189