【分布式】入门级NCCL多机并行实践 - 02

# 背景知识

大模型和分布式训练对数据的吞吐量以及并行度都有很高的要求,NCCL就是在这个背景下诞生的。

如果你是一个只会写写Python,调用PyTorch和Horovod的算法萌新,可能对于分布式底层的东西不太了解,在下岗热潮中被主管逼着转变成算子或者通讯库的搬砖工,就会像我一样两眼蒙蔽。因此本文只对自己踩到的坑做一个整理,如果有说错的地方,那就是我说错了。

1. 从PyTorch开始理解结构

以PyTorch为例,其中spmd接口下的相关定义是用于处理分布式的。但主要是处理单机多CPU情况,因此我们今天只考虑多机(多节点)情况。

SPMD(Single Program/Multiple Data),即单程序多份数据进行任务并行。SPMD的本质是对问题进行域分解,它将一个大的问题区域分解成若干个较小的问题区域,然后对其并行求解。

其中用于实现多节点分布式的组件有以下三个:

  • Distributed Data-Parallel Training (DDP)
  • RPC-Based Distributed Training (RPC)
  • Collective Communication (c10d)

分布式结构

从上图可知,1.6版本左右的PyTorch调用结构如下,最后在ProcessGroup.hpp可以找到对NCCL、Gloo和MPI的调用。

而这些蓝色的部分就是基本的分布式通讯库,他们负责实现通讯和一部分计算功能。

2. 通讯方式

已知显卡与主板通过PCIE相连,任何数据都要从PCIE和CPU穿过,这么做的效率肯定是很低的。

因此在GPUDirect技术出现以后,我们可以把GPU通信分为GPU控制的GPU通信和CPU控制的GPU通信两种。感兴趣相关的细节可以通过此文查看:【研究综述】浅谈GPU通信和PCIe P2P DMA 

我们知道通信技术有很多,例如DMA,P2P。DMA和P2P都是一种能力,而非具体的协议。

2.1 DMA & P2P

DMA(Direct Memory Access,直接内存访问),允许在计算机主板上的设备直接把数据发送到内存中去,数据搬运不需要CPU的参与。

传统内存访问需要通过CPU进行数据copy来移动数据,通过CPU将内存中的Buffer1移动到Buffer2中。DMA模式:可以同DMA Engine之间通过硬件将数据从Buffer1移动到Buffer2,而不需要操作系统CPU的参与,大大降低了CPU Copy的开销。

通常,我们也将主机称为节点。

第二代GPUDirect技术被称作GPUDirect P2P(Peer to Peer),重点解决的是节点内GPU通信问题。两个GPU可以通过PCIe P2P直接进行数据搬移,避免了主机内存和CPU的参与。

那么一台机器中的数据搬运是DMA,多台主机的DMA如何实现呢?这就出现了RDMA这一协议。

2.2 RDMA

RDMA( Remote Direct Memory Access )意为远程直接地址访问,通过RDMA,本端节点可以“直接”访问远端节点的内存。所谓直接,指的是可以像访问本地内存一样,绕过传统以太网复杂的TCP/IP网络协议栈读写远端内存,而这个过程对端是不感知的,而且这个读写过程的大部分工作是由硬件而不是软件完成的。

利用机器本身的DMA能力,以及网卡等其他硬件实现的远程DMA。这就和RPC远程过程调用有类似之处。

 RDMA是一种host-offload, host-bypass技术,允许应用程序(包括存储)在它们的内存空间之间直接做数据传输。具有RDMA引擎的以太网卡(RNIC)--而不是host--负责管理源和目标之间的可靠连接。

为了支持RDMA实现,有以下三种网络协议:

