跳到主要内容

环境变量

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开头的所有接口,例如eth0eth1,...

=eth0:仅使用接口eth0

^docker:不使用以docker开头的任何接口

^=docker0:不使用接口docker0

注意:除非没有其他可用的接口,否则默认情况下不会选择环回接口(lo)和docker接口(docker *)。如果你想使用lodocker *而不是其他接口,则需要使用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_NTHREADSNCCL_NSOCKS_PERTHREAD的乘积不能超过64。另请参阅NCCL_NSOCKS_PERTHREAD

NCCL_NSOCKS_PERTHREAD

(自2.4.8起)

NCCL_NSOCKS_PERTHREAD变量指定套接字传输的每个辅助线程打开的套接字数。在每个套接字速度受限的环境中,将此变量设置为大于1可能会提高网络性能。

可接受的值

在AWS上,默认值为8;在其他情况下,默认值为1。

对于通用的100G网络,可以将此值手动设置为4。但是,NCCL_SOCKET_NTHREADSNCCL_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_0mlx5_1 卡的1号端口。

^=mlx5_1,mlx5_4 : 不使用 mlx5_1mlx5_4 卡。

注意:如果前面没有加 =,使用 mlx5_1 会选择 mlx5_1mlx5_10mlx5_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)或厂商文档。

可接受的取值

默认值为 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插件的使用。

可接受的值

默认值为0,定义并设置为1以使用CollNet插件。

NCCL_COLLNET_NODE_THRESHOLD

(自2.9.9版本起)

用于在节点数低于该阈值时禁用CollNet的阈值。

可接受的值

默认为2,定义并设置为整数。

NCCL_TOPO_FILE

(自2.6版本起)

在检测拓扑之前加载的XML文件的路径。默认情况下,如果存在,NCCL将加载/var/run/nvidia-topologyd/virtualTopology.xml

可接受的值

路径到一个可访问的文件,描述部分或全部拓扑。

NCCL_TOPO_DUMP_FILE

(自2.6版本起)

用于在检测后存储拓扑的XML文件的路径。

可接受的值

一个将被创建或覆盖的文件的路径。

NCCL_NVB_DISABLE

(自2.11版本起)

禁用通过NVLink和中间GPU进行节点内通信的机制。

可接受的值

默认值为0,设置为1以禁用该机制。

NCCL_PXN_DISABLE

(自2.12版本起)

禁用使用非本地NIC进行跨节点通信,使用NVLink和中间GPU。

可接受的值

默认值为0,设置为1以禁用该机制。

NCCL_P2P_PXN_LEVEL

(自2.12版本起)

控制在哪些情况下使用PXN进行发送/接收操作。

可接受的值

值为0表示从不使用PXN进行发送/接收。值为1表示在目标优选的NIC不直接可访问时使用PXN。值为2(默认值)表示即使NIC可以直接访问,也始终使用PXN,将数据存储在与节点中其他GPU相同的中间GPU上,以实现最大化的聚合。

NCCL_GRAPH_REGISTER

(自2.11版本起)

当NCCL调用被CUDA图捕获时,启用用户缓冲区注册。

仅在以下情况下有效:(i)正在使用CollNet算法;(ii)节点内的所有GPU之间具有P2P访问;(iii)每个进程最多有一个GPU。

用户缓冲区注册可能会减少用户缓冲区与NCCL内部缓冲区之间的数据拷贝次数。当CUDA图被销毁时,用户缓冲区将自动取消注册。

可接受的值

0或1。默认值为1(启用)。

NCCL_LOCAL_REGISTER

(自2.19版本起)

当用户显式调用ncclCommRegister时,启用用户本地缓冲区注册。

可接受的值

0或1。默认值为1(启用)。

NCCL_SET_STACK_SIZE

(自2.9版本起)

将CUDA内核堆栈大小设置为所有NCCL内核中的最大堆栈大小。

它可能避免在加载时进行CUDA内存重新配置。如果由于CUDA内存重新配置而遇到挂起问题,请将其设置为1。

接受的值

0或1。默认值为0。

NCCL_SET_THREAD_NAME

(自版本2.12起)

更改NCCL线程的名称以便于调试和分析。

接受的值

0或1。默认值为0。

NCCL_GRAPH_MIXING_SUPPORT

(自版本2.13起)

