自学内容网 自学内容网

多显卡训练指定显卡(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)!