环境变量
MCCL 提供了一套广泛的环境变量,用于特定用途的调整。
环境变量也可以在 /etc/mccl.conf 中静态设置(由管理员设置系统范围的值)或在 ${MCCL_CONF_FILE} 中设置。例如,这些文件可能包含:
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*)除非没有其他接口可用,否则不会被选中。
MCCL_SOCKET_FAMILY
MCCL_SOCKET_FAMILY 变量允许用户强制 MCCL 仅使用 IPv4 或 IPv6 接口。
接受的值
设置为 AF_INET 以强制使用 IPv4,或 AF_INET6 以强制使用 IPv6。
MCCL_SOCKET_NTHREADS
MCCL_SOCKET_NTHREADS 变量指定每个网络连接使用的 CPU 辅助线程数。增加此值可能会提高套接字传输性能,但代价是更高的 CPU 使用率。
接受的值
1 到 16。默认情况下自动选择;若无法识别网络设备类型,则不启动额外辅助线程。
对于通用的 100G 网络,此值可以手动设置为 4。然而,MCCL_SOCKET_NTHREADS 和 MCCL_NSOCKS_PERTHREAD 的乘积不能超过 64。另见 MCCL_NSOCKS_PERTHREAD。
MCCL_NSOCKS_PERTHREAD
MCCL_NSOCKS_PERTHREAD 变量指定每个套接字传输辅助线程打开的套接字数。在每个套接字速度受限的环境中,将此变量设置为大 于 1 可能会提高网络性能。
接受的值
默认情况下自动选择;若无法识别网络设备类型,则默认值为 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 规范。
接受的值
MCCL 使用的默认值为 14。
值可以是 1-31。
注意:将值设置为 0 或 >= 32 将导致无限超时值。
MCCL_IB_RETRY_CNT
MCCL_IB_RETRY_CNT 变量控制 InfiniBand 重试计数。
有关更多信息,请参见 InfiniBand 规范。
接受的值
默认值为 7。
MCCL_IB_GID_INDEX
MCCL_IB_GID_INDEX 变量定义在 RoCE 模式中使用的全局 ID 索引。请参见 InfiniBand show_gids 命令以设置此值。
有关更多信息,请参见 InfiniBand 规范第一卷或供应商文档。
接受的值
默认值为 0。
MCCL_IB_SL
定义 InfiniBand 服务级别。
有关更多信息,请参见 InfiniBand 规范第一卷或供应商文档。
接受的值
默认值为 0。
MCCL_IB_TC
定义 InfiniBand 流量类别字段。
有关更多信息,请参见 InfiniBand 规范第一卷或供应商文档。
接受的值
默认值为 0。
MCCL_NET
强制 MCCL 使用特定网络,例如确保 MCCL 使用外部插件,并且不会自动回退到内部 IB 或套接字实现。如果没有设置(未定义),MCCL 将自动选择最佳网络模块。
接受的值
MCCL_NET 的值必须与使用的 MCCL 网络的名称完全匹配(不区分大小写)。内部网络名称为 "IB"(通用 IB Verbs )和 "Socket"(TCP/IP 套接字)。外部网络插件定义自己的名称。默认值未定义。
MCCL_NET_PLUGIN
将其设置为后缀字符串或库名称,以在多个 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_IGNORE_CPU_AFFINITY
MCCL_IGNORE_CPU_AFFINITY 变量可用于使 MCCL 忽略作业提供的 CPU 亲和性,而只使用 GPU 亲和性。