2. 多机多卡运行nccl-tests对比分析

embedded/2024/9/22 15:45:59/

系列文章

  • 第1章 多机多卡运行nccl-tests 和channel获取
  • 第2章 多机多卡nccl-tests 对比分析

目录

  • 系列文章
  • 前言
  • 一、本地环境
    • 1. 网卡接口
    • 2. RDMA
    • 3. TOPO信息
      • pcie信息
      • nvidia-smi topo -m
  • 二、nccl-test对比分析
    • 1. 相关环境变量
    • 2. 不同情况的对比
    • 3. 总结与分析


前言

NCCL(NVIDIA Collective Communications Library)是NVIDIA提供的一套用于GPU加速的通信库,主要用于在多个GPU之间进行数据传输和通信。它被设计为在异构计算环境中(包括NVIDIA GPU和CPU)高效地执行数据并行和模型并行。

NCCL深度学习训练中的一个关键组件,因为它能够有效地在多个GPU之间传输数据,这对于加速神经网络的训练非常重要。在现代的深度学习框架中,如TensorFlow、PyTorch和Keras,NCCL通常作为后端通信库,与框架的API紧密集成,为用户提供一个简单易用的编程接口。

这里通过使用不同的网络配置,在双机进行了nccl-test测试,获得了不同的结果,并尝试进行简单分析。


一、本地环境

有2台机器,配置完全相同

1. 网卡接口

ifconfig的结果:

  • eno2为普通千兆以太网接口,最大带宽1Gbps;
  • ens9f0np0 和ens9f1np1为Mellanox 100G网卡的两个接口

在这里插入图片描述

2. RDMA

在这里插入图片描述

jxh@nccl4:~$ lspci |grep Mellanox //查看服务器中 mellaox 网卡信息
b1:00.0 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]
b1:00.1 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]jxh@nccl4:~$ ibdev2netdev //查看以太网设备与IB设备关联信息
mlx5_0 port 1 ==> ens9f0np0 (Up)
mlx5_1 port 1 ==> ens9f1np1 (Up)jxh@nccl4:~$ ibv_devices //查看RDMA设备device                 node GUID------              ----------------mlx5_0              08c0eb030024721amlx5_1              08c0eb030024721b

3. TOPO信息

pcie信息

可以通过nccl传入环境变量NCCL_TOPO_DUMP_FILE=./dump-topo.xml \来转储nccl搜索到的本机topo

设置NCCL_IB_DISABLE=1时本机信息如下:


<system version="1"><cpu numaid="1" affinity="ffff,fffff000,000000ff,fffffff0,00000000" arch="x86_64" vendor="GenuineIntel" familyid="6" modelid="106"><pci busid="0000:ca:00.0" class="0x060400" vendor="0x11f8" device="0x4000" subsystem_vendor="0x11f8" subsystem_device="0xbeef" link_speed="16.0 GT/s PCIe" link_width="16"><pci busid="0000:cd:00.0" class="0x030000" vendor="0x10de" device="0x2684" subsystem_vendor="0x7377" subsystem_device="0x0000" link_speed="16.0 GT/s PCIe" link_width="16"><gpu dev="0" sm="89" rank="0" gdr="0"/></pci><pci busid="0000:cf:00.0" class="0x030000" vendor="0x10de" device="0x2684" subsystem_vendor="0x7377" subsystem_device="0x0000" link_speed="16.0 GT/s PCIe" link_width="16"><gpu dev="1" sm="89" rank="1" gdr="0"/></pci></pci><pci busid="0000:b1:00.0" class="0x020000" vendor="0x15b3" device="0x1017" subsystem_vendor="0x15b3" subsystem_device="0x0007" link_speed="8.0 GT/s PCIe" link_width="8"><nic><net name="ens9f0np0" dev="1" speed="100000" port="0" latency="0.000000" guid="0x1" maxconn="65536" gdr="0"/></nic></pci><pci busid="0000:b1:00.1" class="0x020000" vendor="0x15b3" device="0x1017" subsystem_vendor="0x15b3" subsystem_device="0x0007" link_speed="8.0 GT/s PCIe" link_width="8"><nic><net name="ens9f1np1" dev="2" speed="100000" port="0" latency="0.000000" guid="0x2" maxconn="65536" gdr="0"/></nic></pci></cpu><cpu numaid="0" affinity="0000,00000fff,ffffff00,0000000f,ffffffff" arch="x86_64" vendor="GenuineIntel" familyid="6" modelid="106"><pci busid="0000:65:00.1" class="0x020000" vendor="0x8086" device="0x1521" subsystem_vendor="0xffff" subsystem_device="0x0000" link_speed="5.0 GT/s PCIe" link_width="4"><nic><net name="eno2" dev="0" speed="1000" port="0" latency="0.000000" guid="0x0" maxconn="65536" gdr="0"/></nic></pci></cpu>
</system>

