训练模型时报错:
RuntimeError: Attempted to send CUDA tensor received from another process;
this is not currently supported. Consider cloning before sending.
翻译:RuntimeError:尝试发送从其他进程接收的 CUDA 张量;目前不支持此功能。在发送之前考虑克隆。
在我的项目中,这个问题被定位在dataloder的使用里,当numworks设置为非0值时,不报此错误,模型可以正常训练。
原因:出现这个问题的原因在于,如果dataloder的numworks设置为0,那么仅在主进程中加载数据,不使用多线程,在整理函数中如果有cuda上的tensor也没有问题。但是如果设置使用多线程,那么cuda上的数据就会不能在多个线程中传来传去,就会报出这个错误。
解决方法:调试程序,看看在dataloader的整理函数中哪个变量是在gpu上的,在dataset的geiitem里返回时直接把它放在cpu上。或者把numworkers设置为0。