跳到主要内容

环境变量

MCCL 提供了一套广泛的环境变量,用于特定用途的调整。

环境变量也可以在 /etc/mccl.conf 中静态设置(由管理员设置系统范围的值)或在 ${MCCL_CONF_FILE} 中设置(从 2.23 版本开始;见下文)。例如,这些文件可能包含:

MCCL_DEBUG=WARN
MCCL_SOCKET_IFNAME==ens1f0

环境变量分为两类。有些变量需要使 MCCL 遵循系统特定的配置,并且可以保留在脚本和系统配置中。“调试”部分中列出的其他参数在生产环境中不应使用,也不应保留在脚本中,或者仅作为权宜之计,并在问题解决后立即移除。保持这些设置可能会导致次优行为、崩溃或挂起。

系统配置

MCCL_SOCKET_IFNAME

MCCL_SOCKET_IFNAME 变量指定用于通信的 IP 接口。

接受的值

定义为要由 MCCL 使用的接口的前缀列表。

可以提供多个前缀,用 , 符号分隔。

使用 ^ 符号,MCCL 将排除以该列表中任何前缀开头的接口。

要匹配(或不匹配)确切的接口名称,请以前缀字符串以 = 字符开头。

示例:

eth:使用所有以 eth 开头的接口,例如 eth0eth1...

=eth0:仅使用接口 eth0

=eth0,eth1:仅使用接口 eth0eth1

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

^=docker0:不使用接口 docker0

注意:默认情况下,回环接口(lo)和 docker 接口(docker*)除非没有其他接口可用,否则不会被选中。如果您更喜欢使用 lodocker* 而不是其他接口,则需要使用 MCCL_SOCKET_IFNAME 明确选择它们。默认算法还会优先选择以 ib 开头的接口。 设置 MCCL_SOCKET_IFNAME 将绕过自动接口选择算法,并可能使用所有符合手动选择的接口。

MCCL_SOCKET_FAMILY

MCCL_SOCKET_FAMILY 变量允许用户强制 MCCL 仅使用 IPv4 或 IPv6 接口。

接受的值

设置为 AF_INET 以强制使用 IPv4,或 AF_INET6 以强制使用 IPv6。

MCCL_SOCKET_RETRY_CNT

(从 2.24 版本开始)

MCCL_SOCKET_RETRY_CNT 变量指定在 ETIMEDOUTECONNREFUSEDEHOSTUNREACH 错误后,MCCL 重试建立套接字连接的次数。

接受的值

默认值为 34,任何正数值都是有效的。

MCCL_SOCKET_RETRY_SLEEP_MSEC

(从 2.24 版本开始)

MCCL_SOCKET_RETRY_SLEEP_MSEC 变量指定在第一次 ETIMEDOUTECONNREFUSEDEHOSTUNREACH 错误后,MCCL 在重试建立套接字连接前等待的毫秒数。对于后续错误,等待时间与错误计数成线性关系。因此,总时间将是 (N+1) * N/2 * MCCL_SOCKET_RETRY_SLEEP_MSEC,其中 N 由 MCCL_SOCKET_RETRY_CNT 给出。使用 MCCL_SOCKET_RETRY_CNTMCCL_SOCKET_RETRY_SLEEP_MSEC 的默认值,总重试时间将大约为 60 秒。

接受的值

默认值为 100 毫秒,任何正数值都是有效的。

MCCL_SOCKET_NTHREADS

(从 2.4.8 版本开始)

MCCL_SOCKET_NTHREADS 变量指定每个网络连接使用的 CPU 辅助线程数。增加此值可能会提高套接字传输性能,但代价是更高的 CPU 使用率。

接受的值

1 到 16。在 AWS 上,默认值为 2;在 Google Cloud 实例上,如果使用 gVNIC 网络接口,默认值为 4(从 2.5.6 版本开始);在其他情况下,默认值为 1。

对于通用的 100G 网络,此值可以手动设置为 4。然而,MCCL_SOCKET_NTHREADSMCCL_NSOCKS_PERTHREAD 的乘积不能超过 64。另见 MCCL_NSOCKS_PERTHREAD

MCCL_NSOCKS_PERTHREAD

(从 2.4.8 版本开始)

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

接受的值

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

对于通用的 100G 网络,此值可以手动设置为 4。然而,MCCL_SOCKET_NTHREADSMCCL_NSOCKS_PERTHREAD 的乘积不能超过 64。另见 MCCL_SOCKET_NTHREADS

MCCL_CROSS_NIC

MCCL_CROSS_NIC 变量控制 MCCL 是否允许环/树使用不同的 NIC,导致不同节点之间的通信在不同节点上使用不同的 NIC。

为了在使用多个 NIC 时最大化节点间通信性能,MCCL 尝试在节点间通信时使用相同的 NIC,以允许每个 NIC 连接到不同网络交换机(网络轨道)的网络设计,并避免任何流量干扰风险。因此,MCCL_CROSS_NIC 设置取决于网络拓扑,特别是网络结构是否经过轨道优化。

这对只有一个 NIC 的系统没有影响。

接受的值

0:始终使用相同的 NIC 进行相同的环/树,以避免交叉网络轨道。适用于每个 NIC 连接到不同交换机(轨道)的网络,且跨轨道连接速度较慢。请注意,如果通信器在每个节点上不包含相同的 GPU,则 MCCL 可能仍需要跨 NIC 通信。

1:允许为相同的环/树使用不同的 NIC。这适用于所有 NIC 都连接到同一交换机的网络,因此尝试通过相同的 NIC 通信无助于避免流量冲突。

2:(默认)尝试为相同的环/树使用相同的 NIC,但如果使用不同的 NIC 可以带来更好的性能,则仍允许使用不同的 NIC。

MCCL_IB_HCA

MCCL_IB_HCA 变量指定用于通信的主机通道适配器(RDMA)接口。

接受的值

定义为过滤要由 MCCL 使用的 IB Verbs 接口。列表以逗号分隔;可以使用 : 符号指定端口号。可选前缀 ^ 表示列表是排除列表。第二个可选前缀 = 表示令牌是确切名称,否则 MCCL 默认将每个令牌视为前缀。

示例:

mlx5:使用所有以 mlx5 开头的卡的所有端口

=mlx5_0:1,mlx5_1:1:使用卡 mlx5_0mlx5_1 的端口 1

^=mlx5_1,mlx5_4:不使用卡 mlx5_1mlx5_4

