PyTorch 等深度学习框架在使用多个 GPU 时如何处理内存?
How do deep learning frameworks such as PyTorch handle memory when using multiple GPUs?
我最近 运行 遇到了 运行 单个 Nvidia V100 内存不足的情况。我在使用多个 GPU 训练网络方面经验有限,因此我不太确定数据并行化过程的工作原理。假设我正在使用需要 20-25GB 内存的模型和批量大小。有什么方法可以利用两个 16GB V100 之间的全部 32GB 内存? PyTorch 的 DataParallel 功能会实现这一点吗?我想也有可能分解模型并使用模型并行性。请原谅我对这个问题缺乏了解。提前感谢您的帮助或澄清!
你应该将模型并行性作为最后的资源,并且只有当你的模型不适合单个 GPU 的内存时(使用 16GB/GPU,你有足够的空间来容纳一个巨大的模型)。
如果你有两个 GPU,我会使用数据并行。在数据并行中,你在每个 GPU 上都有一个模型副本,每个副本都有一个批处理。然后收集梯度并用于更新副本。
Pytorch 使实现数据并行变得非常容易,因为您只需要将模型实例包装在 nn.DataParallel
:
model = torch.nn.DataParallel(model, device_ids=[0, 1])
output = model(input_var)
我最近 运行 遇到了 运行 单个 Nvidia V100 内存不足的情况。我在使用多个 GPU 训练网络方面经验有限,因此我不太确定数据并行化过程的工作原理。假设我正在使用需要 20-25GB 内存的模型和批量大小。有什么方法可以利用两个 16GB V100 之间的全部 32GB 内存? PyTorch 的 DataParallel 功能会实现这一点吗?我想也有可能分解模型并使用模型并行性。请原谅我对这个问题缺乏了解。提前感谢您的帮助或澄清!
你应该将模型并行性作为最后的资源,并且只有当你的模型不适合单个 GPU 的内存时(使用 16GB/GPU,你有足够的空间来容纳一个巨大的模型)。
如果你有两个 GPU,我会使用数据并行。在数据并行中,你在每个 GPU 上都有一个模型副本,每个副本都有一个批处理。然后收集梯度并用于更新副本。
Pytorch 使实现数据并行变得非常容易,因为您只需要将模型实例包装在 nn.DataParallel
:
model = torch.nn.DataParallel(model, device_ids=[0, 1])
output = model(input_var)