【教程】简介nccl-test工具

news2024/11/23 10:26:32

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn]

如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~

GitHub - NVIDIA/nccl-tests: NCCL TestsNCCL Tests. Contribute to NVIDIA/nccl-tests development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/NVIDIA/nccl-tests

工具安装

1、对于cuda、cudnn、nccl的环境安装可以看:

【教程】保姆级安装NVIDIA CUDA、CUDNN、NCCL环境教程文章浏览阅读1.2w次,点赞2次,收藏8次。非常全面且详细!_nvidia-driver-550 : 依赖: nvidia-dkms-550 (<= 550.54.14-1) 但是它将不会被安https://blog.csdn.net/sxf1061700625/article/details/127705588

2、然后编译工具,编译的结果在build文件夹里:

cd nccl-test
make

工具介绍

NCCL 测试性能指标解释

        NCCL(NVIDIA 集体通信库)测试提供了集体操作的重要性能指标,对于优化和理解多 GPU 通信非常重要。以下是这些指标的详细解释及其含义。

1. 时间 (Time)

  • 定义:完成集体操作所需的时间。
  • 重要性
    • 小规模:用于测量与操作相关的常量开销(或延迟)。
    • 大规模:时间与大小成线性关系,因为时间大约等于开销 + (大小 / 带宽)。对于大规模操作,带宽指标更有意义。

2. 带宽 (Bandwidth)

带宽表示操作期间的数据传输速率,分为两种类型:

a. 算法带宽 (Algorithm Bandwidth)
  • 公式:algbw=S/t​
    • 其中 S 是数据大小,ttt 是时间。
  • 用途
    • 用于计算任何大规模操作所需的时间,通过将操作大小除以算法带宽。
    • 反映操作本身的效率。
    • 算法带宽使用最常用的带宽公式:size (S) / time (t)。只需用操作的大小除以算法带宽,就能计算出任何大型操作需要多少时间。
b. 总线带宽 (Bus Bandwidth)
  • 定义:反映 GPU 间通信速度,与硬件的峰值带宽相比,不受节点数量影响。
  • 重要性
    • 提供一个反映硬件使用效率的度量。
    • 对于集体操作,算法带宽会随节点数量变化,而总线带宽则提供一个更一致的硬件能力对比。
    • 虽然算法带宽对发送/接收等点对点操作很有意义,但它并不总是有助于测量集体操作的速度,因为理论峰值算法带宽并不等同于硬件峰值带宽,通常取决于ranks。大多数基准仅提供时间测量,这对于大型系统来说很难解释。其他一些基准也提供了算法带宽,但根据ranks的不同,带宽也不同(随着ranks的增加而降低)。为了提供一个能反映硬件最佳使用情况的数字,NCCL 测试引入了 "总线带宽 "的概念(测试输出中的 "busbw "列)。这个数字是通过对算法带宽应用一个公式得出的,以反映 GPU 之间的通信速度。使用该总线带宽,我们可以将其与硬件峰值带宽进行比较,与使用的ranks无关。该公式取决于集体操作

集合操作详解

全规约 (AllReduce)

操作:对所有节点上的输入求和并将结果分发到所有节点。注意:这与所使用的算法(环形、树形或其他)无关,只要它们使用点对点操作(发送/接收)即可。

示例:o_0 = o_1 = o_2 = ... = o_{n-1} = i_0 + i_1 + i_2 + ... + i_{n-1}

        环将按照环的顺序进行操作:i_0 + i_1 + ...+ i_{n-1} -> o_{n-1} -> o_0 -> o_1 -> ... -> o_{n-2}

        树状结构可以分层处理 :(((((i_{n-1} + i_{n-2}) + (i_{n-3} + i_{n-4}))+ ...+ (i_1 + i_0)))))-> o_0 -> (o_{n/2} -> (o_{3n/4} ...))

        在所有情况下,我们需要对每个元素进行 n-1 次添加和 n 次赋值。由于每一步都在不同的秩上,只有潜在的一步除外(最后一个输入和第一个输出),因此我们需要 2(n-1) 次数据传输(x 个元素)才能执行一次 allReduce 操作。

        考虑到每个秩都有通向 B 外部世界的带宽,执行 S 个元素的 allReduce 操作的时间充其量为 :t = (S*2*(n-1)) / (n*B)

        事实上,我们有 S 个元素,每个元素有 2*(n-1) 个操作,有 n 个带宽为 B 的链路来执行这些操作。对等式重新排序后,我们发现 t = (S/B) * (2*(n-1)/n)

        因此,要获得可以与硬件峰值带宽进行比较的 AllReduce 带宽测量值,我们需要计算 :B = S/t * (2*(n-1)/n) = algbw * (2*(n-1)/n)