注意:使用 mlx5_1 而不带前导 = 将选择 mlx5_1 以及 mlx5_10mlx5_19(如果存在)。因此,始终建议添加 = 前缀以确保精确匹配。

注意:MCCL 支持的主机通道适配器(HCA)设备有固定的上限,为 32 个。

MCCL_IB_TIMEOUT

MCCL_IB_TIMEOUT 变量控制 InfiniBand Verbs 超时。

超时计算为 4.096 µs * 2 ^ timeout,正确的值取决于网络的大小。增加该值可以帮助非常大的网络,例如,如果 MCCL 在调用 ibv_poll_cq 时出现错误 12。

有关更多信息,请参见 InfiniBand 规范第一卷 12.7.34 节(本地确认超时)。

接受的值

MCCL 使用的默认值为 20(从 2.23 版本开始;从 2.14 版本开始为 18,之前为 14)。

值可以是 1-31。

注意:将值设置为 0 或 >= 32 将导致无限超时值。

MCCL_IB_RETRY_CNT

(从 2.1.15 版本开始)

MCCL_IB_RETRY_CNT 变量控制 InfiniBand 重试计数。

有关更多信息,请参见 InfiniBand 规范第一卷 12.7.38 节。

接受的值

默认值为 7。

MCCL_IB_GID_INDEX

(从 2.1.4 版本开始)

MCCL_IB_GID_INDEX 变量定义在 RoCE 模式中使用的全局 ID 索引。请参见 InfiniBand show_gids 命令以设置此值。

有关更多信息,请参见 InfiniBand 规范第一卷或供应商文档。

接受的值

默认值为 -1。

MCCL_IB_ADDR_FAMILY

(从 2.21 版本开始)

MCCL_IB_ADDR_FAMILY 变量定义与 MCCL 动态选择的 infiniband GID 相关的 IP 地址族。

接受的值

默认值为 "AF_INET"。

MCCL_IB_ADDR_RANGE

(从 2.21 版本开始)

MCCL_IB_ADDR_RANGE 变量定义 MCCL 在 MCCL_IB_GID_INDEX 未设置时动态选择的有效 GID 范围。

接受的值

默认情况下,如果未设置,则忽略。

可以使用无类域间路由(CIDR)格式为 IPv4 和 IPv6 族定义 GID 范围。

MCCL_IB_ROCE_VERSION_NUM

(从 2.21 版本开始)

MCCL_IB_ROCE_VERSION_NUM 变量定义与 MCCL 动态选择的 infiniband GID 相关的 RoCE 版本。

接受的值

默认值为 2。

MCCL_IB_SL

(从 2.1.4 版本开始)

定义 InfiniBand 服务级别。

有关更多信息,请参见 InfiniBand 规范第一卷或供应商文档。

接受的值

默认值为 0。

MCCL_IB_TC

(从 2.1.15 版本开始)

定义 InfiniBand 流量类别字段。

有关更多信息,请参见 InfiniBand 规范第一卷或供应商文档。

接受的值

默认值为 0。

MCCL_IB_FIFO_TC

(从 2.22.3 版本开始)

定义 InfiniBand 控制消息的流量类别。控制消息是短 RDMA 写操作,用于控制信用返回,与其他传输大数据段的 RDMA 操作相反。此设置允许这些消息使用高优先级、低延迟的流量类别,避免被其他流量延迟。

接受的值

默认值由 MCCL_IB_TC 设置的流量类别,如果未设置,则默认为 0。

MCCL_IB_RETURN_ASYNC_EVENTS

(从 2.23 版本开始)

IB 事件作为警告报告给用户。如果启用,MCCL 还将在致命的 IB 异步事件上停止 IB 通信。

接受的值

默认值为 1,设置为 0 以禁用

MCCL_OOB_NET_ENABLE

(从 2.23 版本开始)变量 MCCL_OOB_NET_ENABLE 启用 MCCL 网络用于带外通信。启用 MCCL 网络的使用将改变在通信器初始化期间执行的 allgather 的实现。

接受的值

将变量设置为 0 以禁用,设置为 1 以启用。

MCCL_OOB_NET_IFNAME

(从 2.23 版本开始)如果启用了 MCCL 网络用于带外通信(见 MCCL_OOB_NET_ENABLE),MCCL_OOB_NET_IFNAME 变量指定要使用的网络接口。

接受的值

定义要由 MCCL 用于带外通信的接口。接受的接口列表取决于 MCCL 使用的网络。列表以逗号分隔;可以使用 : 符号指定端口号。可选前缀 ^ 表示列表是排除列表。第二个可选前缀 = 表示令牌是确切名称,否则 MCCL 默认将每个令牌视为前缀。如果指定了多个设备,MCCL 将选择列表中第一个匹配的设备。

示例:

MCCL_NET="IB" MCCL_OOB_NET_ENABLE=1 MCCL_OOB_NET_IFNAME="=mlx5_1" 将使用 Infiniband 网络,并使用接口 mlx5_1

MCCL_NET="IB" MCCL_OOB_NET_ENABLE=1 MCCL_OOB_NET_IFNAME="mlx5_1" 将使用 Infiniband 网络,并使用在 mlx5_1mlx5_10mlx5_11 等列表中找到的第一个接口。

MCCL_NET="Socket" MCCL_OOB_NET_ENABLE=1 MCCL_OOB_NET_IFNAME="ens1" 将使用套接字网络,并使用在 ens1f0ens1f1 等列表中找到的第一个接口。

MCCL_UID_STAGGER_THRESHOLD

(从 2.23 版本开始)MCCL_UID_STAGGER_THRESHOLD 变量用于触发 MCCL 等级和 mcclUniqueId 之间的通信交错,以避免溢出 mcclUniqueId。如果 MCCL 等级通信的数量超过指定的阈值,则使用等级值(见下面的 MCCL_UID_STAGGER_RATE)交错通信。如果每个 mcclUniqueId 的 MCCL 等级数量小于或等于阈值,则不执行交错。

例如,如果我们有 128 个 MCCL 等级,1 个 mcclUniqueId 和 64 的阈值,则执行交错。然而,如果使用 128 个 MCCL 等级和 64 的阈值使用 2 个 mcclUniqueId,则不执行交错。

接受的值

MCCL_UID_STAGGER_THRESHOLD 的值必须是一个严格正整数。如果未指定,默认值为 256。

MCCL_UID_STAGGER_RATE

(从 2.23 版本开始)