启用/禁用来自多个CUDA图形或CUDA图形和非捕获的NCCL调用的并发NCCL启动的支持。当禁用支持时,只有在通信器始终避免以下两种情况时才能保证正确性:

  1. 具有并行图形启动的未完成启动,其中并行意味着在不具有串行执行的依赖性的不同流上进行。
  2. 一个未完成的图形启动后是一个非捕获的启动。流的依赖关系是不相关的。

可以禁用支持的能力是因为当启用支持时,观察到在相同线程中有多个等级通过cudaGraphLaunch启动的工作时,CUDA启动会挂起。

接受的值

0或1。默认值为1。

NCCL_DMABUF_ENABLE

(从2.13版开始)

使用Linux dma-buf子系统启用GPU Direct RDMA缓冲区注册

Linux dma-buf子系统允许支持GPU Direct RDMA的NIC直接读取和写入CUDA缓冲区,而无需CPU参与。默认情况下启用此功能,但如果Linux内核或CUDA / NIC驱动程序不支持它,则会禁用此功能。

接受的值

0或1。默认值为1。

NCCL_P2P_NET_CHUNKSIZE

(自版本2.14起)

NCCL_P2P_NET_CHUNKSIZE控制通过网络发送的消息的大小,用于ncclSend / ncclRecv操作。

接受的值

默认值为131072(128 K)。

值为整数,以字节为单位。推荐使用2的幂次方,因此262144将是下一个值。

NCCL_P2P_LL_THRESHOLD

(自版本2.14起)

NCCL_P2P_LL_THRESHOLD是NCCL在P2P操作中使用LL的最大消息大小。

接受的值

十进制数。默认值为16384。

NCCL_ALLOC_P2P_NET_LL_BUFFERS

(自版本2.14起)

NCCL_ALLOC_P2P_NET_LL_BUFFERS指示通信器为所有P2P网络连接分配专用LL缓冲区。这使得所有等级都可以在低于NCCL_P2P_LL_THRESHOLD大小的时延限制发送和接收操作时使用LL。Intranode P2P传输总是分配了专用的LL缓冲区。如果在高等级数下运行全互通工作负载,这将导致较高的内存开销。

接受的值

0或1。默认值为0。

NCCL_COMM_BLOCKING

(自版本2.14起)

NCCL_COMM_BLOCKING变量控制是否允许NCCL调用阻塞。这包括对NCCL的所有调用,包括init / finalize函数以及由于发送/接收调用的连接的懒惰初始化而可能阻塞的通信函数。设置此环境变量将覆盖所有通信器中的blocking配置(参见ncclConfig)。如果未设置(未定义),通信器行为将由配置确定;如果不传递配置,则通信器会阻塞。

接受的值

0或1。 1表示阻塞的通信器,0表示非阻塞的通信器。默认值未定义。

NCCL_CGA_CLUSTER_SIZE

(自版本2.16起)

设置CUDA Cooperative Group Array(CGA)群集大小。在sm90及更高版本中,我们有额外的层次结构,可以在网格中将多个块组合在一起,称为线程块群集。将此设置为非零值将使NCCL以相应设置集群维度属性的方式启动通信内核。设置此环境变量将覆盖所有通信器中的cgaClusterSize配置(参见ncclconfig);如果未设置(未定义),CGA群集大小将由配置确定;如果不传递配置,则NCCL将自动选择最佳值。

接受的值

0到8。默认值未定义。

NCCL_MAX_CTAS

(自版本2.17起)

设置NCCL应使用的最大CTAs数量。设置此环境变量将覆盖所有通信器中的maxCTAs配置(参见ncclconfig);如果未设置(未定义),最大CTAs将由配置确定;如果没有通过配置,NCCL将自动选择最佳值。

可接受的值

设置为最大为32的正整数值。默认值为未定义。

NCCL_MIN_CTAS

(自2.17版本起)

设置NCCL应使用的最小CTAs数量。设置此环境变量将覆盖所有通信器中的minCTAs配置(参见ncclconfig);如果未设置(未定义),最小CTAs将由配置确定;如果没有通过配置,NCCL将自动选择最佳值。

可接受的值

设置为最大为32的正整数值。默认值为未定义。

NCCL_NVLS_ENABLE

(自2.17版本起)

启用NVLink SHARP(NVLS)的使用。NVLink SHARP在具有Hopper和更高版本GPU架构的第三代NVSwitch系统(NVLink4)中可用,允许将ncclAllReduce等集合操作卸载到NVSwitch域。

可接受的值

默认值为1,定义并设置为0以禁用NVLink SHARP的使用。不支持该功能的系统将自动禁用NVLS。