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

news2024/11/17 16:05:22

系列文章

第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              08c0eb030024721a
    mlx5_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
  • NCCL_IB_DISABLE

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.coloradmin.cn/o/1621468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ruoyi-nbcio-plus基于vue3的flowable收回任务后重新进行提交表单的处理

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

CUDA入门系列课程,从最基础着手

CUDA入门系列课程&#xff0c;从最基础着手&#xff0c;突出的就是一个字“细”&#xff01;&#xff01; github项目包含代码、博客、课件pdf下载地址&#xff1a;https://github.com/sangyc10/CUDA-code! 在这里插入图片描述 CUDA编程基础入门系列 https://github.com/sang…

Java冲突

本身 父类 接口(多) 如果出现同样名字的方法,就会出现冲突 * 情况描述1: * 当一个类,继承了父类,实现了某接口,父类中的成员方法和接口中的方法重名 * 解决方法: * 子类就近选择父类成员方法 亲爹优先原则 * *使用格式: * 父类:super.方法名 * 父接口:父接口名.super.方…

指针学习总结

当指针本身定义的类型不同十&#xff0c;指向的一次性取值长度也不同 数组元素的指针 数组存放字符串 数组存放字符串时存放在栈区&#xff0c;sizeof(str1) 128字节 字符指针指向字符串 str2此时存放的是h的地址&#xff0c;因此sizeof(str2) 4字节或者8字节 并且文字常量…

快速回复app是什么样

在电商领域&#xff0c;掌握一些必备的软件工具是提高工作效率、优化运营流程以及提升用户体验的关键。本文将为您介绍做电商必备的几个软件&#xff0c;帮助您更好地开展电商业务。 ​ 快速回复APP&#xff1a;重新定义沟通效率 在快节奏的现代社会中&#xff0c;人们对于沟通…

Python实现“黑猫投诉平台,舆论监控系统”

黑猫投诉平台&#xff0c;舆论监控系统 BuzzMonitor https://github.com/nangongchengfeng/BuzzMonitor.git 简介 "黑猫投诉"舆论监控系统是一款专为快速识别和响应网络投诉而设计的应用&#xff0c;旨在帮助企业或机构第一时间掌握公众意见和反馈。通过实时监控网…

C++:运算符重载和“const”成员

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;运算符重载》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 赋值运算符重载1. 运算符重载2.赋值运算符重载第一个点第二个点&…

C++感受5-HelloWorld 函数版

借助 Hello (std::string_view XXX) 函数&#xff0c;快速向你心目中的女神问好。 视频 ffls08-HelloWorld-函数版 函数简述 函数用于封装程序中需要反复执行的事情。事情每一次执行时&#xff0c;所需要的初始数据的变化&#xff0c;由函数参数体现。 定义函数时所写的参数&…

小孩子不懂事,写着玩的

目录 Web攻防 特有漏洞 ASP安全 ASPX&#xff08;.NET&#xff09;安全 PHP安全 JavaWeb安全 JS&#xff0c;Node.js安全 Java安全 Python安全 通用漏洞 SQL注入 MySQL-root高权限读写注入 PostgreSQL-高权限读写注入 MSSQL-sa高权限读写执行注入 SQL注入体系 o…

虹科Pico汽车示波器 | 免拆诊断案例 | 2006 款林肯领航员车发动机怠速抖动

故障现象 一辆2006款林肯领航员车&#xff0c;搭载5.4 L发动机&#xff0c;累计行驶里程约为26万km。该车因发动机怠速抖动故障进厂维修&#xff0c;维修人员更换了火花塞、点火线圈及凸轮轴位置传感器&#xff0c;清洗了积炭和喷油器&#xff0c;故障依旧&#xff0c;于是向笔…

Linux系统硬盘读写慢,如何排查

若服务器硬盘读写慢&#xff0c;导致处理性能降低&#xff0c;用户响应慢&#xff08;例如&#xff1a;ssh登录操作文件&#xff0c;处理很慢说明磁盘很慢&#xff09; 1.查看硬盘是否繁忙 top 若值比较大&#xff0c;说明当前硬盘比较繁忙&#xff0c;有大量读写操作&#x…

PO框架【自动化测试】

对象&#xff1a;Tpshop商城 需求&#xff1a;更换头像 操作步骤&#xff1a; 个人信息–头像–上传图片–图片确认–确认保存 核心代码&#xff1a; # 进入frame框架[不熟] driver.switch_to.frame(driver.find_element_by_xpath(//*[id"layui-layer-iframe1"]))…

链式存储的特点与设计由来

简介 案例引入 相关术语 两种结构的区别与实现 注&#xff1a; 特点

迪拜Token2049展会圆满落幕,MVP成唯一MEMECOIN项目,闪耀全场!

近日&#xff0c;据多家媒体报道&#xff0c;于全球财富聚集地迪拜举行的全球性大型区块链会议TOKEN2049圆满落幕。来自全球的5000多家公司和100多个国家10000名参与者共同参会&#xff0c;讨论未来30年至50年关于区块链行业的宏大未来。 新晋MEMECOIN项目MAGA VP&#xff08;…

希捷HDD最新财报:销售同比下降11%,环比增长6%,4Q24前景看好

Seagate Technology Holdings plc公布了截至2024年3月29日的第三财季财务业绩。 “随着云需求改善、我们强大的运营纪律和价格执行&#xff0c;希捷3月季度的营收增长了6%&#xff0c;非GAAP每股收益较上一季度翻了一番多。这种组合为我们市场复苏时回归目标利润率奠定了基础。…

【C++】string常用函数总结及其模拟实现

目录 一、String的构造 二、String的大小和容量 三、String的字符串比较 四、string的访问 五、String的字符插入 六、string拼接字符串 七、string的删除 八、string的查找 九、string的分割 模拟实现 一、String的构造 string()&#xff1a;生成空字符串&#xff1…

Llama3 中文通用 Agent 微调模型来啦!(附手把手微调实战教程)

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 基于大家…

文本语音互相转换系统设计

title: 文本语音互相转换系统设计 date: 2024/4/24 21:26:15 updated: 2024/4/24 21:26:15 tags: 需求分析模块化设计性能优化系统安全智能化跨平台区块链 第一部分&#xff1a;导论 第一章&#xff1a;背景与意义 文本语音互相转换系统的定义与作用 文本语音互相转换系统是…

js进行数据移除性能比较(splice,map)

当使用 splice() 方法处理大量数据时&#xff0c;确实会遇到性能问题&#xff0c;因为它涉及到移动数组中的元素&#xff0c;导致操作的时间复杂度为 O(n)。对于大量数据&#xff0c;频繁的插入和删除可能会导致性能下降。 1、设置数组数据为10000&#xff0c;使用splice移除数…

linux——yum工具详解

yum是linux中自动解决软件包依赖关系的管理器 同时&#xff0c;yum也是一个rpm软件 这里使用yum install nginx安装nginx