MCCL_UID_STAGGER_RATE 变量用于定义在 MCCL 等级和 mcclUniqueId 之间的通信交错时目标消息速率。如果使用交错(见上面的 MCCL_UID_STAGGER_THRESHOLD),消息速率用于计算给定 MCCL 等级必须等待的时间。

接受的值

MCCL_UID_STAGGER_RATE 的值必须是一个严格正整数,以消息/秒为单位。如果未指定,默认值为 7000。

MCCL_NET

(从 2.10 版本开始)

强制 MCCL 使用特定网络,例如确保 MCCL 使用外部插件,并且不会自动回退到内部 IB 或套接字实现。设置此环境变量将覆盖所有通信器中的 netName 配置(见 mcclConfig_t);如果没有设置(未定义),网络模块将由配置确定;如果没有传递配置,MCCL 将自动选择最佳网络模块。

接受的值

MCCL_NET 的值必须与使用的 MCCL 网络的名称完全匹配(不区分大小写)。内部网络名称为 "IB"(通用 IB 动词)和 "Socket"(TCP/IP 套接字)。外部网络插件定义自己的名称。默认值未定义。

MCCL_NET_PLUGIN

(从 2.11 版本开始)

将其设置为后缀字符串或库名称,以在多个 MCCL 网络插件中进行选择。此设置将导致 MCCL 使用以下策略查找网络插件库:

  • 如果设置了 MCCL_NET_PLUGIN,则尝试加载由 MCCL_NET_PLUGIN 指定名称的库;
  • 如果设置了 MCCL_NET_PLUGIN 并且之前的失败,则尝试加载 libmccl-net-<MCCL_NET_PLUGIN>.so;
  • 如果未设置 MCCL_NET_PLUGIN,则尝试加载 libmccl-net.so;
  • 如果没有找到插件(无论是用户定义的还是默认的),则使用内部网络插件。

例如,设置 MCCL_NET_PLUGIN=foo 将导致 MCCL 尝试加载 foo,如果 foo 找不到,则加载 libmccl-net-foo.so(前提是系统上存在)。

接受的值

插件后缀、插件文件名或 "none"。

MCCL_TUNER_PLUGIN

将其设置为后缀字符串或库名称,以在多个 MCCL 调优插件中进行选择。此设置将导致 MCCL 使用以下策略查找调优插件库:

  • 如果设置了 MCCL_TUNER_PLUGIN,则尝试加载由 MCCL_TUNER_PLUGIN 指定名称的库;
  • 如果设置了 MCCL_TUNER_PLUGIN 并且之前的失败,则尝试加载 libmccl-net-<MCCL_TUNER_PLUGIN>.so;
  • 如果未设置 MCCL_TUNER_PLUGIN,则尝试加载 libmccl-tuner.so;
  • 如果没有通过 MCCL_TUNER_PLUGIN 或 MCCL_NET_PLUGIN 找到插件,则在网络插件中查找调优符号(参见 MCCL_NET_PLUGIN);
  • 如果没有通过 MCCL_TUNER_PLUGIN 或 MCCL_NET_PLUGIN 找到插件,则使用内部调优插件。

例如,设置 MCCL_TUNER_PLUGIN=foo 将导致 MCCL 尝试加载 foo,如果 foo 找不到,则加载 libmccl-tuner-foo.so(前提是系统上存在)。

接受的值

插件后缀、插件文件名或 "none"。

MCCL_PROFILER_PLUGIN

将其设置为后缀字符串或库名称,以在多个 MCCL 分析器插件中进行选择。此设置将导致 MCCL 使用以下策略查找分析器插件库:

  • 如果设置了 MCCL_PROFILER_PLUGIN,则尝试加载由 MCCL_PROFILER_PLUGIN 指定名称的库;
  • 如果设置了 MCCL_PROFILER_PLUGIN 并且之前的失败,则尝试加载 libmccl-profiler-<MCCL_PROFILER_PLUGIN>.so;
  • 如果未设置 MCCL_PROFILER_PLUGIN,则尝试加载 libmccl-profiler.so;
  • 如果没有找到插件(无论是用户定义的还是默认的),则不启用分析。
  • 如果将 MCCL_PROFILER_PLUGIN 设置为 STATIC_PLUGIN,则在程序二进制文件中搜索插件符号。

例如,设置 MCCL_PROFILER_PLUGIN=foo 将导致 MCCL 尝试加载 foo,如果 foo 找不到,则加载 libmccl-profiler-foo.so(前提是系统上存在)。

接受的值

插件后缀、插件文件名或 "none"。

MCCL_IGNORE_CPU_AFFINITY

(从 2.4.6 版本开始)

MCCL_IGNORE_CPU_AFFINITY 变量可用于使 MCCL 忽略作业提供的 CPU 亲和性,而只使用 GPU 亲和性。

接受的值

默认为 0,设置为 1 以使 MCCL 忽略作业提供的 CPU 亲和性。

MCCL_CONF_FILE

(从 2.23 版本开始)

MCCL_CONF_FILE 变量允许用户指定一个包含静态配置的文件。这不接受路径中的 ~ 字符;请先转换为相对路径或绝对路径。

接受的值

如果未设置或版本早于 2.23,MCCL 将使用 home 目录中的 .mccl.conf(如果可用)。

MCCL_DEBUG

MCCL_DEBUG 变量控制从 MCCL 显示的调试信息。这个变量通常用于调试。

接受的值

VERSION - 在程序开始时打印 MCCL 版本。

WARN - 每当任何 MCCL 调用出错时,打印明确的 error 消息。

INFO - 打印调试信息

TRACE - 打印可重放的跟踪信息,每次调用都会打印。

MCCL_DEBUG_FILE

(从 2.2.12 版本开始)

MCCL_DEBUG_FILE 变量将 MCCL 调试日志输出定向到文件。文件名格式可以设置为 filename.%h.%p,其中 %h 被替换为主机名,%p 被替换为进程 PID。这不接受路径中的 ~ 字符;请先转换为相对路径或绝对路径。

接受的值

默认输出文件是 stdout,除非设置了此环境变量。

设置 MCCL_DEBUG_FILE 将导致 MCCL 创建并覆盖任何同名的先前文件。

注意:如果文件名在所有作业进程中不唯一,则输出可能会丢失或损坏。

MCCL_DEBUG_SUBSYS

(从 2.3.4 版本开始)

