多显卡训练指定显卡(A800)
模型:https://github.com/zhulf0804/PointPillars
通过指定显卡7进行训练: torch.cuda.set_device(7)
RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda7 and cuda0
报错位置
features = features.permute(0, 2, 1).contiguous() # (p1 + p2 + ... + pb, 9, num_points)把第二维度第三维度换一下[6169, 9, 32]
print(features.device)"device 7"
print(self.conv(features).device)
features = F.relu(self.bn(self.conv(features)))
问题原因:输入x和对应权重不在同一块显卡上。w在显卡0上,x在显卡7上。
分析:经过排查带入的np数组已经加载在指定显卡上。看了一下报错的位置上self.conv卷积里面输入除了x还有权重,证明权重是并不是运行在device 7上的,于是产生报错。
torch.cuda.set_device(7) 这条指令只保证了输入的数据都运行在显卡7上,很显然此条命令并非对模型的初始权重设置产生作用,于是模型加载默认的device 0。
于是增加代码:
if not args.no_cuda:
pointpillars = PointPillars(nclasses=args.nclasses).cuda()
torch.nn.DataParallel(pointpillars,device_ids=[7])#增加代码
else:
pointpillars = PointPillars(nclasses=args.nclasses)
loss_func = Loss()
增加了对模型的初始设置,模型继承了nn.Module所以,一次设置,内部的所有权重都基于显卡7运行。
原文地址:https://blog.csdn.net/qq_35210952/article/details/143719760
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!