环境变量
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 开头的接口,例如 eth0、eth1...
=eth0:仅使用接口 eth0
=eth0,eth1:仅使用接口 eth0 和 eth1
^docker:不使用任何以 docker 开头的接口
^=docker0:不使用接口 docker0。
注意:默认情况下,回环接口(lo)和 docker 接口(docker*)除非没有其他接口可用,否则不会被选中。如果您更喜欢使用 lo 或 docker* 而不是其他接口,则需要使用 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 变量指定在 ETIMEDOUT、ECONNREFUSED 或 EHOSTUNREACH 错误后,MCCL 重试建立套接字连接的次数。
接受的值
默认值为 34,任何正数值都是有效的。
MCCL_SOCKET_RETRY_SLEEP_MSEC
(从 2.24 版本开始)
MCCL_SOCKET_RETRY_SLEEP_MSEC 变量指定在第一次 ETIMEDOUT、ECONNREFUSED 或 EHOSTUNREACH 错误后,MCCL 在重试建立套接字连接前等待的毫秒数。对于后续错误,等待时间与错误计数成线性关系。因此,总时间将是 (N+1) * N/2 * MCCL_SOCKET_RETRY_SLEEP_MSEC,其中 N 由 MCCL_SOCKET_RETRY_CNT 给出。使用 MCCL_SOCKET_RETRY_CNT 和 MCCL_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_NTHREADS 和 MCCL_NSOCKS_PERTHREAD 的乘积不能超过 64。另见 MCCL_NSOCKS_PERTHREAD。
MCCL_NSOCKS_PERTHREAD
(从 2.4.8 版本开始)
MCCL_NSOCKS_PERTHREAD 变量指定每个套接字传输辅助线程打开的套接字数。在每个套接字速度受限的环境中,将此变量设置为大于 1 可能会提高网络性能。
接受的值
在 AWS 上,默认值为 8;在其他情况下,默认值为 1。
对于通用的 100G 网络,此值可以手动设置为 4。然而,MCCL_SOCKET_NTHREADS 和 MCCL_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_0 和 mlx5_1 的端口 1
^=mlx5_1,mlx5_4:不使用卡 mlx5_1 和 mlx5_4。
注意:使用 mlx5_1 而不带前导 = 将选择 mlx5_1 以及 mlx5_10 到 mlx5_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_1、mlx5_10、mlx5_11 等列表中找到的第一个接口。
MCCL_NET="Socket" MCCL_OOB_NET_ENABLE=1 MCCL_OOB_NET_IFNAME="ens1"
将使用套接字网络,并使用在 ens1f0、ens1f1 等列表中找到的第一个接口。
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/Pacific、America/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 变量允许用户设置哪些日志行根据日志级别获得时间戳。
接受的值
值应为应该添加时间戳的级别的逗号分隔列表。有效级别有:VERSION、WARN、INFO、ABORT 和 TRACE。此外,可以使用 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,定义并设置为整数。