MCCL_DEBUG_SUBSYS 变量允许用户根据子系统过滤 MCCL_DEBUG=INFO 输出。值应为要包含在 MCCL 调试日志跟踪中的子系统的逗号分隔列表。

在子系统名称前加上 ^ 将禁用该子系统的日志记录。

接受的值

默认值为 INIT,BOOTSTRAP,ENV。

支持的子系统名称有 INIT(代表初始化)、COLL(代表集体操作)、P2P(代表点对点)、SHM(代表共享内存)、NET(代表网络)、GRAPH(代表拓扑检测和图搜索)、TUNING(代表算法/协议调整)、ENV(代表环境设置)、ALLOC(代表内存分配)、CALL(代表函数调用)、PROXY(代表代理线程操作)、NVLS(代表 NVLink SHARP)、BOOTSTRAP(代表早期初始化)、REG(代表内存注册)、PROFILE(代表初始化的粗粒度分析)、RAS(代表可靠性、可用性和服务性子系统)和 ALL(包括每个子系统)。

MCCL_DEBUG_TIMESTAMP_FORMAT

(从 2.26 版本开始)

MCCL_DEBUG_TIMESTAMP_FORMAT 变量允许用户更改打印调试日志消息时使用的格式。

时间以本地时间打印。这可以通过设置 TZ 环境变量来更改。通过设置 TZ=UTC 可获得 UTC 时间。TZ 的有效值如下: US/PacificAmerica/Los_Angeles 等。

请注意,非调用 TRACE 级别的日志继续打印自 MCCL 调试子系统初始化以来的微秒数。如果这样配置,TRACE 日志也可以在开头打印 strftime 格式化的时间戳(见 MCCL_DEBUG_TIMESTAMP_LEVELS)。

接受的值

环境变量的值传递给 strftime,因此任何有效格式都可以在这里使用。默认为 [%F %T],即 [YYYY-MM-DD HH:MM:SS]。如果值已设置但为空(MCCL_DEBUG_TIMESTAMP_FORMAT=),则不打印时间戳。

除了 strftime 支持的转换规范外,还可以指定 %Xf,其中 X 是 1-9 的单个数字。这将打印秒的小数部分。X 的值表示将打印多少位数字。例如,%3f 将打印毫秒。该值用零填充。(请注意,这只能在格式字符串中使用一次。)

MCCL_DEBUG_TIMESTAMP_LEVELS

(从 2.26 版本开始)

MCCL_DEBUG_TIMESTAMP_LEVELS 变量允许用户设置哪些日志行根据日志级别获得时间戳。

接受的值

值应为应该添加时间戳的级别的逗号分隔列表。有效级别有:VERSIONWARNINFOABORTTRACE。此外,可以使用 ALL 为所有级别启用它。将其设置为空值将为所有级别禁用它。如果值以插入符号(^)为前缀,则列出的级别将不记录时间戳,其余级别将记录。默认情况下,为 WARN 启用时间戳,但为其余级别禁用。

例如,MCCL_DEBUG_TIMESTAMP_LEVELS=WARN,INFO,TRACE 将为警告、信息日志和跟踪启用它。或者,MCCL_DEBUG_TIMESTAMP_LEVELS=^TRACE 将为除跟踪之外的所有内容启用它,而跟踪(除了调用跟踪)有自己的时间戳类型(自 mccl 调试初始化以来的微秒数)。

MCCL_COLLNET_ENABLE

(从 2.6 版本开始)

启用 CollNet 插件的使用。

接受的值

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

MCCL_COLLNET_NODE_THRESHOLD

(从 2.9.9 版本开始)

节点数量的阈值,低于此阈值时不会启用 CollNet。

接受的值

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

MCCL_TOPO_FILE

(从 2.6 版本开始)

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

接受的值

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

MCCL_TOPO_DUMP_FILE

(从 2.6 版本开始)

在检测后转储 XML 拓扑的文件路径。

接受的值

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

MCCL_SET_THREAD_NAME

(从 2.12 版本开始)

为 MCCL CPU 线程赋予更有意义的名称,以便于调试和分析。

接受的值

0 或 1。默认为 0(禁用)。

调试

这些环境变量应谨慎使用。MCCL 的新版本可能有不同的工作方式,强制它们为特定值将阻止 MCCL 自动选择最佳设置。因此,它们可能导致长期的性能问题,甚至破坏某些功能。

它们适用于实验或调试问题,但通常不应为生产代码设置。

MCCL_P2P_DISABLE

MCCL_P2P_DISABLE 变量禁用点对点(P2P)传输,该传输使用 NVLink 或 PCI 之间的 GPU 直接访问 MUSA。

接受的值

定义并设置为 1 以禁用直接 GPU 到 GPU(P2P)通信。

MCCL_P2P_LEVEL

(从 2.3.4 版本开始)

MCCL_P2P_LEVEL 变量允许用户精确控制何时使用 GPU 之间的点对点(P2P)传输。级别定义了 MCCL 将使用 P2P 传输的 GPU 之间的最大距离。应使用表示路径类型的短字符串来指定使用 P2P 传输的拓扑截止。

如果未指定,MCCL 将根据其运行的架构和环境尝试选择一个最优值。

接受的值

  • 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)。

整数值(遗留)

还有将 MCCL_P2P_LEVEL 声明为对应路径类型的整数的选项。这些数值值是为了向后兼容而保留的,适用于在允许字符串之前使用数值值的人。

由于路径类型的破坏性更改 - 文字值可能会随时间变化。为了避免调试配置时的头痛,请使用字符串标识符。

  • LOC:0
  • PIX:1
  • PXB:2
  • PHB:3
  • SYS:4

大于 4 的值将被解释为 SYS。使用遗留整数值不支持 NVL。

MCCL_P2P_DIRECT_DISABLE

MCCL_P2P_DIRECT_DISABLE 变量禁止 MCCL 通过 P2P 在同一进程的 GPU 之间直接访问用户缓冲区。当用户缓冲区使用不自动使它们对同一进程管理的其他 GPU 可访问的 API 分配时,这很有用,并且具有 P2P 访问权限。

接受的值

定义并设置为 1 以禁用跨 GPU 的直接用户缓冲区访问。

MCCL_SHM_DISABLE

MCCL_SHM_DISABLE 变量禁用共享内存(SHM)传输。当点对点无法发生时,SHM 在设备之间使用,因此,主机内存被使用。当禁用 SHM 时,MCCL 将使用网络(即 InfiniBand 或 IP 套接字)在 CPU 套接字之间通信。

