Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

瞻博网络 RDMA 感知负载平衡 (LB) 和 BGP-DPF – GPU 后端交换矩阵实施

本节概述了实施瞻博网络 RDMA 感知负载平衡 (LB) 和 BGP-DPF 的配置详细信息。本部分中的所有配置和验证示例均基于以下示例:

图 1:实现示例 Implementation Example

使用 IPv6 SLAAC(无状态地址自动配置)的 GPU 服务器到叶节点连接

GPU 服务器按照轨道对齐架构进行连接,如后 端 GPU 轨道优化条带架构 部分所述,其中所有服务器上的 GPU 0 连接到第一个叶节点,所有服务器上的 GPU 1 连接到第二个叶节点,依此类推。这如 图 2 所示。

图 2:GPU 服务器到叶节点的轨道对齐连接 GPU Servers to Leaf Nodes Rail-Aligned Connectivity

服务器和叶节点之间的连接基于 L2 VLAN,叶节点上的 IRB 充当服务器的默认网关。

图 3:IRB 接口示例 IRB Interface Example

连接服务器和叶节点的物理接口配置了家族以太网交换,并映射到 VLAN,其关联的 IRB 作为 L3 接口。

示例:

以下示例显示了 stripe1-leaf1 与 服务器 1服务器 2 上的 gpu0_eth 接口之间的连接配置。交换机上的 irb.2 接口配置了四个 /64 IPv6 地址:

  • fd00:1:1:1::1/64,
  • fd00:1:1:2::1/64,
  • fd00:1:1:3::1/64 和
  • fd00:1:1:4::1/64。

这些前缀将播发给服务器 1 和服务器 2。

您可以使用以下命令验证 IPv6 地址是否已正确分配给 irb.2 接口,以及该接口是否与正确的 VLAN 相关联:

服务器 SLAAC 配置:

要配置 NVIDIA GPU 服务器上的接口,请按照 NVIDIA 配置中的步骤作 |瞻博网络您需要确保网络计划包含禁用 DHCPv6 的语句。

服务器上的接口无需配置任何 IPv6 地址,也无需显式启用 IPv6。禁用 DHCPv6 就足够了。

示例:

以下是网络计划示例。您可以使用这些示例创建模板以配置所有服务器上的地址。

注意:

确保 gpu#_eth 接口上未启用 IPv4。

还必须将服务器配置为接受和处理注册机关消息,以便通过路由器通告 (RA) 自动配置 IPv6 地址注册机关才能正常工作。在大多数情况下,默认情况下会启用此功能,但配置步骤如下所述:

该配置有两层:

  1. Netplan 或 systemd 中的接口级注册机关策略
  2. 内核级 sysctl 参数(accept_ra、autoconf

两者必须对齐以确保正确的注册机关行为。

  • 如果系统将 Netplan 与 systemd-networkd(在 Ubuntu Server 上常见):

在 Netplan YAML 文件(例如 /etc/netplan/01-netcfg.yaml)中,在每个接口下添加以下内容:

然后应用更改:

这可以确保 Netplan 使用 IPv6AcceptRA=yes 为 systemd-networkd 呈现 .network 文件,从而启用基于注册机关的自动配置。

然而,仅此还不够。如果内核仍配置为忽略 RA。还必须验证内核是否设置为在运行时接受 RA。您可以使用以下方法进行检查:

如果该值为0,则无论Netplan设置如何,RA都将被忽略。这可以通过以下方法暂时纠正:

sudo sysctl -w net.ipv6.conf.<interface>.accept_ra=1

要使其在重新启动后持续存在,请将以下内容添加到 sysctl 配置文件(例如 /etc/sysctl.d/99-accept-ra.conf):

并将其应用于:

注意:

accept-ra 等参数可以全局启用或禁用,也可以基于每个接口启用或禁用。

表 1:IPv6 配置中的参数
SYSCTL 作用域 效果
net.ipv6.conf.all.accept_ra 全局(所有当前接口) 立即应用于 所有现有 接口,但是...如果 转发 = 1,则只读
net.ipv6.conf.default.accept_ra 全局(用于将来的接口) 设置新接口启动时使用的默认值(例如,插入接口或稍后创建接口)
net.ipv6.conf.gpu0_eth.accept_ra 按接口 控制特定活动接口的注册机关处理
  • 如果接口由内核直接管理(不使用 Netplan/systemd):

通过设置启用注册机关接受和自动配置:

叶节点 SLAAC 配置

要启用 SLAAC,必须在面向 GPU 服务器的接口上为叶节点配置 IPv6 地址。

示例:

配置 IPv6 地址后,您必须在协议 路由器通告 下启用所有前缀的播发,如示例中所示:

注意:

为给定前缀配置路由器播发时,需要在配置路由器播发的接口上配置同一前缀内的 IPv6 地址。如果接口下未配置在路由器通告下配置的前缀,则提交配置时将返回错误。

示例:

下表汇总了每个叶节点上每个 IRB 接口上的前缀和 IP 地址:

子 子 子
表 2:IPV6 地址分配
  IRB VLAN 子网 1 IRB IP 地址 1网 2 IRB IP 地址 2网 3 IRB IP 地址 3网 4 IRB IP 地址 4 GPU 接口
条纹 1,叶 1 1 2 fc00:1:1:1:/64 fc00:1:1:1::1 fc00:1:1:2::/64 fc00:1:1:2::1 fc00:1:1:3::/64 fc00:1:1:3::1 fc00:1:1:4::/64 fc00:1:1:4::1 gpu0_eth
条纹 1,叶 2 2 3 fc00:1:2:1::/64 fc00:1:2:1::1 fc00:1:2:2::/64 fc00:1:2:2::1 fc00:1:2:3::/64 fc00:1:2:3::1 fc00:1:2:4::/64 fc00:1:2:4::1 gpu1_eth
条纹 1,叶 3 3 4 fc00:1:3:1::/64 fc00:1:3:1::1 fc00:1:3:2::/64 fc00:1:3:2::1 fc00:1:3:3::/64 fc00:1:3:3::1 fc00:1:3:4::/64 fc00:1:3:4::1 gpu2_eth
条纹 1,叶 4 4 5 fc00:1:4:1::/64 fc00:1:4:1::1 fc00:1:4:2::/64 fc00:1:4:2::1 fc00:1:4:3::/64 fc00:1:4:3::1 fc00:1:4:4::/64 fc00:1:4:4::1 gpu3_eth
条带 1,叶 5 5 6 fc00:1:5:1::/64 fc00:1:5:1::1 fc00:1:5:2::/64 fc00:1:5:2::1 fc00:1:5:3::/64 fc00:1:5:3::1 fc00:1:5:4::/64 fc00:1:5:4::1 gpu4_eth
条纹 1,叶 6 6 7 fc00:1:6:1::/64 fc00:1:6:1::1 fc00:1:6:2::/64 fc00:1:6:2::1 fc00:1:6:3::/64 fc00:1:6:3::1 fc00:1:6:4::/64 fc00:1:6:4::1 gpu5_eth
条带 1 叶 7 7 8 fc00:1:7:1::/64 fc00:1:7:1::1 fc00:1:7:2::/64 fc00:1:7:2::1 fc00:1:7:3::/64 fc00:1:7:3::1 fc00:1:7:4::/64 fc00:1:7:4::1 gpu6_eth
条纹 1,叶 8 8 9 fc00:1:8:1::/64 fc00:1:8:1::1 fc00:1:8:2::/64 fc00:1:8:2::1 fc00:1:8:3::/64 fc00:1:8:3::1 fc00:1:8:4::/64 fc00:1:8:4::1 gpu7_eth
条纹 2,枝叶 1 9 10 fc00:2:1:1::/64 fc00:2:1:1::1 fc00:2:1:2::/64 fc00:2:1:2::1 fc00:2:1:3::/64 fc00:2:1:3::1 fc00:2:1:4::/64 fc00:2:1:4::1 gpu0_eth
条纹 2,枝叶 2 10 11 fc00:2:2:1::/64 fc00:2:2:1::1 fc00:2:2:2::/64 fc00:2:2:2::1 fc00:2:2:3::/64 fc00:2:2:3::1 fc00:2:2:4::/64 fc00:2:2:4::1 gpu1_eth
条纹 2,叶 3 11 12 fc00:2:3:1::/64 fc00:2:3:1::1 fc00:2:3:2::/64 fc00:2:3:2:::1 fc00:2:3:3::/64 fc00:2:3:3:1 fc00:2:3:4::/64 fc00:2:3:4::1 gpu2_eth
条带 2、叶 4 12 13 fc00:2:4:1::/64 fc00:2:4:1::1 fc00:2:4:2::/64 fc00:2:4:2::1 fc00:2:4:3::/64 fc00:2:4:3::1 fc00:2:4:4::/64 fc00:2:4:4::1 gpu3_eth
条带 2,叶 5 13 14 fc00:2:5:1::/64 fc00:2:5:1::1 fc00:2:5:2::/64 fc00:2:5:2::1 fc00:2:5:3::/64 fc00:2:5:3::1 fc00:2:5:4::/64 fc00:2:5:4::1 gpu4_eth
条带 2,叶 6 14 15 fc00:2:6:1::/64 fc00:2:6:1::1 fc00:2:6:2::/64 fc00:2:6:2::1 fc00:2:6:3::/64 fc00:2:6:3::1 fc00:2:6:4::/64 fc00:2:6:4::1 gpu5_eth
条带 2 叶 7 15 16 fc00:2:7:1::/64 fc00:2:7:1::1 fc00:2:7:2::/64 fc00:2:7:2::1 fc00:2:7:3::/64 fc00:2:7:3::1 fc00:2:7:4::/64 fc00:2:7:4::1 gpu6_eth
条带 2 叶 8 16 17 fc00:2:8:1::/64 fc00:2:8:1::1 fc00:2:8:2::/64 fc00:2:8:2::1 fc00:2:8:3::/64 fc00:2:8:3::1 fc00:2:8:4::/64 fc00:2:8:4::1 gpu7_eth

SLAAC 验证:

要验证基于注册机关的配置是否有效,以及 GPU 接口是否已自动配置其 IPv6 地址并安装相应的路由,请使用以下命令:

您应该会看到一个 SLAAC 格式(前缀::EUI-64)标记为动态或 mngtmpaddr 的全局 inet6 地址。您还将输入接口的链路本地地址 (FE80::EUI-64)

示例:

您还可以通过以下方式观察传入的注册机关消息:

示例:

在某些情况下,尤其是在更改注册机关设置或在静态和动态配置之间切换之后,可能需要重置接口才能触发地址重新分配:

重新启用接口后,等待几秒钟,然后使用以下命令重新检查 IPv6 地址:

这可以确保删除过时的地址并处理新的 RA。

注意:

所有 IPv6 设置都可以在以下位置找到: /proc/sys/net/ipv6/conf

要验证是否正在发送路由器播发,可以使用以下命令:show ipv6 router-advertisement interface <interface>

示例:

您还可以使用以下方法在接口上捕获路由器通告数据包:

示例:

请注意,发送路由器通告时将使用叶节点接口的链路本地地址作为源、IPv6 全节点组播地址 (FF02::1)、下一个报头 ICMPv6 (58)。以下是与这些最相关的属性:

表 3:IPv6 路由器广告前缀信息中的字段和语义
参数 说明
标志 链路,自动

主机可以假定此前缀中的地址位于本地链路上。

此前缀可用于 SLAAC (无状态地址自动配置)。

有效终身 2592000 前缀的有效期为 30 天(用于可访问性)。
优选终身 604800 首选生存期为 7 天(之后对于新连接将弃用)。
路由器寿命 1800年代 路由器被视为默认网关 1800 秒

收到路由器播发后,服务器的 NIC 接口将通过将叶节点播发的前缀与使用 EUI-64 地址格式 (基于接口的 MAC 地址)计算的地址的主机部分连接起来,从而自动配置其 MAC 地址,如 表 4 所示。

表 4:GPU 到叶节点的 IPv6 地址
叶节点接口

叶节点 IPv6

地址

GPU NIC

GPU NIC

MAC 地址

GPU NIC IPv6

地址

条带 1 叶 1 - et-0/0/16:0

fc00:1:1:1::1

fc00:1:1:2::1

fc00:1:1:3::1

fc00:1:1:4::1

服务器 1 - gpu0_eth A0:88:C2:3B:50:66

fc00:1:1:1:a288:c2ff:fe3b:5066

fc00:1:1:2:a288:c2ff:fe3b:5066

fc00:1:1:3:a288:c2ff:fe3b:5066

fc00:1:1:4:a288:c2ff:fe3b:5066

条带 1 分叶 1 - et-0/0/16:1

fc00:1:1:2::1

fc00:1:2:2::1

fc00:1:3:2::1

fc00:1:4:2::1

服务器 2 - gpu0_eth 58:a2:e1:46:c6:ca

fc00:1:1:2:a288:c2ff:fe3b:506a

fc00:1:2:2:a288:c2ff:fe3b:506a

fc00:1:3:2:a288:c2ff:fe3b:506a

fc00:1:4:2:a288:c2ff:fe3b:506a

条带 1 叶 1 - et-0/0/17:0

fc00:1:1:3::1

fc00:1:2:3::1

fc00:1:3:3::1

fc00:1:4:3::1

服务器 3 - gpu0_eth A0:88:C2:3B:50:6E

fc00:1:1:3:a288:c2ff:fe3b:506e

fc00:1:2:3:a288:c2ff:fe3b:506e

fc00:1:3:3:a288:c2ff:fe3b:506e

fc00:1:4:3:a288:c2ff:fe3b:506e

.

.

.

       

使用 IPv6 邻接方发现的 BGP DPF(确定性路径转发)

本节介绍如何配置 BGP 以使用 IPv6 邻接方发现自动在叶节点和主干节点之间建立对等会话,以及如何启用确定性补丁转发。它包括其他 BGP 配置参数。

BGP 自动发现

由于叶节点和主干节点之间的每个连接都必须映射到不同的交换矩阵颜色,并且 BGP 配置为自动发现,因此需要为每个邻接方使用单独的 BGP 组。这可确保动态发现的每个对等方都与正确的颜色相关联。

每个 BGP 组都配置为一个外部 BGP 会话,并分配一个本地 AS 编号:

示例

A screenshot of a computer AI-generated content may be incorrect.

要启用 BGP 对等体自动发现,每个组都包含一个动态邻接方模板,用于指定允许发现的接口。这取代了用于静态对等方的传统邻接方 a.b.c.d 配置。使用对等自动发现和 ipv6-nd 选项启用自动发现:

示例

A screen shot of a computer AI-generated content may be incorrect.

这使得 Junos 可以使用 IPv6 邻接方发现动态确定邻接方地址。

为了保护对等方形成,每个组都使用 peer-as-list 语句引用定义的 AS 范围。这可以确保只有具有匹配 AS 编号的邻接方才能建立 BGP 会话。列表本身在 policy-options 下定义:

必须在叶节点和主干节点上启用自动发现。

示例

A screenshot of a computer AI-generated content may be incorrect.

每个组还会分配一种交换矩阵颜色,该颜色在策略选项下定义为 BGP 社区:

其中:<community-name> = <color>

A screenshot of a computer AI-generated content may be incorrect.

IPv6 NLRI 支持

必须使用以下方法在叶节点和主干节点上启用 IPv6 路由播发:

ECMP 多路径

必须将 BGP 多路径配置为允许通过受保护路径进行等价多路径 (ECMP) 路由,从而确保跨多个主干上行链路的负载平衡和故障切换。这是通过以下方法实现的:

必须在叶节点和主干节点上配置 BGP 多路径。

BFD(双向转发检测)

BFD 的配置可使用以下功能缩短故障检测时间:

表 6:BFD 选项
选项 说明

最小间隔

(必填)

本地设备发送的 BFD hello 数据包与来自邻接方的预期数据包之间的最短时间(以毫秒为单位)。

范围:1-255,000

推荐值:1000

乘数

(选答)

邻接方未收到的导致始发接口声明关闭的 hello 数据包数。

范围:1-255

建议:3(默认)

必须在叶节点和主干节点上配置 BFD。

DPF(确定性路径转发)

必须将叶节点配置为通过路由器通告 (RA) 播发给 GPU 服务器的相同单个 /64 IPv6 前缀,如使用 IPv6 SLAAC 的 GPU 服务器到叶节点连接部分中所述。

使用 fabric-advertise 语句播发前缀:

注意:

fabric-advertise 命令仅在叶节点上才需要。

color 选项指定应将前缀播发给匹配 <color> 的BGP对等方。播发前缀时,会使用与 <color> 关联的社区值进行标记,并将 AIGP 属性设置为 0。backup-color 选项指定应将前缀播发至与 <backup-color> 匹配的BGP对等方。播发的前缀使用与对等方关联的社区值进行标记,但没有 AIGP 属性。

示例:

图 5:前缀 fc00:1:1:1::/64 通告 Prefix fc00:1:1:1::/64 Advertisements

以下命令为每个 BGP 对等体(即,在叶节点上配置时的每个主干节点)分配交换矩阵颜色:

A screenshot of a computer AI-generated content may be incorrect.

要通过首选路径播发前缀 (fc00:1:1:1:/64) 以到达该前缀,并为前缀分配绿色,请使用以下命令:

注意:

确保配置了正确的前缀。不会生成提交错误,但不会播发前缀。

这会导致前缀 fc00:1:1:1::/64 播发至 主干 1。由于分配给前缀的颜色(绿色)与对等方(主干 1)的颜色匹配,因此路由将使用 社区颜色:0:1 (绿色)进行播发,并包含 AIGP 属性,将其标记为首选路径。

要在所有其他路径(备份路径)上播发同一前缀,请使用以下命令:

这会导致将前缀播发到 所有剩余的主干,每个主干都使用其相应的颜色社区(蓝色、红色、橙色)进行标记。由于分配给前缀的颜色(绿色)与对等方(主干 2、3 和 4)的颜色不匹配,因此这些播发不 包含 AIGP 属性,从而确保其偏好程度较低。

下表总结了前缀 fc00:1:1:1::/64 的路由通告:

表:前缀 fc00:1:1:1::/64 的社区和 AIGP

前面的示例展示了如何将单个前缀播发到所有主干节点,其中只有一个主干接收带有 AIGP 属性的路由,以指示首选路径。

下表通过汇总 stripe1-leaf1 (4) 向所有主干节点播发的所有前缀来扩展这一点。对于每个前缀,它显示:

  • 为预期路径分配的颜色。
  • 用于标记的 BGP 社区 (color:0:X)。
  • 是否包含 AIGP 属性(仅适用于首选路径)。

表:每个主干、每个前缀的社区和 AIGP 示例

A screenshot of a computer AI-generated content may be incorrect.

示例:

A computer screen shot of a computer code AI-generated content may be incorrect.

注意:

静态配置邻接方时,可以直接在 neighbor 语句下配置 fabric-color,因此可以有一个 BGP 组。

防止路由重新播发到主干

要将叶节点配置为仅播发与 IRB 接口关联的前缀,并防止 从一个主干获知 的路由播发到 另一个主干对等方,导出 策略 将应用于所有 BGP 组。这可确保叶设备充当主干到主干流量的 非中转节点 ,并在交换矩阵中保持正确的路由。

此策略匹配前缀长度为 16 位或更长的任何路由匹配前缀 fc00::/16 和 fd00::16,并在导出期间拒绝它。要播发的任何其他 IPv6 地址都可以添加到 本地前缀列表中。

如果不使用此策略,叶节点会将从一个主干节点获知的前缀重新播发给所有其他节点,这可能会导致不必要的路由行为,以及不同路径之间的流量分配效率低下。

此外,路由使用社区本地标记,主干节点使用该社区来防止将广告前缀传回叶节点。

BGP 会话自动发现和 DPF 验证

您可以使用以下 show bgp summary 命令检查是否已建立会话:

请注意,当使用链路本地地址建立 BGP 会话时,Junos 会显示邻接方地址以及接口范围(例如 fe80::5a86:70ff:fe78:e0d5%et-0/0/1:0.0)。范围标识符(% 后面的部分)是必需的,因为多个接口上可能存在相同的链路本地地址 (fe80::/10)。设备必须知道使用 哪个接口 向该邻接方发送数据包。因此,在对等方发现完成后,输出将 show bgp summary 使用以下格式列出邻接方: IPv6_link-local_address%interface-name

您可以使用show bgp summary autodiscovered 快速检查已发现邻接方的状态,如以下示例所示:

您可以根据特定邻接方的交换矩阵颜色验证其状态:

要验证前缀是否正确播发给所有对等方,请使用 show route advertising-protocol bgp <peer-address>

在本例中,fe80::9e5a:80ff:feef:a28f%et-0/0/0:0.0 是主干 1 的地址。

因此,所有前缀都使用社区颜色:0:1(绿色)进行播发。fc00:1:1:1::/64 也使用 AIGP 属性进行播发,因为它也配置了相同的颜色。同一前缀也会播发至其他主干,但没有 AIGP 值。fe80::5a86:70ff:fe78:e0d5%et-0/0/1:0.0 是主干 2 的地址。

fe80::5a86:70ff:fe7b:ced5%et-0/0/2:0.0 是主干 3 的地址。

fe80::5a86:70ff:fe79:3d5%et-0/0/3:0.0 是主干 4 的地址。

瞻博网络 NCCL 插件

瞻博网络 NCCL 网络插件为每个 RDMA 接口上的每个队列对 (QP) 分配一个唯一的 IPv6 地址。这使得 QP 流能够使用不同的源地址和目标地址,从而允许交换矩阵沿不同的路径进行转发。为了支持此行为,必须安装插件及其支持库,并且必须为服务器配置额外的路由信息,以确保每个 IPv6 地址从服务器到叶节点的正确转发,反之亦然。

在服务器上安装插件

瞻博网络 NCCL 网络插件以压缩焦油球 (juniper-ib_2.23.4-1.tar.gz) 的形式分发,可以在...

要安装,请将 tar-ball 解压到根目录:

$ tar -xzvf juniper-ib_0.0.5.tar.gz -C /

表 7:关键安装组件
组件 描述/用法
/usr/local/lib/libnccl-net-juniper-ib.so NCCL 网络插件共享对象
/usr/local/bin/jnpr-fabric-topo-gen 用于生成交换矩阵拓扑 json 文件的脚本
/usr/local/bin/jnpr-AI-LB-dpf-config-gen 用于生成 AI-LB DPF 配置的脚本
/usr/local/bin/jnpr-nccl-net-setup 用于配置 GPU 服务器网络设置的工具
/usr/local/bin/gids.py 用于查找 GID 的辅助模块
/usr/local/bin/jnpr-rdma-ping RDMA 连接测试工具
/usr/local/bin/jnpr-find-gids 用于查找 GID 的工具。

GPU 服务器上配置路由参数

在 GPU 服务器上,分配给接口的每个 IPv6 地址都必须与 单独的路由表相关联,其中包含通过正确的默认网关转发流量的相应 路由 。相反,必须创建 IP 规则 ,以便将发往每个特定 IPv6 地址的传入流量引导至其相应的路由表。

因此,在配置服务器以使用用于 RDMA 负载平衡 (RLB) 的 NCCL 插件正常运行时,您必须创建多个路由表,这些路由表数等于为每个接口分配的 IPv6 地址数(基于上行链路数,如前所述)乘以 NIC 数。

图 6 所示的示例中,为每个接口分配了四个 IPv6 地址,因此总共有 32 个路由表。每个路由表都必须包含默认路由和相应的前缀路由。此外,还必须为每个路由表添加一个 IP 规则。

图 6:服务器 1 (H100-01) Example from Server 1 (H100-01) 的示例

jnpr-nccl-net-setup 实用程序实时运行选项可用于在每台服务器上自动创建必要的表、路由和 IP 规则。

该命令需要导出NCCL套接字接口和地址族,如下例所示:

如果您需要手动创建路由表、路由和规则,请按照以下步骤手动配置所有 GPU 服务器上的表、路由和规则(如果需要):

  1. 创建路由表

    在每台服务器上的 /etc/iproute2/rt_tables.d 下创建文件 jnpr_nccl_net.conf ,并按行添加每个表 ID 和名称,如示例所示。

    示例:

    表 8:路由表示例
    条纹 1 / 条纹 2
    接口 ID
    gpu0_eth 10000 gpu0_subnet1
    10001 gpu0_subnet2
    10002 gpu0_subnet3
    10003 gpu0_subnet4
    gpu1_eth 10004 gpu1_subnet1
    10005 gpu1_subnet2
    10006 gpu1_subnet3
    10007 gpu1_subnet4
    gpu2_eth 10008 gpu2_subnet1
    10009 gpu2_subnet2
    10010 gpu2_subnet3
    10011 gpu2_subnet4
    gpu3_eth 10012 gpu3_subnet1
    10013 gpu3_subnet2
    10014 gpu3_subnet3
    10015 gpu3_subnet4
    gpu4_eth 10016 gpu4_subnet1
    10017 gpu4_subnet2
    10018 gpu4_subnet3
    10019 gpu4_subnet4
    gpu5_eth 10020 gpu5_subnet1
    10021 gpu5_subnet2
    10022 gpu5_subnet3
    10023 gpu5_subnet4
    gpu6_eth 10024 gpu6_subnet1
    10025 gpu6_subnet2
    10026 gpu6_subnet3
    10027 gpu6_subnet4
    gpu7_eth 10028 gpu7_subnet1
    10029 gpu7_subnet2
    10030 gpu7_subnet3
    10031 gpu7_subnet4
  2. 验证是否已创建表。
  3. 在每个路由表上添加 IPv6 路由。

    使用以下命令在每个路由表上配置默认路由和前缀路由,如示例中所示。

    如果需要在创建所需路由之前删除所有路由,可以运行:

    示例:

    > > > > > > >
    表 9:每个接口有 4 个 IPv6 地址的路由示例
      条纹 条纹 2
    <接口<表<前缀<默认网关<表<前缀<默认网关
    gpu0_eth gpu0_subnet1 fc00:1:1:1:/64

    fc00:1:1:1::1

    (枝叶 1,IRB.2)

    gpu0_subnet1 fc00:2:1:1::/64

    fc00:2:1:1::1

    (叶 1 IRB.10)

    gpu0_subnet2 fc00:1:1:2::/64

    fc00:1:1:2::1

    (枝叶 1,IRB.2)

    gpu0_subnet2 fc00:2:1:2::/64

    fc00:2:1:2::1

    (叶 1 IRB.10)

    gpu0_subnet3 fc00:1:1:3::/64

    fc00:1:1:3::1

    (枝叶 1,IRB.2)

    gpu0_subnet3 fc00:2:1:3::/64

    fc00:2:1:3::1

    (叶 1 IRB.10)

    gpu0_subnet4 fc00:1:1:4::/64

    fc00:1:1:4::1

    (枝叶 1,IRB.2)

    gpu0_subnet4 fc00:2:1:4::/64

    fc00:2:1:4::1

    (叶 1 IRB.10)

    gpu1_eth gpu1_subnet1 fc00:1:2:1::/64

    fc00:1:2:1::1

    (叶 2 IRB.3)

    gpu1_subnet1 fc00:2:2:1::/64

    fc00:2:2:1::1

    (第 2 页 IRB.11)

    gpu1_subnet2 fc00:1:2:2::/64

    fc00:1:2:2::1

    (叶 2 IRB.3)

    gpu1_subnet2 fc00:2:2:2::/64

    fc00:2:2:2::1

    (第 2 页 IRB.11)

    gpu1_subnet3 fc00:1:2:3::/64

    fc00:1:2:3::1

    (叶 2 IRB.3)

    gpu1_subnet3 fc00:2:2:3::/64

    fc00:2:2:3::1

    (第 2 页 IRB.11)

    gpu1_subnet4 fc00:1:2:4::/64

    fc00:1:2:4::1

    (叶 2 IRB.3)

    gpu1_subnet4 fc00:2:2:4::/64

    fc00:2:2:4::1

    (第 2 页 IRB.11)

    gpu2_eth gpu2_subnet1 fc00:1:3:1::/64

    fc00:1:3:1::1

    (第 3 页 IRB.4)

    gpu2_subnet1 fc00:2:3:1::/64

    fc00:2:3:1::1

    (第 3 页 IRB.12)

    gpu2_subnet2 fc00:1:3:2::/64

    fc00:1:3:2::1

    (第 3 页 IRB.4)

    gpu2_subnet2 fc00:2:3:2::/64

    fc00:2:3:2:::1

    (第 3 页 IRB.12)

    gpu2_subnet3 fc00:1:3:3::/64

    fc00:1:3:3::1

    (第 3 页 IRB.4)

    gpu2_subnet3 fc00:2:3:3::/64

    fc00:2:3:3:1

    (第 3 页 IRB.12)

    gpu2_subnet4 fc00:1:3:4::/64

    fc00:1:3:4::1

    (枝叶 3 IRB.4

    gpu2_subnet4 fc00:2:3:4::/64

    fc00:2:3:4::1

    (第 3 页 IRB.12)

    gpu3_eth gpu3_subnet1 fc00:1:4:1::/64

    fc00:1:4:1::1

    (第 4 页 IRB.5)

    gpu3_subnet1 fc00:2:4:1::/64

    fc00:2:4:1::1

    (第 4 页 IRB.13)

    gpu3_subnet2 fc00:1:4:2::/64

    fc00:1:4:2::1

    (第 4 页 IRB.5)

    gpu3_subnet2 fc00:2:4:2::/64

    fc00:2:4:2::1

    (第 4 页 IRB.13)

    gpu3_subnet3 fc00:1:4:3::/64

    fc00:1:4:3::1

    (第 4 页 IRB.5)

    gpu3_subnet3 fc00:2:4:3::/64

    fc00:2:4:3::1

    (第 4 页 IRB.13)

    gpu3_subnet4 fc00:1:4:4::/64

    fc00:1:4:4::1

    (枝叶 5 IRB.5)

    gpu3_subnet4 fc00:2:4:4::/64

    fc00:2:4:4::1

    (第 4 页 IRB.13)

    gpu4_eth gpu4_subnet1 fc00:1:5:1::/64

    fc00:1:5:1::1

    (枝叶 5 IRB.6)

    gpu4_subnet1 fc00:2:5:1::/64

    fc00:2:5:1::1

    (第 5 页 IRB.14)

    gpu4_subnet2 fc00:1:5:2::/64

    fc00:1:5:2::1

    (枝叶 5 IRB.6)

    gpu4_subnet2 fc00:2:5:2::/64

    fc00:2:5:2::1

    (第 5 页 IRB.14)

    gpu4_subnet3 fc00:1:5:3::/64

    fc00:1:5:3::1

    (枝叶 5 IRB.6)

    gpu4_subnet3 fc00:2:5:3::/64

    fc00:2:5:3::1

    (第 5 页 IRB.14)

    gpu4_subnet4 fc00:1:5:4::/64

    fc00:1:5:4::1

    (枝叶 5 IRB.6)

    gpu4_subnet4 fc00:2:5:4::/64

    fc00:2:5:4::1

    (第 5 页 IRB.14)

    gpu5_eth gpu5_subnet1 fc00:1:6:1::/64

    fc00:1:6:1::1

    (第 6 页 IRB.7)

    gpu5_subnet1 fc00:2:6:1::/64

    fc00:2:6:1::1

    (第 6 页 IRB.15)

    gpu5_subnet2 fc00:1:6:2::/64

    fc00:1:6:2::1

    (第 6 页 IRB.7)

    gpu5_subnet2 fc00:2:6:2::/64

    fc00:2:6:2::1

    (第 6 页 IRB.15)

    gpu5_subnet3 fc00:1:6:3::/64

    fc00:1:6:3::1

    (第 6 页 IRB.7)

    gpu5_subnet3 fc00:2:6:3::/64

    fc00:2:6:3::1

    (第 6 页 IRB.15)

    gpu5_subnet4 fc00:1:6:4::/64

    fc00:1:6:4::1

    (第 6 页 IRB.7)

    gpu5_subnet4 fc00:2:6:4::/64

    fc00:2:6:4::1

    (第 6 页 IRB.15)

    gpu6_eth gpu6_subnet1 fc00:1:7:1::/64

    fc00:1:7:1::1

    (第 7 页 IRB.8)

    gpu6_subnet1 fc00:2:7:1::/64

    fc00:2:7:1::1

    (第 7 页 IRB.16)

    gpu6_subnet2 fc00:1:7:2::/64

    fc00:1:7:2::1

    (第 7 页 IRB.8)

    gpu6_subnet2 fc00:2:7:2::/64

    fc00:2:7:2::1

    (第 7 页 IRB.16)

    gpu6_subnet3 fc00:1:7:3::/64

    fc00:1:7:3::1

    (第 7 页 IRB.8)

    gpu6_subnet3 fc00:2:7:3::/64

    fc00:2:7:3::1

    (第 7 页 IRB.16)

    gpu6_subnet4 fc00:1:7:4::/64

    fc00:1:7:4::1

    (第 7 页 IRB.8)

    gpu6_subnet4 fc00:2:7:4::/64

    fc00:2:7:4::1

    (第 7 页 IRB.16)

    gpu7_eth gpu7_subnet1 fc00:1:8:1::/64

    fc00:1:8:1::1

    (叶 8 IRB.9)

    gpu7_subnet1 fc00:2:8:1::/64

    fc00:2:8:1::1

    (第 8 页 IRB.17)

    gpu7_subnet2 fc00:1:8:2::/64

    fc00:1:8:2::1

    (叶 8 IRB.9)

    gpu7_subnet2 fc00:2:8:2::/64

    fc00:2:8:2::1

    (第 8 页 IRB.17)

    gpu7_subnet3 fc00:1:8:3::/64

    fc00:1:8:3::1

    (叶 8 IRB.9)

    gpu7_subnet3 fc00:2:8:3::/64

    fc00:2:8:3::1

    (第 8 页 IRB.17)

    gpu7_subnet4 fc00:1:8:4::/64

    fc00:1:8:4::1

    (叶 8 IRB.9)

    gpu7_subnet4 fc00:2:8:4::/64

    fc00:2:8:4::1

    (第 8 页 IRB.17)

    Stripe1: user@H100-01:/$ sudo ip -6 route add fc00:1:1:1:::/64 dev gpu0_eth表gpu0_subnet1

    条带 2:

  4. 验证路由创建

    如果需要移除所有路由,可以运行:

    示例:

  5. 添加路由策略规则。

    使用以下命令为每个路由表配置路由策略规则,如示例所示。

    、 、
    表 10:每个策略规则的表和前缀
      条纹 1条纹 2
    接口 前缀 前缀
    gpu0_eth gpu0_subnet1 fc00:1:1:1:/64 gpu0_subnet1 fc00:2:1:1::/64
    gpu0_subnet2 fc00:1:1:2::/64 gpu0_subnet2 fc00:2:1:2::/64
    gpu0_subnet3 fc00:1:1:3::/64 gpu0_subnet3 fc00:2:1:3::/64
    gpu0_subnet4 fc00:1:1:4::/64 gpu0_subnet4 fc00:2:1:4::/64
    gpu1_eth gpu1_subnet1 fc00:1:2:1::/64 gpu1_subnet1 fc00:2:2:1::/64
    gpu1_subnet2 fc00:1:2:2::/64 gpu1_subnet2 fc00:2:2:2::/64
    gpu1_subnet3 fc00:1:2:3::/64 gpu1_subnet3 fc00:2:2:3::/64
    gpu1_subnet4 fc00:1:2:4::/64 gpu1_subnet4 fc00:2:2:4::/64
    gpu2_eth gpu2_subnet1 fc00:1:3:1::/64 gpu2_subnet1 fc00:2:3:1::/64
    gpu2_subnet2 fc00:1:3:2::/64 gpu2_subnet2 fc00:2:3:2::/64
    gpu2_subnet3 fc00:1:3:3::/64 gpu2_subnet3 fc00:2:3:3::/64
    gpu2_subnet4 fc00:1:3:4::/64 gpu2_subnet4 fc00:2:3:4::/64
    gpu3_eth gpu3_subnet1 fc00:1:4:1::/64 gpu3_subnet1 fc00:2:4:1::/64
    gpu3_subnet2 fc00:1:4:2::/64 gpu3_subnet2 fc00:2:4:2::/64
    gpu3_subnet3 fc00:1:4:3::/64 gpu3_subnet3 fc00:2:4:3::/64
    gpu3_subnet4 fc00:1:4:4::/64 gpu3_subnet4 fc00:2:4:4::/64
    gpu4_eth gpu4_subnet1 fc00:1:5:1::/64 gpu4_subnet1 fc00:2:5:1::/64
    gpu4_subnet2 fc00:1:5:2::/64 gpu4_subnet2 fc00:2:5:2::/64
    gpu4_subnet3 fc00:1:5:3::/64 gpu4_subnet3 fc00:2:5:3::/64
    gpu4_subnet4 fc00:1:5:4::/64 gpu4_subnet4 fc00:2:5:4::/64
    gpu5_eth gpu5_subnet1 fc00:1:6:1::/64 gpu5_subnet1 fc00:2:6:1::/64
    gpu5_subnet2 fc00:1:6:2::/64 gpu5_subnet2 fc00:2:6:2::/64
    gpu5_subnet3 fc00:1:6:3::/64 gpu5_subnet3 fc00:2:6:3::/64
    gpu5_subnet4 fc00:1:6:4::/64 gpu5_subnet4 fc00:2:6:4::/64
    gpu6_eth gpu6_subnet1 fc00:1:7:1::/64 gpu6_subnet1 fc00:2:7:1::/64
    gpu6_subnet2 fc00:1:7:2::/64 gpu6_subnet2 fc00:2:7:2::/64
    gpu6_subnet3 fc00:1:7:3::/64 gpu6_subnet3 fc00:2:7:3::/64
    gpu6_subnet4 fc00:1:7:4::/64 gpu6_subnet4 fc00:2:7:4::/64
    gpu7_eth gpu7_subnet1 fc00:1:8:1::/64 gpu7_subnet1 fc00:2:8:1::/64
    gpu7_subnet2 fc00:1:8:2::/64 gpu7_subnet2 fc00:2:8:2::/64
    gpu7_subnet3 fc00:1:8:3::/64 gpu7_subnet3 fc00:2:8:3::/64
    gpu7_subnet4 fc00:1:8:4::/64 gpu7_subnet4 fc00:2:8:4::/64

    示例:

  6. 验证规则创建:

如果需要删除所有规则,可以运行:

示例:

运行 NCCL 作业

在映射 QP 和 IPv6 地址时,运行 NCCL 测试需要以下 NCCL 变量:

NCCL_NET_PLUGIN=juniper-ib
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/
NCCL_IB_QPS_PER_CONNECTION=4
NCCL_IB_SPLIT_DATA_ON_QPS=1
NCCL_IB_ADDR_FAMILY=AF_INET6
NCCL_SOCKET_FAMILY=AF_INET6
NCCL_SOCKET_NTHREADS=8
UCX_IB_GID_INDEX=3
UCX_NET_DEVICES=mlx5_0:1,mlx5_3:1,mlx5_4:1,mlx5_5:1,mlx5_6:1,mlx5_9:1,mlx5_10:1,mlx5_11:1
接受的默认
表 11:NCCL 变量说明
变量 描述

NCCL_NET_PLUGIN

(自 2.11 以来)

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

  • 如果设置了NCCL_NET_PLUGIN,请尝试加载名称由 NCCL_NET_PLUGIN 指定的库;
  • 如果设置了NCCL_NET_PLUGIN并且之前失败了,请尝试加载 libnccl-net-<NCCL_NET_PLUGIN>.so;
  • 如果未设置NCCL_NET_PLUGIN,请尝试加载 libnccl-net.so;
  • 如果未找到插件(既不是用户定义的,也不是默认的),请使用内部网络插件。

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

插件后缀、插件文件名或“无”。  
LD_LIBRARY_PATH 指向包含瞻博网络 NCCL 网络插件共享对象的目录    

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(拆分模式),每条消息将在每个队列对上平均拆分。如果使用许多 QP,这可能会导致明显的延迟下降。设置为 0(轮询模式),队列对将在轮询模式下用于我们发送的每条消息。不发送多条消息的作不会使用所有 QP。 0 或 1。

0

1(适用于 2.18 和 2.19)

NCCL_IB_ADDR_FAMILY 指定用于 InfiniBand 的地址族。 AF_INET (IPv4) 或 AF_INET6 (IPv6) AF_INET
NCCL_SOCKET_FAMILY 指定用于套接字的地址族。应与交换矩阵的地址类型匹配。 AF_INET或AF_INET6 AF_UNSPEC(回退逻辑)
NCCL_SOCKET_NTHREADS NCCL 使用的每个套接字的线程数。可通过多个网络接口提高性能。 整数(通常设置在 1-16 之间,具体取决于 CPU/网络负载) 1
UCX_IB_GID_INDEX 指定 InfiniBand 设备的 GID 索引。需要选择正确的 GID(例如,全局 IPv6 GID)。 整数,通常为 3,用于 IPv6 上的 RoCEv2(但取决于 NIC 配置) 依赖 NIC
UCX_NET_DEVICES 指定要使用的启用 UCX 的网络设备列表。需要将流量固定到选定的 NIC 端口。 逗号分隔的列表,如 mlx5_0:1,mlx5_3:1,... 所有可用设备

参考: 环境变量 — NCCL 2.27.5 文档

注意:

检查 附录 A – 如何使用自动配置的 IPv6 地址运行 NCCL 测试 以确定UCX_IB_GID_INDEX值。确保所选地址不是链路本地 IPv6 地址。

增加 QP 的数量可以提高工作绩效,但只能在一定程度上。除此之外,由于 GPU 服务器内的内部处理限制(NIC 缓存限制、调度开销、缓存争用以及完成队列的管理方式),性能保持不变甚至开始下降,并且不是由流量平衡机制的网络结构引起的。

根据经验,将每个连接的队列对数配置为等于上行链路(叶式到主干式链路)的数量,以获得最佳性能。将队列对的数量增加到超过此范围通常不会提供任何好处。

例如,考虑 表 12 中所示具有不同数量的队列对的 NCCL 测试的性能结果。所有缩减测试的平均总线带宽随着QP数量的增加而提高,当上行链路和队列对数量相同时达到最高值。将数量增加到超过该点不会带来任何好处,甚至会导致性能急剧下降。

、 、
表 12:NCCL 全减和全对全 NCCL 测试(具有不同队列对数量)的平均总线带宽
上行链路数QP 数平均总线带宽 [Gbps]
  all-reduce all-to-all
4 1 189.067 17.785
4 2 379.499 31.666
4 4 386.753 43.552
4 8 386.734 28.130
4 16 383.412 13.537
4 32 381.354 6.294
8 1 66.488 15.835
8 2 201.376 26.355
8 4 364.614 43.284
8 8 386.739 28.404
8 16 383.396 13.662
8 32 381.060 6.338
注意:

这些测试使用 4 个节点每个节点 8 个 GPU、带有 Connect X7 NIC 的 NVIDIA H100-01 服务器和 NCCL 版本 2.23.4+cuda12.6 完成。