为什么需要设置 `NCCL_P2P_DISABLE=1` 和 `NCCL_IB_DISABLE=1`?
在分布式深度学习或多 GPU 训练中,NCCL(NVIDIA Collective Communications Library)是一个关键的通信库,用于在多个 GPU 或节点之间高效地传输数据。然而,在某些硬件或网络环境下,默认的 NCCL 配置可能会导致性能问题或错误。为了解决这些问题,通常需要设置以下两个环境变量:
export NCCL_P2P_DISABLE=1
export NCCL_IB_DISABLE=1
本文将详细解释这两个环境变量的作用、为什么需要设置它们,以及如何正确使用它们。
1. 什么是 NCCL?
NCCL(NVIDIA Collective Communications Library)是 NVIDIA 提供的一个高性能通信库,专为多 GPU 和多节点训练设计。它支持以下功能:
- 多 GPU 通信:在单个节点内的多个 GPU 之间高效传输数据。
- 多节点通信:在不同节点的 GPU 之间进行跨网络通信。
- 集体操作:如 AllReduce、Broadcast、Scatter 等,常用于分布式深度学习。
NCCL 默认会尝试使用最优的通信方式,例如:
- P2P(Peer-to-Peer):在单个节点内的 GPU 之间直接通信。
- IB(InfiniBand):在多个节点之间通过 InfiniBand 网络进行高速通信。
然而,在某些情况下,这些默认配置可能会导致问题,因此需要通过