接受的值

定义并设置为 1 以禁用通过共享内存(SHM)通信。

MCCL_BUFFSIZE

MCCL_BUFFSIZE 变量控制 MCCL 在 GPU 对之间通信数据时使用的缓冲区大小。

如果在使用 MCCL 时遇到内存限制问题,或者您认为不同的缓冲区大小可以提高性能,请使用此变量。

接受的值

默认为 4194304(4 MiB)。

值是整数,以字节为单位。建议使用 2 的幂。例如,1024 将给出 1KiB 缓冲区。

MCCL_NTHREADS

MCCL_NTHREADS 变量设置每个 MUSA 块的 MUSA 线程数。MCCL 将为每个通信通道启动一个 MUSA 块。

如果您认为您的 GPU 时钟速度低,并且想要增加线程数,请使用此变量。

您还可以使用此变量减少线程数以降低 GPU 工作负载。

接受的值

对于最近一代 GPU,默认值为 512,对于某些旧一代,默认值为 256。

允许的值是 64、128、256 和 512。

MCCL_MAX_NCHANNELS

(从 2.0.5 版本开始为 MCCL_MAX_NRINGS,从 2.5.0 版本开始为 MCCL_MAX_NCHANNELS)

MCCL_MAX_NCHANNELS 变量限制 MCCL 可以使用的通道数量。减少通道数量也会减少用于通信的 MUSA 块数量,从而减少对 GPU 计算资源的影响。

直到 2.4 的旧 MCCL_MAX_NRINGS 变量在新版本中仍然有效作为别名,但如果设置了 MCCL_MAX_NCHANNELS,则会被忽略。

此环境变量已被 MCCL_MAX_CTAS 取代,也可以使用 mcclCommInitRankConfig 以编程方式设置。

接受的值

任何大于或等于 1 的值。

MCCL_MIN_NCHANNELS

(从 2.2.0 版本开始为 MCCL_MIN_NRINGS,从 2.5.0 版本开始为 MCCL_MIN_NCHANNELS)

MCCL_MIN_NCHANNELS 变量控制您希望 MCCL 使用的最小通道数量。增加通道数量也会增加 MCCL 使用的 MUSA 块数量,这可能有助于提高性能;然而,它使用了更多的 MUSA 计算资源。

当在 MCCL 通常只创建一个通道的平台上使用聚合集体操作时,这特别有用。

直到 2.4 的旧 MCCL_MIN_NRINGS 变量在新版本中仍然有效作为别名,但如果设置了 MCCL_MIN_NCHANNELS,则会被忽略。

此环境变量已被 MCCL_MIN_CTAS 取代,也可以使用 mcclCommInitRankConfig 以编程方式设置。

接受的值

默认值取决于平台。设置为整数值,高达 12(高达 2.2)、16(2.3 和 2.4)或 32(2.5 及以后)。

MCCL_CHECKS_DISABLE

(从 2.0.5 版本开始,已在 2.2.12 版本中弃用)

MCCL_CHECKS_DISABLE 变量可用于禁用每个集体调用上的参数检查。检查在开发过程中很有用,但可能会增加延迟。它们可以被禁用以提高生产环境中的性能。

接受的值

默认为 0,设置为 1 以禁用检查。

MCCL_CHECK_POINTERS

(从 2.2.12 版本开始)

MCCL_CHECK_POINTERS 变量启用每个集体调用上的 MUSA 内存指针检查。检查在开发过程中很有用,但可能会增加延迟。

接受的值

默认为 0,设置为 1 以启用检查。

设置为 1 将恢复 MCCL 在 2.2.12 版本之前的原始行为。

MCCL_LAUNCH_MODE

(从 2.1.0 版本开始)

MCCL_LAUNCH_MODE 变量控制 MCCL 如何启动 MUSA 内核。

接受的值

默认值为 PARALLEL。

设置为 GROUP 将使用合作组(MUSA 9.0 及以后版本)处理管理多个 GPU 的进程。这在 2.9 中已被弃用,并可能在以后的版本中被移除。

MCCL_IB_DISABLE

MCCL_IB_DISABLE 变量阻止 MCCL 使用 IB/RoCE 传输。相反,MCCL 将回退到使用 IP 套接字。

接受的值

定义并设置为 1 以禁用使用 InfiniBand Verbs 进行通信(并强制使用另一种方法,例如 IP 套接字)。

MCCL_IB_AR_THRESHOLD

(从 2.6 版本开始)

阈值,超过此阈值时我们将以单独的消息发送 InfiniBand 数据,这可以利用自适应路由。

接受的值

字节大小,默认值为 8192。

将其设置为高于 MCCL_BUFFSIZE 将完全禁用使用自适应路由。

MCCL_IB_QPS_PER_CONNECTION

(从 2.10 版本开始)

两个等级之间每个连接使用的 IB 队列对数。这在需要多个队列对以获得良好的路由熵的多级织物上很有用。参见 MCCL_IB_SPLIT_DATA_ON_QPS 了解在多个 QP 上拆分数据的不同方式,因为它可能影响性能。

接受的值

1 到 128 之间的数字,默认为 1。

MCCL_IB_SPLIT_DATA_ON_QPS

(从 2.18 版本开始)

此参数控制当我们创建多个队列对时如何使用它们。设置为 1(拆分模式),每个消息将均匀拆分在每个队列对上。如果使用许多 QP,这可能会导致明显的延迟降低。设置为 0(轮询模式),队列对将用于我们发送的每个消息的轮询模式。不发送多个消息的操作将不使用所有 QP。

接受的值

0 或 1。默认为 0(从 MCCL 2.20 开始)。将其设置为 1 将启用拆分模式(在 2.18 和 2.19 中为默认)。

MCCL_IB_MUSA_SUPPORT

(在 2.4.0 中已移除,参见 MCCL_NET_GDR_LEVEL)

MCCL_IB_MUSA_SUPPORT 变量用于强制或禁用 GPU Direct RDMA 的使用。默认情况下,如果拓扑允许,MCCL 会启用 GPU Direct RDMA。此变量可以禁用此行为或在所有情况下强制使用 GPU Direct RDMA。

接受的值

定义并设置为 0 以禁用 GPU Direct RDMA。

定义并设置为 1 以强制使用 GPU Direct RDMA。

MCCL_IB_PCI_RELAXED_ORDERING

(从 2.12 版本开始)

