Torch,如何将多个 GPU 用于不同的数据集

Posted

技术标签:

【中文标题】Torch,如何将多个 GPU 用于不同的数据集【英文标题】:Torch, how to use Multiple GPU for different dataset 【发布时间】:2021-04-16 22:04:01 【问题描述】:

假设我有 4 个不同的数据集和 4 个 GPU,如下所示

4 个数据集

dat0 = [np.array(...)], dat1 = [np.array(...)] , dat2 = [np.array(...)] , dat3 = [np.array(...)] 

4 个显卡

device = [torch.device(f'cuda:i') for i in range(torch.cuda.device_count())]

假设四个数据集都已经转换成张量并转移到4个不同的GPU。

现在,我有一个来自其他模块的函数 f 可以在 GPU 上使用

如何同时进行以下操作,

计算这个的4个resulf

 ans0 = f(dat0) on device[0], ans1 = f(dat1) on device[1], ans2 = f(dat2) on device[2], ans3 = f(dat3) on device[3]

然后将所有4个ans移回cpu然后计算总和

 ans = ans0 + ans1 + ans2 + ans3   

【问题讨论】:

您真的打算一次性将四个数据集的全部发送到四个 GPU 吗?您打算在哪里计算最终总和?另外 - 我应该说非常重要 - 你打算从 ans 反向传播吗? @Ivan 用于求和部分,它只是四个数组的求和并在 CPU 上完成。 ans 是我需要的最终结果 是的,但是你需要反向传播吗? @Ivan 嗨,我不需要反向传播。谢谢你的回答,我试试看。 【参考方案1】:

假设您只需要ans 即可进行推理。您可以轻松地执行这些操作,但您肯定需要函数 f 同时在所有四个 GPU 上。

这是我会尝试的:复制 f 四次并发送到每个 GPU。然后计算中间结果,将每个结果发送回 CPU 进行最终操作:

fns = [f.clone().to(device) for device in devices]

results = []
for fn, data in zip(fns, datasets):
    result = fn(data).detach().cpu()
    results.append(result)

ans = torch.stack(results).sum(dim=0)

【讨论】:

一个问题是,它是顺序运行还是同时运行? 我认为不会,因为它不是异步代码。对于多 GPU 使用,您可能需要使用 nn.DataParallel

以上是关于Torch,如何将多个 GPU 用于不同的数据集的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个 GPU 用于协同工作的多个模型?

单机多GPU训练模型入门指南(torch.nn.DataParallel)

如何在 Torch 的 GPU 上将张量的元素限制/舍入到小数点后 4 位?

单机多GPU训练模型入门指南(torch.nn.DataParallel)

将Pytorch模型从CPU转换成GPU

将 pytorch 数据加载器加载到 GPU 中