正如以上topo显示:

  • 有两张4090,均为Pcie 4.0 *16
  • 一个100G网卡上的两个接口 均为 Pcie3.0 * 8

不设置NCCL_IB_DISABLE=1时本机信息如下:

<system version="1"><cpu numaid="1" affinity="ffff,fffff000,000000ff,fffffff0,00000000" arch="x86_64" vendor="GenuineIntel" familyid="6" modelid="106"><pci busid="0000:ca:00.0" class="0x060400" vendor="0x11f8" device="0x4000" subsystem_vendor="0x11f8" subsystem_device="0xbeef" link_speed="16.0 GT/s PCIe" link_width="16"><pci busid="0000:cd:00.0" class="0x030000" vendor="0x10de" device="0x2684" subsystem_vendor="0x7377" subsystem_device="0x0000" link_speed="16.0 GT/s PCIe" link_width="16"><gpu dev="0" sm="89" rank="0" gdr="0"/></pci><pci busid="0000:cf:00.0" class="0x030000" vendor="0x10de" device="0x2684" subsystem_vendor="0x7377" subsystem_device="0x0000" link_speed="16.0 GT/s PCIe" link_width="16"><gpu dev="1" sm="89" rank="1" gdr="0"/></pci></pci><pci busid="0000:b1:00.0" class="0x020000" vendor="0x15b3" device="0x1017" subsystem_vendor="0x15b3" subsystem_device="0x0007" link_speed="8.0 GT/s PCIe" link_width="8"><nic><net name="mlx5_0" dev="0" speed="100000" port="1" latency="0.000000" guid="0x1a72240003ebc008" maxconn="131072" gdr="0"/></nic></pci></cpu>
</system>

对比之前的topo 删除了eno2,enf9f0np0等,取而代之的是mlx5_0,这是因为nccl会自动使用速度快的。

nvidia-smi topo -m

在这里插入图片描述

二、nccl-test对比分析

1. 相关环境变量

以下为nccl用户手册的介绍:

NCCL_SOCKET_IFNAME 变量指定用于通信的IP接口。
NCCL_IB_DISABLE 变量禁用NCCL使用的IB/RoCE传输。相反,NCCL将回退到使用IP套接字,默认值为0。

以下就是对这两个环境变量进行控制来做的对比分析

2. 不同情况的对比

  1. IB disable=1,指定eno2——>实际使用eno2进行socket通信。
    顺便,这里的算法带宽algbw就是总的数据量除以时间。这里最大0.12GB/s=0.12*8=0.96Gbps≈1Gbps,已经非常接近千兆以太网支持的最大带宽了。在这里插入图片描述
  2. IB disable=1,指定ens9f0np0——>实际使用ens9f0np0(100G网卡接口)进行socket通信。
    这里最大算法带宽1.97GB/s=1.97*8=15.76Gbps<100Gbps,距离100G仍有差距。
    在这里插入图片描述
  3. IB disable=1,不指定网卡——>结果和情况2相同
  4. IB disable=1,指定eno2——>实际使用mlx5_0进行RoCE通信。
    这里最大算法带宽5.81GB/s=5.81*8=46.48Gbps,已经接近100G的一半。
    4
  5. IB disable=1,指定ens9f0np0——>结果和情况4相同
  6. 不设置IB disable,不指定用于socket通信的网卡——>结果和情况4相同,使用mlx5_0 RoCE,最大算法带宽5.81GB/s=5.81*8=46.48Gbps,即默认情况下nccl会选择最优的情况,在这里插入图片描述