启用 IB Verbs 传输的 Relaxed Ordering。在虚拟化环境中,Relaxed Ordering 可以大大提高 InfiniBand 网络的性能。

接受的值

设置为 2 以在可用时自动使用 Relaxed Ordering。设置为 1 以强制使用 Relaxed Ordering,如果不可用则失败。设置为 0 以禁用 Relaxed Ordering 的使用。默认为 2。

MCCL_IB_ADAPTIVE_ROUTING

(从 2.16 版本开始)

启用 IB Verbs 传输的自适应路由能力数据传输。自适应路由可以改善大规模通信的性能。必须相应选择系统定义的启用自适应路由的 SL(参见 MCCL_IB_SL)。

接受的值

默认在 IB 网络上启用(1),在 RoCE 网络上禁用(0)。设置为 1 以强制使用自适应路由能力数据传输。

MCCL_IB_ECE_ENABLE

(从 2.23 版本开始)

在 IB/RoCE Verbs 网络上启用增强型连接建立(ECE)。ECE 可用于启用高级网络功能,如拥塞控制、自适应路由和选择性重传。注意:这些参数不是由 MCCL 解释或控制的,而是直接通过 ECE 机制传递给 HCAs。

接受的值

默认为启用(1)(从 2.19 开始)。设置为 0 以禁用 ECE 网络功能。

注意:在系统上错误配置 ECE 参数可能会对 MCCL 性能产生不利影响。管理员应确保如果系统级别启用了 ECE,则正确配置 ECE。

MCCL_MEM_SYNC_DOMAIN

(从 2.16 版本开始)

为 MCCL 内核(MUSA 12.0 & sm90 及以后版本)设置默认的内存同步域。内存同步域可以帮助消除 MCCL 内核和应用程序计算内核之间的干扰,当它们使用不同的域时。

接受的值

默认值为 musaLaunchMemSyncDomainRemote(1)。当前支持的值为 0 和 1。

MCCL_CUMEM_ENABLE

(从 2.18 版本开始)

在 MCCL 中使用 MUSA cuMem* 函数分配内存。

接受的值

0 或 1。默认在 2.18 中为 0(禁用);从 2.19 开始,如果系统支持,则默认自动启用此功能(MCCL_CUMEM_ENABLE 仍可用于覆盖自动检测)。

MCCL_CUMEM_HOST_ENABLE

(从 2.23 版本开始)

在 MCCL 中使用 MUSA cuMem* 函数分配主机内存。

接受的值

0 或 1。默认在 2.23 中为 0;从 2.24 开始,默认为 1,如果 MUSA 驱动程序 >= 12.6 且 MUSA 运行时 >= 12.2

MCCL_NET_GDR_LEVEL(原名 MCCL_IB_GDR_LEVEL)

(从 2.3.4 版本开始。在 2.4.0 中,MCCL_IB_GDR_LEVEL 被重命名为 MCCL_NET_GDR_LEVEL)

MCCL_NET_GDR_LEVEL 变量允许用户精确控制何时使用 NIC 和 GPU 之间的 GPU Direct RDMA。级别定义了 NIC 和 GPU 之间的最大距离。应使用表示路径类型的字符串来指定 GpuDirect 的拓扑截止。

如果未指定,MCCL 将根据其运行的架构和环境尝试选择一个最优值。

接受的值

  • 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(始终启用)。

整数值(遗留)

还有将 MCCL_NET_GDR_LEVEL 声明为对应路径类型的整数的选项。这些数值值是为了向后兼容而保留的,适用于在允许字符串之前使用数值值的人。

由于路径类型的破坏性更改 - 文字值可能会随时间变化。为了避免调试配置时的头痛,请使用字符串标识符。

  • LOC:0
  • PIX:1
  • PXB:2
  • PHB:3
  • SYS:4

大于 4 的值将被解释为 SYS。

MCCL_NET_GDR_C2C

(从 2.26 版本开始)

MCCL_NET_GDR_C2C 变量启用通过连接到 CPU 的 NIC 发送数据时的 GPU Direct RDMA(即距离 PHB),其中 CPU 通过 C2C 互连器连接到 GPU。这有效地覆盖了 MCCL_NET_GDR_LEVEL 设置针对此特定 NIC。

接受的值

0 或 1。定义并设置为 1 以使用 GPU Direct RDMA 直接通过 C2C 连接的 CPU 发送数据到 NIC。

默认值为 0。

MCCL_NET_GDR_READ

MCCL_NET_GDR_READ 变量启用在 GPU-NIC 距离在 MCCL_NET_GDR_LEVEL 指定的距离内时发送数据的 GPU Direct RDMA。在 2.4.2 之前,默认禁用 GDR 读取,即在发送数据时,数据首先存储在 CPU 内存中,然后转到 InfiniBand 卡。从 2.4.2 开始,默认情况下,对于基于 NVLink 的平台启用 GDR 读取。

注意:从 GPU 内存直接读取数据在发送数据时已知比从 CPU 内存读取慢一些,在某些平台上,例如 PCI-E。

接受的值

0 或 1。定义并设置为 1 以使用 GPU Direct RDMA 直接发送数据到 NIC(绕过 CPU)。

在 2.4.2 之前,默认值对于所有平台都是 0。从 2.4.2 开始,默认值对于基于 NVLink 的平台是 1,否则为 0。

MCCL_NET_SHARED_BUFFERS

(从 2.8 版本开始)

允许在节点间点对点通信中使用共享缓冲区。这将使用一个大型池供所有远程对等方使用,具有恒定的内存使用量,而不是随着远程对等方数量的增加而线性增加。

接受的值

默认为 1(启用)。设置为 0 以禁用。

MCCL_NET_SHARED_COMMS

(从 2.12 版本开始)

在 PXN 的上下文中重用相同的连接。这允许消息聚合,但也可以减少网络数据包的熵。

接受的值

默认为 1(启用)。设置为 0 以禁用。

MCCL_SINGLE_RING_THRESHOLD

(从 2.1 版本开始,已在 2.3 版本中移除)

MCCL_SINGLE_RING_THRESHOLD 变量设置了 MCCL 将只使用一个环的阈值限制。这将限制带宽,但提高延迟。

接受的值

默认值为 262144(256kB)在计算能力为 7 及更高的 GPU 上。否则,默认值为 131072(128kB)。

值是整数,以字节为单位。

MCCL_LL_THRESHOLD

(从 2.1 版本开始,已在 2.5 版本中移除)

