0.导读
RuntimeError: Expected object of backend CPU but got backend CUDA for argument #2 'mat2'
运行错误:程序运行后端是CPU,但参数是CUDA
即:需要一个 CPU tensor, 你给的却是个 CUDA tensor
解决以上问题,需要慢慢查找,比较难以确定事发地点,如文章所说。
为了尽快解决这个问题,试试Pytorch调试神器TorchSnooper。
将torch的GPU代码改造为CPU的好处是什么?
答:对于实验狗来说,不想实验的进度被4个GPU限制者,每个程序得跑1-2天,2天下来,才跑了四个对比实验,严重影响速度。CPU可以nohup多个程序后台运行。
1.安装神器
pip install torchsnooper
安装完了以后,只需要用 @torchsnooper.snoop() 装饰一下要调试的函数,这个函数在执行的时候,就会自动 print 出来每一行的执行结果的 tensor 的形状、数据类型、设备、是否需要梯度的信息。
2.使用神器,检查问题
解决问题,将device="cuda"的字段注释掉,更多使用方法:Pytorch调试神器TorchSnooper 需要时再仔细看。
3.如果再转为GPU代码
将self.cuda设置为True,然后让数据都对应到CUDA空间内,如下图所示:4.时间对比 GPU vs CPU
测试结果,明显对比出,GPU能为训练的模型加速16倍了。。。。。。
cpu_train_epoch_1 = 126.8秒 = 2分钟
cpu_train_epoch_2 = 126.8秒 = 2分钟
cpu_test = 59.9秒 = 1分钟
gpu_train_epoch_1 = 7.8秒
gpu_train_epoch_2 = 7.6秒
gpu_test = 22秒
cpu
gpu
5.一个GPU可运行多个程序
如下图,GPU-0同时运行了3个程序,使用率为86%;GPU-3同时运行了2个程序,使用率为40%。 只要显卡没被100%占用,那么其他程序也仍可以调用。6.n个程序 vs 1个程序 共用一个GPU
多个程序共用一个GPU,有时候会发生资源等待,所以耗时会增加。
一个程序用一个GPU,资源充足,不会发生资源等待问题,速度比多个程序用一个GPU快。
5个程序使用一个GPU
1个程序使用一个GPU
网友评论