这里有一个疑问,因为这台机子的mellanox网卡连接的是Pcie 3.0 *8 ,根据这个issue
Why { “16 GT/s”,120 } paired in kvDictPciGen?#1206
nccl中的带宽最大应该为6GB/s,而5.81已经比较接近,那这里限制带宽的因素是pcie嘛?


3. 总结与分析

将以上6种情况整理成表格:

序号IB_disableSOCKET_IFNAME最大算法带宽实际情况
11eno20.12 GB/suse eno2(1G)
21ens9f0np01.97 GB/suse 100G网卡
31不指定网卡1.97 GB/suse 100G网卡
40eno25.81 GB/suse RoCE
50ens9f0np05.81 GB/suse RoCE
6不设置(默认为0)不指定网卡5.81 GB/suse RoCE
  • 根据表格1-3条,禁用ib的情况下,除非明确指定eno2(千兆以太网接口,最大1Gbps),否则会自动使用速度快的ens9f0np0(100G网卡接口),根据第一个xml文件,也可以看到两者有着100倍的差距。
<net name="eno2" dev="0" speed="1000"
<net name="ens9f0np0" dev="1" speed="100000" 
  • 根据表格4-6条,未明确禁用ib的情况下,无论指定哪一个socket ifname,结果都相同且是使用RoCE通信,这是因为nccl会自动使用带宽大的,即IB的优先级高于socket,在nccl info信息中也可以看到,nccl会先搜索ib设备,如果没找到或者用户显式禁用,才会回退到套接字,
  • 对应以上情况就是
    mlx_5(IB/RoCE) > ens9f0np0(socket) > eno2(socket)

http://www.ppmy.cn/embedded/20973.html

相关文章

(学习日记)2024.05.05:UCOSIII第五十九节:User文件夹函数概览(uCOS-III->Source文件夹)第五部分

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

opencv基础篇 ——(九)图像几何变换

图像几何变换是通过对图像的几何结构进行变换来改变图像的形状、大小、方向或者透视关系。常见的图像几何变换包括缩放、旋转、平移、仿射变换和透视变换等。下面对这些几何变换进行简要介绍&#xff1a; 矩阵的转置&#xff08;transpose &#xff09;&#xff1a; 对于图像来…

车载电子电器架构 —— 售后诊断开发

车载电子电器架构 —— 售后诊断开发 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

Redis(五) Redis锁

结合前四期 Redis(一) Redis简介(Redis(一) Redis简介-CSDN博客) Redis(二) 可编程性(Redis(二) 可编程性-CSDN博客) Redis(三) 事务与发布订阅(Redis(三) 事务与发布订阅-CSDN博客) Redis(四) 主从、哨兵、集群环境搭建(Redis(四) 主从、哨兵、集群环境搭建-CSDN博客) (本文代…

系统设计 --- E2E Test System

系统设计 --- E2E Test System 什么是E2EE2E Architecture Example 什么是E2E E2E&#xff08;端到端&#xff09;测试是一种软件测试方法&#xff0c;旨在模拟真实的用户场景&#xff0c;测试整个应用程序或系统的端到端功能和交互流程。E2E 测试涵盖了从用户界面到后端系统的…

【小迪安全2023】第57天:服务攻防-应用协议RsyncSSHRDPFTP漏洞批扫口令猜解

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

基于Promise + XHR 封装myAxios函数

在JavaScript中&#xff0c;你可以使用Promise和XMLHttpRequest&#xff08;XHR&#xff09;来封装一个名为myAxios的函数&#xff0c;用于执行HTTP请求。下面是一个简单的示例&#xff0c;它封装了GET和POST请求的基本功能&#xff1a; function myAxios(url, method GET, da…

加速博客体验:静态资源优化技巧大揭秘!

如今有许多人涉足博客写作&#xff0c;其中大多数正处于博客创作的旅程中。每位程序员都梦想拥有自己的服务器&#xff0c;理想情况下&#xff0c;服务器配置越高越好&#xff0c;价格越实惠越好。购买一台基础款服务器用于建立博客是一个不错的选择&#xff0c;因为并不需要处…