MCCL_LL_THRESHOLD 变量设置了 MCCL 使用低延迟算法的大小限制。

接受的值

默认为 16384(高达 2.2)或取决于等级数量(2.3 及以后)。

值是整数,以字节为单位。

MCCL_TREE_THRESHOLD

(从 2.4 版本开始,已在 2.5 版本中移除)

MCCL_TREE_THRESHOLD 变量设置了 MCCL 使用树算法而不是环的大小限制。

接受的值

默认取决于等级数量。

值是整数,以字节为单位。

MCCL_ALGO

(从 2.5 版本开始)

MCCL_ALGO 变量定义 MCCL 将使用的算法。

接受的值

(从 2.5 版本开始)

算法的逗号分隔列表(不区分大小写):

版本算法
2.5+Ring
2.5+Tree
2.5 至 2.13Collnet
2.14+CollnetChain
2.14+CollnetDirect
2.17+NVLS
2.18+NVLSTree
2.23+PAT

NVLS 和 NVLSTree 启用 NVLink SHARP 卸载。

要指定要排除(而不是包括)的算法,以 ^ 开始列表。

(从 2.24 版本开始)

接受的值已扩展以允许更多的灵活性,并在找到意外的令牌时发出警告并失败。此外,如果没有指定 ring 作为有效算法,它将不会隐式回退到 ring,即使没有其他有效算法用于该函数。相反,它将失败。

格式现在是函数名称和算法列表对的分号分隔列表,其中函数名称对于第一个条目是可选的。如果不存在,则适用于以后未列出的所有函数。冒号分隔函数(当存在时)和逗号分隔的算法列表。此外,如果逗号分隔的算法列表的第一个字符是插入符号(^),则所有选择都将被反转。

例如, MCCL_ALGO="ring,collnetdirect;allreduce:tree,collnetdirect;broadcast:ring" 将为所有函数启用 ring 和 collnetdirect,然后为 allreduce 启用 tree 和 collnetdirect,为 broadcast 启用 ring。

而,MCCL_ALGO=allreduce:^tree 将允许所有函数的默认值(所有可用算法)除了 allreduce,它将除了 tree 之外的所有算法都可用。

默认值未设置,这导致 MCCL 根据节点拓扑和架构自动选择可用的算法。

MCCL_PROTO

(从 2.5 版本开始)

MCCL_PROTO 变量定义 MCCL 被允许使用的协议。

不鼓励用户设置此变量,除非在怀疑 MCCL 中存在错误时禁用特定协议。特别是,在不支持它的平台上启用 LL128 可能会导致数据损坏。

接受的值

(从 2.5 版本开始)协议的逗号分隔列表(不区分大小写) 包括:LLLL128Simple。要指定要排除(而不是包括)的协议,以 ^ 开始列表。

默认行为启用所有支持的算法:等同于在支持 LL128 的平台上使用 LL,LL128,Simple,在其他平台上使用 LL,Simple

(从 2.24 版本开始)接受的值已扩展以允许更多的灵活性,就像上面为 MCCL_ALGO 描述的那样,允许用户为每个函数指定协议。

MCCL_NVB_DISABLE

(从 2.11 版本开始)

禁用通过中间 GPU 通过 NVLink 的节点内通信。

接受的值

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

MCCL_PXN_DISABLE

(从 2.12 版本开始)

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

接受的值

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

MCCL_P2P_PXN_LEVEL

(从 2.12 版本开始)

控制在哪些情况下 PXN 被用于发送/接收操作。

接受的值

值 0 将禁用 PXN 用于发送/接收。值 1 将启用 PXN,当目标的首选 NIC 无法通过 PCI 开关访问时。值 2(默认)将导致 PXN 始终被使用,即使 NIC 通过 PCI 开关连接,也将节点内所有 GPU 的数据存储在中间 GPU 上,以最大化聚合。

MCCL_RUNTIME_CONNECT

(从 2.22 版本开始)

在运行时(例如,调用 mcclAllreduce())而不是初始化阶段动态连接对等方。

接受的值

默认为 1,设置为 0 以在初始化阶段连接对等方。

MCCL_GRAPH_REGISTER

(从 2.11 版本开始)

在 MCCL 调用被 MUSA 图捕获时启用用户缓冲区注册。

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

用户缓冲区注册可能会减少用户缓冲区和 MCCL 内部缓冲区之间的数据副本数量。当 MUSA 图被销毁时,用户缓冲区将自动取消注册。

接受的值

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

MCCL_LOCAL_REGISTER

(从 2.19 版本开始)

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

接受的值

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

MCCL_LEGACY_MUSA_REGISTER

(从 2.24 版本开始)

通过 musaMalloc(和相关内存分配器)分配的 musa 缓冲区是遗留缓冲区。注册遗留缓冲区可能会导致隐式同步,这对于 MCCL 是不安全的,可能会导致挂起。MCCL 默认禁用遗留缓冲区注册,用户应转而使用基于 cuMem 的内存分配器进行缓冲区注册。

接受的值

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

MCCL_SET_STACK_SIZE

(从 2.9 版本开始)

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

这可能会避免在加载时 MUSA 内存重新配置。如果您因 MUSA 内存重新配置而遇到挂起,请将其设置为 1。

接受的值

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

MCCL_GRAPH_MIXING_SUPPORT

(从 2.13 版本开始)

启用/禁用对来自并行 MUSA 图或 MUSA 图和非捕获 MCCL 调用的多个未完成 MCCL 调用的支持。从它们的主机端启动(例如,对于非捕获调用,调用 mcclAllreduce() 或对于捕获调用,musaGraphLaunch())开始,到设备内核执行完成结束,MCCL 调用被认为是未完成的。在禁用图混合支持的情况下,以下用例不受支持:

  1. 在不同的流上并行图启动中使用 MCCL 通信器(或拆分共享通信器),其中并行意味着在没有依赖关系会序列化它们执行的不同流上。
  2. 在使用相同通信器(或拆分共享通信器)的未完成图启动期间启动非捕获 MCCL 集体操作,无论流顺序如何。

禁用支持的能力是由于在启用支持并且多个等级通过相同线程的 musaGraphLaunch 启动工作时,观察到 MUSA 启动挂起。

接受的值

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

MCCL_DMABUF_ENABLE

(从 2.13 版本开始)

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

Linux dma-buf 子系统允许 GPU Direct RDMA 能力的 NIC 直接读取和写入 MUSA 缓冲区,无需 CPU 参与。

