pytorch使用多显卡训练

多显卡参考链接

链接1
链接2
链接3

第一步:设置多卡训练正确

如果服务器的0号卡被别人占用,就得在刚开始加上这几行代码,手动更改0号显卡是2,1号卡是3。实际上,在通过各种提交方式提交程序作业至服务器,被分配好显卡之后,CUDA_VISIBLE_DEVICES已经被设置为可用的卡的逻辑编号了,直接写就好了。
如果想得知自己使用的是哪一张卡,可以使用os.environ查看系统环境比那辆,应该就能找到。
习惯放在import os之后

os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = "2, 3"

为什么这样写:详见
怎样选卡,超级详细?参考
训练的时候

device_ids = [0, 1]  # 这里的0和1就是前面的2和3
net = torch.nn.DataParallel(net) # , device_ids=device_ids)  # 就不加那个id选择,有多少用多少。
# 优化器的写法
optimizer = torch.optim.SGD(net.parameters(), lr=lr)
optimizer = nn.DataParallel(optimizer, device_ids=device_ids)

第二步:设置随机种子

def setup_seed(seed):
     torch.manual_seed(seed)
     torch.cuda.manual_seed_all(seed)
     np.random.seed(seed)
     random.seed(seed)
     torch.backends.cudnn.deterministic = True  # 为了确定算法,保证得到一样的结果。
     torch.backends.cudnn.enabled = True  # 使用非确定性算法
     torch.backends.cudnn.benchmark = True  # 是否自动加速。
# 设置随机数种子
setup_seed(20)

第三步:起飞小指南

就是有多少显卡,用多少显卡。

if device == 'cuda':
    net = torch.nn.DataParallel(net)
    net11 = torch.nn.DataParallel(net11)
    torch.cudnn.benchmark = True

第四步:‘DataParallel’ object has no attribute 'update’报错

这是因为使用DataParallel之后相当于给你的模型包装了一层DataParallel,可以在DataParallel之后使用model=model.module就变为直接可以用的模型,使用自己定义的其他函数了。

你可能感兴趣的:(pytorch,深度学习,人工智能)