NCCL和NVSHMEM的主要区别是什么?

虽然都是NVIDIA家的,名字也像兄弟,这导致很多会把这两个库搞混,其实这两个库在实际上设计思路完全不同。

先说NCCL吧,这个库基本上已经是深度学习分布式训练的标配了。它的核心就是做集合通信——什么AllReduce、Broadcast这些操作。你可以理解成一群GPU需要统一行动的时候用的工具。比如PyTorch的DistributedDataParallel,底层就是靠NCCL来把各个GPU算出来的梯度汇总起来。这种场景下,所有参与的GPU都知道彼此的存在,大家一起配合完成一个操作。

NVSHMEM就不太一样了。它用的是PGAS模型(Partitioned Global Address Space),就是每个GPU可以直接访问别的GPU的内存,不需要对方配合。这就是所谓的单边通信。比如说,GPU A想从GPU B那拿点数据,用NCCL的话两边都得参与,但用NVSHMEM的话,A可以自己直接去B的内存里读,B甚至不用知道这事儿。

如果从通信模式来看,NCCL擅长的是那种规整的、大批量的数据交换。这正是为分布式训练来设计的,训练神经网络的时候每个iteration结束你要做梯度同步,这种通信模式是非常规律的,NCCL针对这个做了深度优化延迟能压得很低。但如果你的通信模式很零散、不规则,NCCL就不太适合了。

而NVSHMEM正好相反,它在处理不规则通信的时候特别有优势。比如图神经网络里面,节点和邻居的通信关系可能很复杂,每个节点需要访问的邻居数量、位置都不固定。这种情况下NVSHMEM的灵活性就体现出来了——你想访问谁的数据直接去拿就行,不需要所有GPU都同步。科学计算里的halo exchange(边界交换)就是类似的场景。

性能上我没测试过NVSHMEM不太清楚,不过NCCL在集合通信上真的没问题,NVIDIA这么多年优化下来,bandwidth利用率和延迟控制都做到极致了。我只用过几百张卡(具体说可以上千,我没这个资源无法测试所以就不说了)NCCL的AllReduce性能依然很能打。但是理论上来说NVSHMEM的延迟会更低一些,因为它本来就是为这个设计的。

编程复杂度方面,NCCL用起来相对简单,API不多,基本就是那几个集合操作。NVSHMEM就复杂多了,你得管理对称内存(symmetric memory),处理各种同步原语,学习曲线陡一些。不过换来的是更大的灵活性。

实际应用中怎么选?如果你是做深度学习训练,基本不用想,NCCL就完了。现在主流框架都集成得很好,开箱即用。而且基本上你也不用操心,都封装好了,我也是看DistributedDataParallel的时候了解了一些皮毛。

至于NVSHMEM,我没实际用过不太清楚,不过我记得之前见过有人做大规模图计算,因为图的拓扑结构导致通信非常不规则。一开始尝试用NCCL硬怼,结果发现效率很低,后来切到NVSHMEM,让每个节点自己去邻居那里拿数据,性能提升还挺明显的。

最后提一句,这两个库其实代表了两种不同的并行计算哲学。NCCL是BSP(Bulk Synchronous Parallel)那一套,强调全局同步和批量操作。NVSHMEM更接近异步并行的思路,追求局部性和灵活性。理解这个区别你就能更好地判断什么时候该用哪个工具了。

原始链接: https://www.zhihu.com/question/1963176103897179405/answer/1963201826670244410
侵权请联系站方: [email protected]

相关推荐

换一批