接受的值

0 或 1。默认值为 1(启用),但如果 Linux 内核或 MUSA/NIC 驱动程序不支持,则该功能将自动禁用。

MCCL_P2P_NET_CHUNKSIZE

(从 2.14 版本开始)

MCCL_P2P_NET_CHUNKSIZE 控制 mcclSend/mcclRecv 操作通过网络发送的消息大小。

接受的值

默认为 131072(128 K)。

值是整数,以字节为单位。建议使用 2 的幂,因此 262144 是下一个值。

MCCL_P2P_LL_THRESHOLD

(从 2.14 版本开始)

MCCL_P2P_LL_THRESHOLD 是 MCCL 将为 P2P 操作使用 LL 协议的最大消息大小。

接受的值

小数。默认为 16384。

MCCL_ALLOC_P2P_NET_LL_BUFFERS

(从 2.14 版本开始)

MCCL_ALLOC_P2P_NET_LL_BUFFERS 指示通信器为所有 P2P 网络连接分配专用 LL 缓冲区。这使得所有等级都可以在低于 MCCL_P2P_LL_THRESHOLD 大小的延迟限制的发送和接收操作中使用 LL 协议。节点内 P2P 传输始终分配专用 LL 缓冲区。如果运行具有高等级数量的全对全工作负载,这将导致高扩展内存开销。

接受的值

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

MCCL_COMM_BLOCKING

(从 2.14 版本开始)

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

接受的值

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

MCCL_CGA_CLUSTER_SIZE

(从 2.16 版本开始)

设置 MUSA 合作组数组(CGA)集群大小。在 sm90 和更高版本中,我们有一个额外的层次结构,可以将多个块在网格内组合在一起,称为线程块集群。将其设置为非零值将导致 MCCL 使用相应的集群尺寸属性启动通信内核。设置此环境变量将覆盖所有通信器中的 cgaClusterSize 配置(见 mcclConfig_t);如果没有设置(未定义),CGA 集群大小将由配置确定;如果没有传递配置,MCCL 将自动选择最佳值。

接受的值

0 到 8。默认值未定义。

MCCL_MAX_CTAS

(从 2.17 版本开始)

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

接受的值

设置为高达 32 的正整数值。默认值未定义。

MCCL_MIN_CTAS

(从 2.17 版本开始)

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

接受的值

设置为高达 32 的正整数值。默认值未定义。

MCCL_NVLS_ENABLE

(从 2.17 版本开始)

启用 NVLink SHARP(NVLS)的使用。NVLink SHARP 在第三代 NVSwitch 系统(NVLink4)中可用,适用于 Hopper 及以后 GPU 架构,允许将 mcclAllReduce 等集体操作卸载到 NVSwitch 域。 在不支持该功能的系统上,NVLS 将自动被禁用。

接受的值

默认为自动检测,定义并设置为 0 以禁用使用 NVLink SHARP。

MCCL_IB_MERGE_NICS

(从 2.20 版本开始)

启用 MCCL 将双端口 IB NIC 合并为单个逻辑网络设备。这允许 MCCL 更容易地聚合双端口 NIC 带宽。

接受的值

默认为 1(启用),定义并设置为 0 以禁用 NIC 合并

MCCL_MNNVL_ENABLE

(从 2.21 版本开始)

启用 MCCL 在可用时使用多节点 NVLink(MNNVL)。如果系统或驱动程序不支持 Multi-Node NVLink,则 MNNVL 将自动被禁用。此功能还需要 MCCL CUMEM 支持(MCCL_CUMEM_ENABLE)。 MNNVL 需要为形成 NVLink 域的所有节点配置和操作完整的 IMEX 域。有关 IMEX 域的详细信息,请参见 MUSA 文档。

接受的值

默认为自动检测,定义并设置为 0 以禁用 MNNVL 支持。

MCCL_RAS_ENABLE

(从 2.24 版本开始)

启用 MCCL 的可靠性、可用性和服务性(RAS)子系统,该子系统可用于在执行期间查询 MCCL 作业的健康状况(见 RAS)。

接受的值

默认为 1(启用);定义并设置为 0 以禁用 RAS。

MCCL_RAS_ADDR

(从 2.24 版本开始)

指定 RAS 子系统将监听客户端连接的套接字的 IP 地址和端口号。RAS 可以在多个进程之间共享此套接字,但如果多个独立的 MCCL 作业共享单个节点(如果这些作业属于不同的用户,则操作系统不允许套接字被共享)。在这种情况下,每个作业应使用不同的值启动(例如,localhost:12345localhost:12346 等)。由于通常使用 localhost,只有访问作业运行节点的人才可以连接到套接字。如果需要,可以指定一个可从外部访问的网络接口的地址,这将使 RAS 可以从其他节点(例如集群的头节点)访问,但这有安全问题需要考虑。

接受的值

默认为 localhost:28028。 第一部分可以使用主机名或 IP 地址;IPv6 地址需要用方括号括起来(例如,[::1])。

MCCL_RAS_TIMEOUT_FACTOR

(从 2.24 版本开始)

指定要应用于 RAS 子系统所有超时的乘数因子。RAS 依赖多个超时,从 5 到 60 秒不等,以确定应用程序的状态并维护其内部通信,不同超时之间存在复杂的相互依赖关系。如果需要,此变量可以用于以安全、一致的方式放大所有这些超时;例如,如果 MCCL 应用程序受到高开销调试/跟踪等的影响,使其执行不可预测。如果在这样的情况下使用 mcclras 客户端,可能还需要增加(或禁用)其超时。

接受的值

默认为 1;定义并设置为更大的值以增加超时。

MCCL_LAUNCH_ORDER_IMPLICIT

(从 2.26 版本开始)

隐式地对同一设备上的不同通信器的 MCCL 操作使用主机程序顺序进行排序。这确保操作不会死锁。当 MUSA 运行时和驱动程序为 12.3+ 时,允许重叠执行。在旧版 MUSA 上,操作将被序列化。

接受的值

默认为 0(禁用);设置为 1 以启用。

MCCL_LAUNCH_RACE_FATAL

(从 2.26 版本开始)

尝试捕获竞相启动到同一设备的主机线程,如果是这样,则返回致命错误。这样的竞争将违反 MCCL_LAUNCH_ORDER_IMPLICIT 所依赖的程序顺序的确定性。

接受的值

默认为 1(启用);设置为 0 以禁用。