InfiniBand(IB)从一开始就支持RDMA的新一代网络协议。由于这是一种新的网络技术,因此需要支持该技术的网卡和交换机。
RDMA过融合以太网(RoCE)即RDMA over Ethernet, 允许通过以太网执行RDMA的网络协议。这允许在标准以太网基础架构(交换机)上使用RDMA,只不过网卡必须是支持RoCE的特殊的NIC。
互联网广域RDMA协议(iWARP)即RDMA over TCP, 允许通过TCP执行RDMA的网络协议。这允许在标准以太网基础架构(交换机)上使用RDMA,只不过网卡要求是支持iWARP(如果使用CPU offload的话)的NIC。否则,所有iWARP栈都可以在软件中实现,但是失去了大部分的RDMA性能优势。

IB是最简单的方式,其次是RoCE,当然本文不做赘述,有大篇讲的好的博客,甚至直接看论文和文档也是可以的。NCCL已经支持这些协议。 

2.3 MPI

MPI有多种实现方式,例如OpenMPI,MPICH。

MPI 全名叫 Message Passing Interface,即信息传递接口,作用是可以通过 MPI 可以在不同进程间传递消息,从而可以并行地处理任务,即进行并行计算。NCCL中利用MPI来处理多机通讯的部分。

直接下载:

#apt安装mpi
sudo apt-get update
sudo apt install openmpi-bin openmpi-doc libopenmpi-dev
#验证是否安装成功
mpirun --version

自己编译可参考前文:分布式学习 - MPICH编译与实践_mpich 编译指定 mpich cc_canmoumou的博客-CSDN博客

3. NCCL

NCCL在单机多卡环境下的编译与运行参考我的前文:【分布式】NCCL部署与测试 - 01_canmoumou的博客-CSDN博客

 NCCL本身具备了基本的通信协议支持、环路算法、原语操作等等。

由于数据运输和计算都是在GPU上完成,需要launch kernel,因此阅读源码前要具备基本的CUDA知识。

3.1 NCCL 多机多卡实践

 环境配置

1. 两台多卡服务器,需要配置好无密钥登陆(ssh),以及NFS共享目录。NFS挂载方式如果我有空另外再写。

2. 检查IB设备及性能,确定有一块或多块IB网卡,安装nv_peer_mem驱动

3. 配置BIOS:配置IOMMU等

如何检查:

# check system physical memory size
sudo dmidecode -t memory | grep Size: | grep -v "No Module Installed" | awk '{sum+=$2}END{print sum}'sudo cat /var/log/dmesg | grep -e "AMD-Vi: Interrupt remapping enabled" -e "IOMMU enabled"

若发现IOMMU被disabled,请到BIOS界面更改:

选择enable Intel VT for Directed I/O (VT-d)选项

或者enable IOMMU选项

4. 打开CPU高性能模式,并配置网络

查看IB网络是否正常

ibstat

CA 'mlx5_0'

        CA type: MT4123

        Number of ports: 1

        Firmware version: 20.31.1014

        Hardware version: 0

        Node GUID: 0xb83fd203005682a2

        System image GUID: 0xb83fd203005682a2

        Port 1:

                State: Active

                Physical state: LinkUp

                Rate: 200

                Base lid: 12

                LMC: 0

                SM lid: 5

                Capability mask: 0x2651e848

                Port GUID: 0xb83fd203005682a2

                Link layer: InfiniBand

5. 下载其他依赖,下载NCCL源码并保证单机单卡可以运行,下载mpich。

 编译运行

我们通过NCCL-TEST运行程序,其中NCCL原仓库代码不需要重新编译,只有NCCL-TEST需要重新编译,必须增添MPI_HOME,并设置MPI=1 

# 单机编译nccl-test:
make CUDA_HOME=/path/to/cuda NCCL_HOME=/path/to/nccl# 多机编译
make CUDA_HOME=/path/to/cuda NCCL_HOME=/path/to/nccl MPI_HOME=/path/to/mpi MPI=1 

将编译好的build文件放到NFS目录下,这样两台机器都可以在共享目录看到此文件。

再在共享目录外设置算法拓扑(topo.txt)和图结构(graph.txt),并添加mpi_hosts文件。mpi_hosts文件内放两张机器的ip地址:

# MPI CLUSTERS
X.X.X.X manager slots=1
X.X.X.X worker1 slots=1

运行:

mpirun -hostfile mpi_hosts \

       -np 2 \

       --allow-run-as-root \

       -x LD_LIBRARY_PATH=<CUDA_LIB>:<NCCL_HOME>/lib \

       -x NCCL_IB_HCA=<IB net name>:1 \

       -x NCCL_DEBUG=TRACE \

       -x NCCL_PROTOS=2 \

       -x NCCL_TOPO_DUMP_FILE=./topo.txt \

       -x NCCL_GRAPH_DUMP_FILE=./graph.txt \

       <nfs_share_path>/mccl-tests/all_reduce_perf -b 1M -e 128M -f 2 -g 1 -t 1

请注意,-np的值为mpi_hosts内各个slots之和。

使用mpich运行的时候,以单机的方式运行,也就是单机四卡是-g 4,多机四卡的参数也是-g 4.

 # 总结

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

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

相关文章

Java并发面试题:(七)ThreadLocal原理和内存泄漏

ThreadLocal是什么&#xff1f; ThreadLocal是线程本地存储机制&#xff0c;可以将数据缓存在线程内部。ThreadLocal存储的变量在线程内共享的&#xff0c;在线程间又是隔离的。 ThreadLocal实现原理&#xff1f; ThreadLocal的底层是ThreadLocalMap&#xff0c;每个Thread都…