./all_reduce_perf

USAGE: all_reduce_perf
        [-t,--nthreads <num threads>]
        [-g,--ngpus <gpus per thread>]
        [-b,--minbytes <min size in bytes>]
        [-e,--maxbytes <max size in bytes>]
        [-i,--stepbytes <increment size>]
        [-f,--stepfactor <increment factor>]
        [-n,--iters <iteration count>]
        [-m,--agg_iters <aggregated iteration count>]
        [-w,--warmup_iters <warmup iteration count>]
        [-p,--parallel_init <0/1>]
        [-c,--check <check iteration count>]
        [-o,--op <sum/prod/min/max/avg/mulsum/all>]
        [-d,--datatype <nccltype/all>]
        [-r,--root <root>]
        [-z,--blocking <0/1>]
        [-y,--stream_null <0/1>]
        [-T,--timeout <time in seconds>]
        [-G,--cudagraph <num graph launches>]
        [-C,--report_cputime <0/1>]
        [-a,--average <0/1/2/3> report average iteration time <0=RANK0/1=AVG/2=MIN/3=MAX>]
        [-R,--local_register <1/0> enable local buffer registration on send/recv buffers (default: disable)]
        [-h,--help]

规约散播 (ReduceScatter)

  • 操作:对所有节点上的输入求和并将部分结果分发到每个节点。
    • 示例:oK=i0+i1+i2+...+in−1o_K = i_0 + i_1 + i_2 + ... + i_{n-1}oK​=i0​+i1​+i2​+...+in−1​
  • 总线带宽计算
    • 时间公式:t = S*(n-1) / (B*n)
    • 带宽公式:B = S/t * (n-1)/n = algbw * (n-1)/n
./reduce_scatter_perf

USAGE: reduce_scatter_perf
        [-t,--nthreads <num threads>]
        [-g,--ngpus <gpus per thread>]
        [-b,--minbytes <min size in bytes>]
        [-e,--maxbytes <max size in bytes>]
        [-i,--stepbytes <increment size>]
        [-f,--stepfactor <increment factor>]
        [-n,--iters <iteration count>]
        [-m,--agg_iters <aggregated iteration count>]
        [-w,--warmup_iters <warmup iteration count>]
        [-p,--parallel_init <0/1>]
        [-c,--check <check iteration count>]
        [-o,--op <sum/prod/min/max/avg/mulsum/all>]
        [-d,--datatype <nccltype/all>]
        [-r,--root <root>]
        [-z,--blocking <0/1>]
        [-y,--stream_null <0/1>]
        [-T,--timeout <time in seconds>]
        [-G,--cudagraph <num graph launches>]
        [-C,--report_cputime <0/1>]
        [-a,--average <0/1/2/3> report average iteration time <0=RANK0/1=AVG/2=MIN/3=MAX>]
        [-R,--local_register <1/0> enable local buffer registration on send/recv buffers (default: disable)]
        [-h,--help]

全收集 (AllGather)

  • 操作:从所有节点收集输入并将收集结果分发到所有节点。
    • 示例:o0=o1=o2=...=on−1=iKo_0 = o_1 = o_2 = ... = o_{n-1} = i_Ko0​=o1​=o2​=...=on−1​=iK​
  • 总线带宽计算
    • 时间公式:t = S*(n-1) / (B*n)
    • 带宽公式:B = S/t * (n-1)/n = algbw * (n-1)/n
./all_gather_perf

