这个坑值得记一笔。多进程用 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 传张量。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
