2 回答
TA贡献1816条经验 获得超4个赞
GPU 本身有很多线程。在执行数组/张量操作时,它会在数组的一个或多个单元上使用每个线程。这就是为什么看起来一个可以充分利用 GPU 的运算应该在没有多个进程的情况下有效扩展的原因——单个 GPU 内核已经被大规模并行化了。
在评论中,您提到在小型基准测试中通过多个进程看到更好的结果。我建议使用更多作业运行基准测试以确保预热,十个内核似乎太小了一个测试。但是,如果您要找到一个彻底的代表性基准来始终更快地运行,那么我会相信良好的基准而不是直觉。
我的理解是在默认 CUDA 流上启动的内核会按顺序执行。如果您希望它们并行运行,我认为您需要多个流。查看 PyTorch 代码,我看到getCurrentCUDAStream()
内核中的代码,这让我认为 GPU 仍将按顺序运行来自所有进程的任何 PyTorch 代码。
这个 NVIDIA 讨论表明这是正确的:
https://devtalk.nvidia.com/default/topic/1028054/how-to-launch-cuda-kernel-in-different-processes/
较新的 GPU 可能能够并行运行多个内核(使用 MPI?),但似乎这只是通过时间切片实现的,所以我不确定我们是否应该期望更高的总吞吐量:
如何使用 Nvidia 多进程服务 (MPS) 运行多个非 MPI CUDA 应用程序?
如果您确实需要在两个并行推理调用中共享一个模型的内存,您是否可以只使用多个线程而不是进程,并从两个线程引用相同的模型?
要真正让 GPU 并行运行多个内核,您可以在 PyTorch 中使用 nn.Parallel。请参阅此处的讨论: https ://discuss.pytorch.org/t/how-can-l-run-two-blocks-in-parallel/61618/3
添加回答
举报