环境变量
NCCL具有一组广泛的环境变量,可针对特定使用进行调整。
它们也可以在/etc/nccl.conf中静态设置(供管理员设置系统范围的值)或~/.nccl.conf中设置(供用户设置)。例如,这些文件可以包含:
NCCL_DEBUG=WARN
NCCL_SOCKET_IFNAME==ens1f0
NCCL_P2P_DISABLE
NCCL_P2P_DISABLE
变量禁用对等通信(P2P)传输,该传输使用GPU之间的CUDA直接访问,使用NVLink或PCI。
接受的值
定义并设置为1以禁用直连的GPU到GPU(P2P)通信。
NCCL_P2P_LEVEL
(自2.3.4版开始)
NCCL_P2P_LEVEL
变量允许用户精确控制何时在GPU之间使用对等通信(P2P)传输。该级别定义了NCCL将使用P2P传输的GPU之间的最大距离。应使用表示路径类型的短字符串来指定使用P2P传输的路径截止点。
如果没有指定,NCCL将尝试基于其运行的架构和环境来优化选择一个值。
接受的值
- LOC:从不使用P2P(始终禁用)
- NVL:当GPU通过NVLink连接时使用P2P
- PIX :当GPU在同一PCI开关上时使用P2P。
- PXB:当GPU通过PCI开关连接时使用P2P(可能有多个跳跃)。
- PHB:当GPU位于同一NUMA节点上时使用P2P。流量将通过CPU传输。
- SYS:在NUMA节点之间使用P2P,可能跨越SMP互连(例如QPI/UPI)。
整数值(传统)
还有一个选项可以将NCCL_P2P_LEVEL
声明为对应于路径类型的整数。这些数字值保留为向后兼容性,适用于以前允许使用数字值的用户。
由于路径类型可能会出现破坏性变化,因此不建议使用整数值-文本值可能随时间而变化。为避免调试配置时出现困难,请使用字符串标识符。
- LOC:0
- PIX:1
- PXB:2
- PHB:3
- SYS:4
大于4的值将被解释为SYS。不支持使用传统级别整数的NVL。
NCCL_P2P_DIRECT_DISABLE
NCCL_P2P_DIRECT_DISABLE
变量禁止NCCL直接通过P2P访问同一进程的GPU之间的用户缓冲区。当用户缓冲区是使用不自动使其对由同一进程管理的其他GPU可访问的API分配的时候,这将很有用,并且带有P2P访问。
接受的值
定义并设置为1以禁用跨GPU直接访问用户缓冲区。
NCCL_SHM_DISABLE
NCCL_SHM_DISABLE
变量禁用共享存储器(SHM)传输。当无法进行对等通信时,SHM在设备之间使用,因此使用主机内存。当禁用SHM时,NCCL将使用网络(即InfiniBand或IP套接字)在CPU插槽之间进行通信。
接受的值
定义并设置为1以禁用通过共享内存(SHM)的通信。
NCCL_SOCKET_IFNAME
NCCL_SOCKET_IFNAME
变量指定用于通信的IP接口。
接受的值
定义为要由NCCL使用的接口前缀列表。
使用^
符号,NCCL将排除以列表中任何前缀开头的接口。
要匹配(或不匹配)精确的接口名称,而不是前缀,请在字符串前面加上=
字符。
示例:
eth
:使用以eth
开头的所有接口,例如eth0
,eth1
,...
=eth0
:仅使用接口eth0
^docker
:不使用以docker
开头的任何接口
^=docker0
:不使用接口docker0
。
注意:除非没有其他可用的接口,否则默认情况下不会选择环回接口(lo
)和docker接口(docker *
)。如果你想使用lo
或docker *
而不是其他接口,则需要使用NCCL_SOCKET_IFNAME
来显式选择它们。默认算法也会优先选择以ib
开头的接口。设置NCCL_SOCKET_IFNAME
将绕过自动接口选择算法,并可以使用与手动选择匹配的所有接口。
NCCL_SOCKET_FAMILY
NCCL_SOCKET_FAMILY
变量允许用户强制NCCL仅使用IPv4或IPv6接口。
可接受的值
设置为AF_INET
表示强制使用IPv4,设置为AF_INET6
表示强制使用IPv6。
NCCL_SOCKET_NTHREADS
(自2.4.8起)
NCCL_SOCKET_NTHREADS
变量指定每个网络连接的CPU辅助线程数,用于套接字传输。增加此值可以增加套接字传输性能,但会增加CPU使用率。
可接受的值
1到16。在AWS上,默认值为2;在具有gVNIC网络接口的Google Cloud实例上,默认值为4(自2.5.6起);在其他情况下,默认值为1。
对于通用的100G网络,可以将此值手动设置为4。但是,NCCL_SOCKET_NTHREADS
和NCCL_NSOCKS_PERTHREAD
的乘积不能超过64。另请参阅NCCL_NSOCKS_PERTHREAD
。
NCCL_NSOCKS_PERTHREAD
(自2.4.8起)
NCCL_NSOCKS_PERTHREAD
变量指定套接字传输的每个辅助线程打开的套接字数。在每个套接字速度受限的环境中,将此变量设置为大于1可能会提高网络性能。
可接受的值
在AWS上,默认值为8;在其他情况下,默认值为1。
对于通用的100G网络,可以将此值手动设置为4。但是,NCCL_SOCKET_NTHREADS
和NCCL_NSOCKS_PERTHREAD
的乘积不能超过64。另请参阅NCCL_SOCKET_NTHREADS
。
NCCL_DEBUG
NCCL_DEBUG
变量控制从NCCL显示的调试信息。此变量通常用于调试。
可接受的值
VERSION - 在程序开始时打印NCCL版本。
WARN - 每当任何NCCL调用出错时打印明确的错误消息。
INFO - 打印调试信息
TRACE - 在每次调用时打印可重现的跟踪信息。
NCCL_BUFFSIZE
NCCL_BUFFSIZE
变量控制NCCL在GPU对之间通信时使用的缓冲区的大小。
如果在使用NCCL时遇到内存限制问题,或者认为更改缓冲区大小会提高性能,可以使用此变量。
可接受的值
默认值为4194304(4 MB)。
值为整数,以字节为单位。建议使用2的幂。例如,1024将给出一个1K的缓冲区。
NCCL_NTHREADS
NCCL_NTHREADS
变量设置每个CUDA块的CUDA线程数。NCCL将为每个通信通道启动一个CUDA块。
如果认为GPU时钟较低并且希望增加线程数,可以使用此变量。
您还可以使用此变量来减少线程数以减少GPU负载。
可接受的值
最近一代的GPU默认值为512,一些旧的GPU为256。
允许的值为64、128、256和512。
NCCL_MAX_NCHANNELS
(自2.0.5起为NCCL_MAX_NRINGS,自2.5.0起为NCCL_MAX_NCHANNELS)
NCCL_MAX_NCHANNELS
变量限制NCCL可以使用的通道数量。减少通道数量也会减少用于通信的CUDA块数量,从而减少对GPU计算资源的影响。
旧的NCCL_MAX_NRINGS
变量(用于2.4之前的版本)在新版本中仍可以作为别名使用,但如果设置了NCCL_MAX_NCHANNELS
,则会被忽略。
可接受的值
任何大于或等于1的值。
NCCL_MIN_NCHANNELS
(自2.2.0起为NCCL_MIN_NRINGS,自2.5.0起为NCCL_MIN_NCHANNELS)
NCCL_MIN_NCHANNELS
变量控制NCCL要使用的最小通道数。增加通道数还会增加NCCL使用的CUDA块的数量,这可能有助于提高性能;但是,它会使用更多的CUDA计算资源。
当在通常只创建一个通道的平台上使用聚合集合时,这是特别有用的。
旧的NCCL_MIN_NRINGS
变量(在2.4之前使用)在新版本中仍然作为别名工作,但如果设置了NCCL_MIN_NCHANNELS
,则会被忽略。
可接受的值
默认值取决于平台。设置为整数值,最多为12(最多为2.2),16(2.3和2.4)或32(2.5及更高版本)。
NCCL_CROSS_NIC
NCCL_CROSS_NIC
变量控制NCCL是否允许环形/树形使用不同的网络接口卡(NIC),导致节点间通信在不同节点上使用不同的NIC。
为了在使用多个NIC时最大限度地提高节点间通信性能,NCCL尝试在节 点间的相同NIC之间进行通信,以允许网络设计,其中每个节点的每个NIC连接到不同的网络交换机(网络轨道),并避免任何流量干扰的风险。因此,NCCL_CROSS_NIC
设置取决于网络拓扑,特别取决于网络结构是否经过轨道优化。
这对于只有一个NIC的系统没有影响。
可接受的值
0:始终对于相同的环形/树形使用相同的NIC,以避免穿越网络轨道。适用于具有每个NIC交换机(轨道)且相互轨道连接速度较慢的网络。请注意,对于某些特殊情况,NCCL仍然可能导致跨轨道通信,因此轨道仍然需要在顶部连接。
1:不尝试为相同的环形/树形使用相同的NIC。适用于来自节点的所有NIC都连接到同一交换机的网络,因此尝试通过相同的NIC进行通信不会有助于避免流量冲突。
2:(默认值)尝试为相同的环形/树形使用相同的NIC,但如果这样做会获得更好的性能,仍然允许使用其他NIC。
NCCL_CHECKS_DISABLE
(自2.0.5版本起,自2.2.12版本起弃用)
NCCL_CHECKS_DISABLE
变量可用于在每个集合调用中禁用参数检查。检查在开发过程中很有用,但会增加延迟。可以禁用它们以提高在生产中的性能。
可接受的值
默认值为0,设置为1可禁 用检查。
NCCL_CHECK_POINTERS
(自2.2.12版本起)
NCCL_CHECK_POINTERS
变量使能在每个集合调用中检查CUDA内存指针。检查在开发过程中很有用,但可能会增加延迟。
可接受的值
默认值为0,设置为1可启用检查。
将其设置为1将恢复到2.2.12版本之前的NCCL的原始行为。
NCCL_LAUNCH_MODE
(自2.1.0版本起)
NCCL_LAUNCH_MODE
变量控制NCCL如何启动CUDA核函数。
可接受的值
默认值为PARALLEL。
将其设置为GROUP将为管理多个GPU的进程使用合作组(CUDA 9.0及更高版本)。这在2.9版本中已弃用,可能在将来的版本中被删除。
NCCL_IB_DISABLE
NCCL_IB_DISABLE
变量禁用NCCL可用的IB/RoCE传输,而使用IP套接字进行回退。
可接受的值
定义并设置为1以禁用使用InfiniBand Verbs进行通信(并强制使用其他方法,例如IP套接字)。
NCCL_IB_HCA
NCCL_IB_HCA
变量指定要用于通信的RDMA接口。
可接受的值
定义过滤要由NCCL使用的IB Verbs接口。列表是用逗号分隔的;可以使用冒号符号指定端口号。可选的前缀^
表示列表是排除列表。第二个可选前缀=
表示tokens是精确的名称,否则默认情况下NCCL将把每个token视为前缀。
示例:
mlx5
:使用以mlx5
开头的所有卡的所有端口
=mlx5_0:1,mlx5_1:1
: 使用 mlx5_0
和 mlx5_1
卡的1号端口。
^=mlx5_1,mlx5_4
: 不使用 mlx5_1
和 mlx5_4
卡。
注意:如果前面没有加 =
,使用 mlx5_1
会选择 mlx5_1
和 mlx5_10
到 mlx5_19
(如果存在)。因此,建议始终添加 =
前缀以确保精确匹配。
NCCL_IB_TIMEOUT
NCCL_IB_TIMEOUT
变量控制 InfiniBand Verbs 超时时间。
超时时间的计算公式为 4.096 µs * 2 ^ timeout,具体值取决于网络的大小。增加 该值可以在非常大的网络上提升性能。例如,当调用 ibv_poll_cq 时出现错误12时,可以增加该值。
有关更多信息,请参阅 InfiniBand 规范第一卷(https://www.infinibandta.org/ibta-specifications-download)第12.7.34节(本地确认超时)。
可接受的取值
NCCL 默认值为 18(自从2.14版本起,之前版本为14)。
取值范围为 1-22。
NCCL_IB_RETRY_CNT
(自从2.1.15版本起)
NCCL_IB_RETRY_CNT
变量控制 InfiniBand 重试次数。
有关更多信息,请参阅 InfiniBand 规范第一卷(https://www.infinibandta.org/ibta-specifications-download)第12.7.38节。
可接受的取值
默认值为 7。
NCCL_IB_GID_INDEX
(自从2.1.4版 本起)
NCCL_IB_GID_INDEX
变量定义在 RoCE 模式下使用的全局 ID 索引。请参阅 InfiniBand 的 show_gids 命令以设置该值。
有关更多信息,请参阅 InfiniBand 规范第一卷(https://www.infinibandta.org/ibta-specifications-download)或厂商文档。
可接受的取值
默认值为 0。
NCCL_IB_SL
(自从2.1.4版本起)
定义 InfiniBand 服务级别(Service Level)。
有关更多信息,请参阅 InfiniBand 规范第一卷(https://www.infinibandta.org/ibta-specifications-download)或厂商文档。
sidebar_position: 100
可接受的取值
默认值为 0。
NCCL_IB_TC
(自从2.1.15版本起)
定义 InfiniBand 流量类别(Traffic Class)字段。
有关更多信息,请参阅 InfiniBand 规范第一卷(https://www.infinibandta.org/ibta-specifications-download)或厂商文档。
可接受的取值
默认值为 0。
NCCL_IB_AR_THRESHOLD
(自从2.6版本起)
超过该阈值时,我们会将 InfiniBand 数据发送到单独的消息中,以利用自适应路由功能。
可接受的取值
以字节为单位的大小, 默认值为 8192。
将其设置为大于 NCCL_BUFFSIZE 将完全禁用自适应路由的使用。
NCCL_IB_CUDA_SUPPORT
(自从2.4.0版本开始已删除,参见 NCCL_NET_GDR_LEVEL)
NCCL_IB_CUDA_SUPPORT
变量用于强制或禁用使用 GPU Direct RDMA。默认情况下,只有在拓扑允许时,NCCL 才会启用 GPU Direct RDMA。该变量可以禁用这种行为,或在所有情况下强制使用 GPU Direct RDMA。
可接受的取值
定义并设置为0以禁用 GPU Direct RDMA。
定义并设置为1以强制使用 GPU Direct RDMA。
NCCL_IB_QPS_PER_CONNECTION
(自从2.10版本起)
两个进程之间每个连接使用的 IB 队列对数。这在需要多个队列对以获得良好的路由熵的多级布线中很有用。有关在多个 QP 上拆分数据的不同方式,请参阅 NCCL_IB_SPLIT_DATA_ON_QPS
,因为它会影响性能。
可接受的取值
取值范围为 1 到 128,默认值为 1。
NCCL_IB_SPLIT_DATA_ON_QPS
(自从2.18版本起)
此参数控制在创建多个队列对时如何使用队列对。设置为1(拆分模式,默认值),每个消息将平均分配到每个队列对上。如果使用了很多队列对,这可能会导致可见的延迟下降。设置为0(轮询模式),每个消息都将以轮询模式使用队列对。不发送多个消息的操作将不使用所有队列对。
可接受的取值
为 0 或 1。默认值为 1。将其设置为 0 将切换到轮询模式。
NCCL_IB_PCI_RELAXED_ORDERING
(自从2.12版本起)
启用IB Verbs传输的松散排序功能。在虚拟化环境中,松散排序可以极大地提高InfiniBand网络的性能。
可接受的值
设置为2时,如果可用,则自动使用松散排序。设置为1时,强制使用松散排序,如果不可用,则失败。设置为0时,禁用松散排序。默认值为2。
NCCL_IB_ADAPTIVE_ROUTING
( 自2.16版本开始)
启用IB Verbs传输的自适应路由功能。自适应路由可以提高大规模通信的性能。必须相应地选择启用自适应路由的系统定义的SL(参见“NCCL_IB_SL”)。
可接受的值
默认情况下,在IB网络上启用(1)。默认情况下,在RoCE网络上禁用(0)。将其设置为1以强制使用支持自适应路由的数据传输。
NCCL_MEM_SYNC_DOMAIN
(自2.16版本开始)
设置NCCL内核(CUDA 12.0及更高版本和sm90)的默认内存同步域。当NCCL内核和应用程序计算内核使用不同的域时,内存同步域可以帮助消除干扰。
可接受的值
默认值为cudaLaunchMemSyncDomainRemote
(1)。当前支持的值为0和1。
NCCL_CUMEM_ENABLE
(自2.18版本开始)
在NCCL中使用CUDA cuMem*函数分配内存。
可接受的值
0或1。默认值为0。
NCCL_NET
(自2.10版本开始)
强制NCCL使用特定网络,例如确保NCCL使用外部插件并且不自动回退到内部IB或Socket实现。设置此环境变量将覆盖所有通信器(参见ncclConfig
)中的netName
配置;如果未设置(未定义),则网络模块将由配置确定;如果没有传递配置,则NCCL将自动选择最佳网络模块。
可接受的值
NCCL_NET的值必须与使用的NCCL网络的名称完全匹配(不区分大小写)。内部网络名称为“IB”(通用IB Verbs)和“Socket”(TCP/IP套接字)。外部网络插件定义自己的名称。默认值为未定义。
NCCL_NET_PLUGIN
(自2.11版本开始)
将其设置为后缀字符串以在多个NCCL网络插件中进行选择。设置此选项将导致NCCL查找文件“libnccl-net-<suffix>.so”而不是默认的“libnccl-net.so”。
例如,设置NCCL_NET_PLUGIN=aws
将导致NCCL使用libnccl-net-aws.so(前提是系统上存在该文件)。设置NCCL_NET_PLUGIN=none
将导致NCCL不使用任何插件。
可接受的值
插件文件名称的后缀字符串,或“none”。
NCCL_NET_GDR_LEVEL(以前称为NCCL_IB_GDR_LEVEL)
(自2.3.4版本开始。在2.4.0中,NCCL_IB_GDR_LEVEL更名为NCCL_NET_GDR_LEVEL)
NCCL_NET_GDR_LEVEL
变量允许用户精细控制何时在NIC和GPU之间使用GPU Direct RDMA。该级别定义了NIC和GPU之间的最大距离。应使用表示路径类型的字符串来指定GpuDirect的拓扑截断。
如果未指定此项,NCCL将根据其运行的架构和环境尝试选择最佳值。
可接受的值
- LOC:永不使用GPU Direct RDMA。(始终禁用)
- PIX:当GPU和NIC在同一个PCI交换机上时使用GPU Direct RDMA。
- PXB:当GPU和NIC通过PCI交换机连接时使用GPU Direct RDMA(可能经过多个跳跃)。
- PHB:当GPU和NIC在同一个NUMA节点上时使用GPU Direct RDMA。流量将通过CPU进行传输。
- SYS:甚至在NUMA节点之间的SMP互联(例如QPI/UPI)上也使用GPU Direct RDMA。(始终启用)
整数值(遗留)
还有将NCCL_NET_GDR_LEVEL
声明为对应于路径类型的整数的选项。这些数字值是为了与之前不支持字符串的用户的向后兼容性而保留的。
整数值由于路径类型的破坏性变更被不鼓励使用 - 文字 值随着时间的推移可以发生变化。为了避免繁琐的配置调试,使用字符串标识符。
- LOC : 0
- PIX : 1
- PXB : 2
- PHB : 3
- SYS : 4
大于4的值将被解释为SYS。
NCCL_NET_GDR_READ
NCCL_NET_GDR_READ
变量在发送数据时启用GPU Direct RDMA,只要GPU-NIC的距离在NCCL_NET_GDR_LEVEL
指定的范围内。在2.4.2之前,默认情况下禁用GDR读取,即在发送数据时,数据首先存储在CPU内存中,然后传输到InfiniBand卡。自2.4.2以来,GDR读取在基于NVLink的平台上默认启用。
注意:在某些平台上,如PCI-E,从GPU内存直接读取数据发送速度略慢于从CPU内存读取的速度。
可接受的值
0或1。定义并设置为1,以使用GPU Direct RDMA直接将数据发送到NIC(绕过CPU)。
在2.4.2之前,对于所有平台,默认值为0。自2.4.2以来,对于基于NVLink的平台,默认值为1,否则为0。
NCCL_NET_SHARED_BUFFERS
(自2.8版本起)
允许使用共享缓冲区进行节点间点对点通信。这将为所有远程对等体使用一个大型连接池,其内存使用量恒定,而不是随远程对等体数量线性增加。
可接受的值
默认值为1(启用)。设置为0以禁用。
NCCL_NET_SHARED_COMMS
(自2.12版本起)
在PXN上下文中重复使用相同的连接。这允许进行消息聚合,但也可能降低网络数据包的熵。
可接受的值
默认值为1(启用)。设置为0以禁用。
NCCL_SINGLE_RING_THRESHOLD
(自2.1版起,2.3版移除)
NCCL_SINGLE_RING_THRESHOLD
变量设置NCCL只使用一个环的限制。这将限制带宽但提高延迟。
可接受的值
默认值为262144(256kB),适用于计算能力为7及以上的GPU。否则,默认值为131072(128kB)。
值为字节的整数。
NCCL_LL_THRESHOLD
(自2.1版起,2.5版移除)
NCCL_LL_THRESHOLD
变量 设置低延迟算法使用的大小限制。
可接受的值
默认值为16384(2.2之前)或者取决于等级数量(2.3及之后)。
值为字节的整数。
NCCL_TREE_THRESHOLD
(自2.4版起,2.5版移除)
NCCL_TREE_THRESHOLD
变量设置NCCL使用树算法而不是环算法的大小限制。
可接受的值
默认值取决于等级数量。
值为字节的整数。
NCCL_ALGO
(自2.5版起)
NCCL_ALGO
变量定义NCCL将使用的算法。
可接受的值
算法的逗号分隔列表(不区分大小写),包括: Tree、Ring、Collnet(2.13之前)、CollnetDirect(2.14+)和CollnetChain(2.14+)。NVLS(2.17+)是用来启用NVLink SHARP卸载的算法。要指定要排除的算法(而不是包括),请以^开头。
默认值为Tree,Ring,CollnetDirect,CollnetChain,NVLS
。
NCCL_PROTO
(自2.5版起)
NCCL_PROTO
变量定义NCCL将使用的协议。
可接受的值
协议的逗号分隔列表(不区分大小写),包括: LL、LL128、Simple。要指定要排除的协议(而不是包括),请以^开头。
默认值为在支持LL128的平台上为LL,LL128,Simple
,否则为LL,Simple
。
NCCL_IGNORE_CPU_AFFINITY
(自2.4.6版起)
NCCL_IGNORE_CPU_AFFINITY
变量可用于使NCCL忽略作业提供的CPU亲和性,而只使用GPU亲和性。
可接受的值
默认值为0,将其设置为1以使NCCL忽略作业提供的CPU亲和性。
NCCL_DEBUG_FILE
(自2.2.12版起)
NCCL_DEBUG_FILE
变量将NCCL调试日志输出定向到文件。文件名格式可以设置为filename.%h.%p,其中*%h将被替换为主机名,%p*将被替换为进程PID。这不接受路径中的~
字符,请先转换为相对或绝对路径。
可接受的值
默认输出文件为stdout,除非设置了这个环境变量。
设置NCCL_DEBUG_FILE
会导致NCCL创建并覆盖同名的任何先前文件。
注意:如果文件名在所有作业进程中不唯一,则输出可能会丢失或损坏。
NCCL_DEBUG_SUBSYS
(自2.3.4版本起)
NCCL_DEBUG_SUBSYS
变量允许用户根据子系统过滤NCCL_DEBUG=INFO
的输出。以逗号分隔的子系统列表将包含在NCCL调试日志中。
在子系统名称前加上'^'将禁用该子系统的日志记录。
可接受的值
默认值为INIT。
支持的子系统名称有INIT(表示初始化)、COLL(表示集合)、P2P(表示点对点)、SHM(表示共享内存)、NET(表示网络)、GRAPH(表示拓扑检测和图搜索)、TUNING(表示算法/协议调优)、ENV(表示环境设置)、ALLOC(表示内存分配)和ALL(包括每个子系统)。
NCCL_COLLNET_ENABLE
(自2.6版本起)
启用CollNet插件的使用。