Open3D(C++) 最小二乘拟合平面(拉格朗日乘子法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。 一、算法原理 设拟合出的平面方程为: a x + b y + c

FutureTask配合Thread实现处理有返回结果的源码、逻辑与架构分析

文章目录 1.介绍2.使用示例3.执行过程描述4.整体的关系5.涉及到的核心源码&#xff08;只提取了关键代码&#xff09;5.1 Callable5.2 RunnableFuture5.3 FutureTask5.4 Thread 1.介绍 FutureTask 能够接收 Callable 类型的参数&#xff0c;用来处理有返回结果的情况。 2.使用…

互联网摸鱼日报(2023-10-18)

互联网摸鱼日报(2023-10-18) 36氪新闻 最前线 | 耀宁品牌焕新&#xff1a;推出“S矩阵”战略&#xff0c;押注固态电池 8家消费公司拿到新钱&#xff0c;Manner咖啡门店破千&#xff0c;半数调研消费者预计收紧预算&#xff5c;创投大视野 发令枪响&#xff0c;百度已经冲出…

SpringCloud:自定义skywalking链路追踪

一、添加依赖&#xff1a; <dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.7.0</version></dependency><dependency><groupId>org.apache.sk…

深入浅出@Cacheable

Cacheable的使用详解&#xff0c;源码级别解析 在现代的应用程序中&#xff0c;缓存是提高性能和可扩展性的重要组成部分。Spring框架提供了Cacheable注解来轻松地将方法结果缓存起来&#xff0c;以便在后续调用中快速访问。本文将详细介绍Cacheable注解的使用方法&#xff0c…

Mac Intellij Idea get/set方法快捷键

Control Retrun(回车键) Command n 参考&#xff1a; Mac Intellij Idea get/set方法快捷键-CSDN博客

Android中使用Java操作List集合的方法合集,包括判读是否有重复元素等

1、判断是否有重复元素 List<String> mList new ArrayList<>();//将List转为Set&#xff0c;通过比较大小是否一样&#xff0c;判断是否有重复元素 Set<String> stringSet new HashSet<>(mList); boolean isHasRepeat false; if (mTipBeanList.siz…

Cornerstone for Mac:高效SVN管理的黄金标准

在当今的软件开发领域&#xff0c;版本控制系统是不可或缺的一部分。其中&#xff0c;Subversion&#xff08;SVN&#xff09;是一个广泛使用的版本控制系统&#xff0c;有助于团队协同工作&#xff0c;实现代码的版本管理和追踪。对于Mac用户来说&#xff0c;Cornerstone是一款…

代码随想录打卡第四十四天|● 01 二维背包问题 ●一维背包问题-滚动数组 ● 416. 分割等和子集

什么是01背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 01背包的模板 二维dp数组 dp数组的含义 dp[i][j]含义下标为【0-i】之间…

【Linux】进程概念与进程状态

文章目录 一、进程概念1.进程的概念2.进程的描述-PCB 二、进程相关的基本操作1.组织进程2.查看进程3.结束进程4.通过系统调用获取进程标示符5.通过系统调用创建进程-fork初识 三、进程状态1.普遍操作系统层面的进程状态2.Linux操作系统的进程状态 四、两种特殊的进程状态1.僵尸…

C++ 01.学习C++的意义-狄泰软件学院

一些历史 UNIX操作系统诞生之初是用汇编语言编写的随着UNIX系统的发展&#xff0c;汇编语言的开发效率成为瓶颈&#xff0c;所以需要一个新的语言替代汇编语言1971年通过对B语言改良&#xff0c;使其能直接产生机器代码&#xff0c;C语言诞生UNIX使用C语言重写&#xff0c;同时…

ESP32网络开发实例-Web显示传感器实时数据

Web显示传感器实时数据 文章目录 Web显示传感器实时数据1、软件准备2、硬件准备3、代码实现3.1 Web页面代码实现4.2 Web服务器代码实现本文将详细介绍如何使用ESP32在 Web 服务器上绘制传感器读数(温度、湿度和压力)。 ESP32 将托管一个网页,其中包含三个实时图表,每 30 秒…

华为OD 字符串消除(100分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…

Excel文件带有密码的只读模式,如何设置?

Excel带有密码的除了打开密码和工作表保护以外&#xff0c;其实还有一种可以设置密码的方法&#xff0c;今天给大家分享如何设置带有密码的只读模式。 打开excel文件&#xff0c;将文件进行【另存为】设置&#xff0c;然后停留在保存路径的界面中&#xff0c;我们点击下面的工…

《java 桌面软件开发》swing 以鼠标为中心放大缩小移动图片

swing 使用Graphic2D 绘制图片&#xff0c;要实现对图片进行缩放和自由拖动。 1.以鼠标所在的位置为中心&#xff0c;滚轮控制缩放 2.缩放后再支持鼠标拖动。 基本原理&#xff1a; 利用scale() 函数。进行缩放。但是要注意的地方是&#xff0c;如果是在 public void paintCom…

未来装备探索:数字孪生装备

源自&#xff1a;《计算机集成制造系统》 作者&#xff1a;陶飞 张辰源 张贺 程江峰 邹孝付 徐慧 王勇 谢兵兵 “人工智能技术与咨询” 发布 摘 要 工程装备、制造装备、医疗装备等各类装备是加快国家基础建设&#xff0c;提升国家经济实力和保障医疗健康的重要…

2023年【电工(高级)】报名考试及电工(高级)模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【电工&#xff08;高级&#xff09;】报名考试及电工&#xff08;高级&#xff09;模拟考试题&#xff0c;包含电工&#xff08;高级&#xff09;报名考试答案和解析及电工&#xff08;高级&#xff09;模拟考…

[题] 试除法判定质数 #质数(素数) #试除法

题目 AcWing 866. 试除法判定质数 思路 首先是暴力枚举 时间&#xff1a;O( (n) )&#xff09; bool is_prime(int n){//朴素判定&#xff08;暴力&#xff09;if(n < 2) return 0;//小于2的数不在范围内&#xff0c;直接排除for(int i 2; i < n; i )//枚举从2到n-1if(…

JAVA基础(JAVA SE)学习笔记(六)面向对象编程(基础)

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第二阶段&#xff1a;Java面向对象编程 6.面向对象编程&#xff08;基础&#xff09; 7.面向对象编程&…