USAGE: all_gather_perf
        [-t,--nthreads <num threads>]
        [-g,--ngpus <gpus per thread>]
        [-b,--minbytes <min size in bytes>]
        [-e,--maxbytes <max size in bytes>]
        [-i,--stepbytes <increment size>]
        [-f,--stepfactor <increment factor>]
        [-n,--iters <iteration count>]
        [-m,--agg_iters <aggregated iteration count>]
        [-w,--warmup_iters <warmup iteration count>]
        [-p,--parallel_init <0/1>]
        [-c,--check <check iteration count>]
        [-o,--op <sum/prod/min/max/avg/mulsum/all>]
        [-d,--datatype <nccltype/all>]
        [-r,--root <root>]
        [-z,--blocking <0/1>]
        [-y,--stream_null <0/1>]
        [-T,--timeout <time in seconds>]
        [-G,--cudagraph <num graph launches>]
        [-C,--report_cputime <0/1>]
        [-a,--average <0/1/2/3> report average iteration time <0=RANK0/1=AVG/2=MIN/3=MAX>]
        [-R,--local_register <1/0> enable local buffer registration on send/recv buffers (default: disable)]
        [-h,--help]

广播 (Broadcast)

  • 操作:从一个根节点向所有其他节点发送数据。
    • 示例:o0=o1=o2=...=on−1=iRo_0 = o_1 = o_2 = ... = o_{n-1} = i_Ro0​=o1​=o2​=...=on−1​=iR​
  • 总线带宽计算
    • 时间公式:t = S/B
    • 带宽公式:B = S/t
./broadcast_perf

USAGE: broadcast_perf
        [-t,--nthreads <num threads>]
        [-g,--ngpus <gpus per thread>]
        [-b,--minbytes <min size in bytes>]
        [-e,--maxbytes <max size in bytes>]
        [-i,--stepbytes <increment size>]
        [-f,--stepfactor <increment factor>]
        [-n,--iters <iteration count>]
        [-m,--agg_iters <aggregated iteration count>]
        [-w,--warmup_iters <warmup iteration count>]
        [-p,--parallel_init <0/1>]
        [-c,--check <check iteration count>]
        [-o,--op <sum/prod/min/max/avg/mulsum/all>]
        [-d,--datatype <nccltype/all>]
        [-r,--root <root>]
        [-z,--blocking <0/1>]
        [-y,--stream_null <0/1>]
        [-T,--timeout <time in seconds>]
        [-G,--cudagraph <num graph launches>]
        [-C,--report_cputime <0/1>]
        [-a,--average <0/1/2/3> report average iteration time <0=RANK0/1=AVG/2=MIN/3=MAX>]
        [-R,--local_register <1/0> enable local buffer registration on send/recv buffers (default: disable)]
        [-h,--help]

规约 (Reduce)

  • 操作:对所有节点上的输入求和并将结果发送到一个根节点。
    • 示例:oR=i0+i1+i2+...+in−1o_R = i_0 + i_1 + i_2 + ... + i_{n-1}oR​=i0​+i1​+i2​+...+in−1​
  • 总线带宽计算
    • 时间公式:t = S/B
    • 带宽公式:B = S/t
./reduce_perf 

USAGE: reduce_perf
        [-t,--nthreads <num threads>]
        [-g,--ngpus <gpus per thread>]
        [-b,--minbytes <min size in bytes>]
        [-e,--maxbytes <max size in bytes>]
        [-i,--stepbytes <increment size>]
        [-f,--stepfactor <increment factor>]
        [-n,--iters <iteration count>]
        [-m,--agg_iters <aggregated iteration count>]
        [-w,--warmup_iters <warmup iteration count>]
        [-p,--parallel_init <0/1>]
        [-c,--check <check iteration count>]
        [-o,--op <sum/prod/min/max/avg/mulsum/all>]
        [-d,--datatype <nccltype/all>]
        [-r,--root <root>]
        [-z,--blocking <0/1>]
        [-y,--stream_null <0/1>]
        [-T,--timeout <time in seconds>]
        [-G,--cudagraph <num graph launches>]
        [-C,--report_cputime <0/1>]
        [-a,--average <0/1/2/3> report average iteration time <0=RANK0/1=AVG/2=MIN/3=MAX>]
        [-R,--local_register <1/0> enable local buffer registration on send/recv buffers (default: disable)]
        [-h,--help]

总结

