单平面双网口最佳实践

  1. Hyper MPI中HUCX实现了Multi-Rail特性,在数据量达到rndv协议的阈值,即数据传输走rndv协议时,一个传输层可以同时使用多条链路来传输数据。使用RDMA通信时,能够使能多网口。rndv协议的阈值是根据环境自动调整的,也可以通过环境变量UCX_RNDV_THRESH设置使用rndv协议的数据包阈值。默认情况下,使用RDMA通信,最多能够使能两个网口,也可以通过环境变量UCX_MAX_RNDV_RAILS配置可使用的最大网口数。

    示例如下:

    mpirun -np 16 -x UCX_RNDV_THRESH=32k -x UCX_MAX_RNDV_RAILS=2 osu_bcast

  2. Multi-Rail特性会根据网口的带宽和时延(与进程绑核位置、网卡传输时延等条件相关)选择最优的两条链路,传输时按带宽比例计算出每个通道的分包大小,并通过每个端口轮流发。

    网口的MTU值在一定程度上会影响网口的带宽,MTU的默认值可以通过ibv_devinfo -d <网口名>|grep active_mtu命令查询,示例如下:

    ibv_devinfo -d mlx5_0|grep active_mtu

    回显示例如下:

    active_mtu:		1024 (3)

    默认值也可以通过UCX_RC_VERBS_PATH_MTU(板载网卡)或UCX_RC_MLX5_PATH_MTU(Mellanox网卡)进行修改。示例如下:

    mpirun -np 16 -x UCX_NET_DEVICES=hns_0:1 -x UCX_RC_VERBS_PATH_MTU=1024 osu_bcast

    mpirun -np 16 -x UCX_NET_DEVICES=mlx5_1:1 -x UCX_RC_MLX5_PATH_MTU=1024 osu_bcast

    1. 进程排布:建议将不同节点的进程绑定至每个节点的同一个NUMA(如numa0,进程数较少场景)或同一个Socket(如socket0,进程数较多场景)上,方便指定距离进程较近的网卡,以降低跨Die访问网卡的时延。

      假设1个Socket有2个NUMA node,1个NUMA node有32个CPU,示例如下:

      mpirun -np 16 --map-by core -x UCX_NET_DEVICES=hns_0:1 osu_bcast(16个进程绑定在numa0上,并指定numa0上的网卡)

    2. 网卡选择:
      • 如果数据量较小,即默认使用eager协议,单个网口的带宽都无法满载。
        • 网口类型不同,建议指定协议传输时延较低的网口,比如IB和RoCE中选择IB网口。
        • 网口类型相同,考虑NUMA亲和性,建议指定进程所在的IO Die的网口或按照HUCX的默认策略选择单网口通信。
      • 如果数据量较大,即默认使用rndv协议。
        • 单平面有2个网口,默认会使能这两个网口。
        • 单平面有至少3个网口,如果切分的数据包无法将每个网口的带宽打满,建议指定进程所在的CPU Die或者所在Socket的网口;如果切分的数据包较大,首先考虑带宽较大的网口。HUCX会根据带宽和时延默认选择最优的2个网口。