为了在不同节点数量 nnn 上归一化总线带宽,我们对算法带宽应用一个修正因子:

  • 全规约:2×(n−1)n2 \times \frac{(n-1)}{n}2×n(n−1)​
  • 规约散播:(n−1)n\frac{(n-1)}{n}n(n−1)​
  • 全收集:(n−1)n\frac{(n-1)}{n}n(n−1)​
  • 广播:1
  • 规约:1

总线带宽反映了硬件瓶颈的速度:NVLink、PCIe、QPI 或网络。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1871495.html

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

相关文章

Unity3D 物体的运动

运动方式1 修改 position / localPosition &#xff0c;可以让物体运动 例如&#xff0c; Vector3 pos this.transform.localPosition; pos.z distance; this.transform.localPosition pos; 此时&#xff0c;小车向Z 方向运动 具体代码如下 using System.Collection…

[C#]基于opencvsharp实现15关键点人体姿态估计

数据集 正确选择数据集以对结果产生适当影响也是非常必要的。在此姿势检测中&#xff0c;模型在两个不同的数据集即COCO关键点数据集和MPII人类姿势数据集上进行了预训练。 1. COCO&#xff1a;COCO关键点数据集是一个多人2D姿势估计数据集&#xff0c;其中包含从Flickr收集的…

matlab绘制二维曲线,如何设置线型、颜色、标记点类型、如何设置坐标轴、matlab 图表标注、在图中标记想要的点

matlab绘制二维曲线&#xff0c;如何设置线型、颜色、标记点类型、如何设置坐标轴、matlab 图表如何标注、如何在图中标记想要的点 matlab绘制二维曲线&#xff0c;如何在图中标记想要的点。。。如何设置线型、颜色、标记点类型。。。如何设置坐标轴。。。matlab 图表标注操作…

头歌资源库(18)接龙序列

一、 问题描述 二、算法思想 首先&#xff0c;我们需要判断一个数列是否是接龙数列。可以通过遍历数列的每一个元素&#xff0c;判断该元素的首位数字是否等于前一个元素的末位数字。如果所有元素都满足条件&#xff0c;则该数列是接龙数列。 接下来&#xff0c;我们需要计算…

Java | Leetcode Java题解之第201题数字范围按位与

题目&#xff1a; 题解&#xff1a; class Solution {public int rangeBitwiseAnd(int m, int n) {while (m < n) {// 抹去最右边的 1n n & (n - 1);}return n;} }

Java | Leetcode Java题解之第202题快乐数

题目&#xff1a; 题解&#xff1a; class Solution {private static Set<Integer> cycleMembers new HashSet<>(Arrays.asList(4, 16, 37, 58, 89, 145, 42, 20));public int getNext(int n) {int totalSum 0;while (n > 0) {int d n % 10;n n / 10;totalS…

在eclipse中导入idea项目步骤

一、可以把其它项目的.project&#xff0c; .classpath文件拷贝过来&#xff0c;修改相应的地方则可。 1、.project文件只需要修改<name>xxx</name>这个项目名称则可 2、.classpath文件通常不用改&#xff0c; 二、右击 项目名 >选择“Properties”>选择 Re…

【2024-热-办公软件】ONLYOFFICE8.1版本桌面编辑器测评

在今日快速发展的数字化办公环境中&#xff0c;选择一个功能全面且高效的办公软件是至关重要的。最近&#xff0c;我有幸体验了ONLYOFFICE 8.1版本的桌面编辑器&#xff0c;这款软件不仅提供了强大的编辑功能&#xff0c;还拥有众多改进&#xff0c;让办公更加流畅和高效。在本…

C++ | Leetcode C++题解之第202题快乐数

题目&#xff1a; 题解&#xff1a; class Solution { public:int ProductSum(int n){int sum 0;while(n){int temp n % 10;sum temp*temp;n / 10;}return sum;}bool isHappy(int n) {int slow n,fast n;// 快慢指针&#xff0c;找环的相遇位置do{slow ProductSum(slow)…

58.鸿蒙系统app(HarmonyOS)(ArkUI)更改应用程序图标

替换xx\MyApplication4.30\entry\src\main\resources\base\media目录下icon.png文件 54.HarmonyOS鸿蒙系统 App(ArkTS)tcp socket套接字网络连接收发测试_鸿蒙socket连接测试-CSDN博客

Vuetify3:​快捷回到顶部

在Vuetify 3中&#xff0c;要实现回到顶部&#xff0c;我们需要创建悬浮按钮&#xff0c;如下&#xff1a; <template><v-list><div class"position-fixed right-0 bottom-0" style"top:50%;"><v-list-item ><v-btn icon"…

第十节 动态面板实现推动和拉动效果

在原型设计中我们经常会遇到元件使用显示更多或者收起效果&#xff0c;下面以面板元件推动与拉动效果做案件说明。 一、设置原有内容 我这里添加一个表格内容&#xff0c;添加“显示更多”文本超链接 二、设置在更多显示面板内容 添加一个动态面板&#xff0c;设置有内容、无…

Linux运维:MySQL数据库(1)

1.信息与数据&#xff1a; 数据是信息的载体&#xff0c;信息是数据的内涵。数据库就是存储数据的仓库&#xff0c;并长期存储在计算机磁盘中&#xff0c;可由多个用户和应用程序共享的数据集合&#xff0c;就是数据库。 2.数据库中的数据的特点&#xff1a; 2.1.数据是按照某…

【Docker】创建 swarm 集群

目录 1. 更改防火墙设置 2. 安装 Docker 组件 3. 启动 Docker 服务&#xff0c;并检查服务状态。 4. 修改配置文件&#xff0c;监听同一端口号。 5. 下载 Swarm 组件 6. 创建集群&#xff0c;加入节点 7. 启动集群 8. 查询集群节点信息 9. 查询集群具体信息 10. 查询…

vscode 安装Vue插件

打开扩展面板 --> 点击左侧的扩展图标&#xff0c;或者按下快捷键 Ctrl Shift X 搜索插件,在搜索框中输入 Vue vue-helper 用来快捷提示&#xff0c;如果使用elementui的话&#xff0c;插件不会自动提示&#xff0c;安装了它&#xff0c;组件、属性都会有提示了 Vetur V…

live555的核心数据结构值之闭环双向链表

live555是采用单进程,单线程的服务器,能够同时支持多个客户端连接,并且有条不紊的进行媒体流的调度,很大一部分原因在于对数据结构的巧妙应用。 下面介绍live555核心的数据结构:闭环双向链表 什么是闭环双向链表? 描述: 一个节点保存有前一个节点的地址和后一个节点的…

Spring自带的持久层模板类:JdbcTemplate+Spring框架声明式事务管理实战

模板技术 Spring框架中提供了很多模板类来简化编程&#xff0c;使用模板类编写程序会变的简单 持久层模板JdbcTemplate JdbcTemplate是什么 JDBCTemplate是Spring Framework中的一个核心类&#xff0c;用于简化JDBC&#xff08;Java数据库连接&#xff09;代码的编写。它提供…

4A的「A」会变成AI的「A」吗?

戛纳国际创意节上&#xff0c;广告集团WPP的全球CEO Mark Read 和英国CEO Karen Blackett 解释了WPP如何应对AIGC所带来的「威胁」。同时&#xff0c;Mark Read 与Elon Musk对话&#xff0c;讨论「技术创新的变革力量&#xff0c;人工智能如何重塑创造力、商业和社会&#xff0…

基于uni-app与图鸟UI的移动应用模板构建研究

摘要 随着移动互联网技术的迅猛发展&#xff0c;移动端应用已成为企业展示形象、提供服务的重要窗口。本文基于uni-app框架和图鸟UI设计&#xff0c;深入探讨了如何高效构建覆盖多个领域的移动端应用模板。通过对商城、办公、投票、生活服务等多种类型模板的详细介绍&#xff…

使用uniapp.pageScrollTo方法进行页面滚动

先看看是不是你想要的&#xff1a; 需求&#xff1a; 有个填写数据的单子在提交的时候&#xff0c;会对必填项做校验&#xff0c;如果必填项没有数据的话&#xff0c;必填项校验生效给出提示&#xff0c;并且页面滚动到第一个需要填写数据的地方。 开发&#xff1a; 因为这个…