当前位置: 首页 > news >正文

【分布式】入门级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.

 # 总结

相关文章:

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

# 背景知识 大模型和分布式训练对数据的吞吐量以及并行度都有很高的要求&#xff0c;NCCL就是在这个背景下诞生的。 如果你是一个只会写写Python&#xff0c;调用PyTorch和Horovod的算法萌新&#xff0c;可能对于分布式底层的东西不太了解&#xff0c;在下岗热潮中被主管逼着…...

Rust的模式匹配

文章目录 match匹配if let匹配 match匹配 match可以结合枚举使用&#xff0c;例如 enum IpVersion {V4,V6, }fn ParseIpVersion(version: IpVersion) -> String {match version {IpVersion::V4 > String::from("ipv4"),IpVersion::V6 > String::from(&quo…...

操作系统【OS】虚拟机

定义 使用虚拟化技术&#xff0c;将一台物理机器虚化为多台虚拟机器VM&#xff0c;每个虚拟机器都可用独立运行一个操作系统 分类 传统计算机 第一类VMM 第二类VMM...

不写代码、构建一个开源的 ChatGPT,总共需要几步?|Hugging News #1020

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」。本期 Hugging News 有哪些有趣的消息&#xff0…...

VBA操作数据库

相关背景&#xff1a; 对于数据分析同学&#xff0c;一般SQL&#xff0c;EXCEL是必备技能&#xff0c;但对于VBA和Python可能有的同学不会&#xff1b;在处理本地数据上(诸如excel、txt|csv文本&#xff09;&#xff0c;后续尝试使用VBA或者Python写一个sql查询的GUI界面&…...

【华为OD机试】HJ26 字符串排序

描述 编写一个程序&#xff0c;将输入字符串中的字符按如下规则排序。 规则 1 &#xff1a;英文字母从 A 到 Z 排列&#xff0c;不区分大小写。 如&#xff0c;输入&#xff1a; Type 输出&#xff1a; epTy 规则 2 &#xff1a;同一个英文字母的大小写同时存在时&#xff0c;…...

哈里斯鹰算法优化BP神经网络(HHO-BP)回归预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

摆动序列【贪心4】

题目 分析 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {if(nums.size() < 2) return nums.size();int ret 0,left 0,right 0;for(int i 0;i < nums.size()-1;i){right nums[i1] - nums[i];if(right 0) continue;if(left …...

Youtrack Linux 安装

我们考虑最后应该使用的是 ZIP 方式的安装。 按照官方的说法如何设置运行 YouTrack 应该是非常简单的。 准备环境 根据官方的说法&#xff0c;我们需要做的就是下载 Zip 包&#xff0c;然后把 Zip 包解压到指定的目录中就可以了。 下载 当前官方的下载地址为&#xff1a;Ge…...

分类预测 | MATLAB实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络数据分类预测

分类预测 | MATLAB实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络数据分类预测 目录 分类预测 | MATLAB实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SSA-CNN-LSTM数据分类预测&…...

飞书-多维文档-计算时间差

1. 选择字段类型 如图所示&#xff0c;字段类型选择 公式 2. 编辑公式 单击 公式编辑器 在弹出的公式编辑框中输入公式 TEXT([终结时间]-[开始时间],"HH:MM") [终结时间] 和 [开始时间] 请替换成你的表格中对应的字段名称HH:MM 表示输出的时间格式为 时:分其中 “…...

【文献copilot】调用文心一言api对论文逐段总结

文献copilot&#xff1a;调用文心一言api对论文逐段总结 当我读文献的时候&#xff0c;感觉读得太慢了&#xff0c;看翻译软件翻译的又觉得翻译的不好。于是我就写了个程序辅助我读文献&#xff0c;它可以逐段总结&#xff0c;输出格式是&#xff1a;原文一句话总结分段总结&a…...

编译安装Nginx+GeoIP2自动更新+防盗链+防爬虫+限制访问速度+限制连接数

此文章是Nginx的GeoIP2模块和MaxMind国家IP库相互结合&#xff0c;达到客户端IP访问的一个数据记录以及分析&#xff0c;同时还针对一些业务需求做出对Nginx中间件的控制&#xff0c;如&#xff1a;防盗链、防爬虫、限制访问速度、限制连接数等 该篇文章是从一个热爱搞技术的博…...

基于JAVA+SpringBoot+UniApp+Vue的前后端分离的手机移动端图书借阅平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会信息化的快速…...

华为云CodeArts IDE for Java安装使用教程

本篇内容主要介绍使用华为云CodeArts IDE for Java创建工程、代码补全、运行调试代码、Build构建和测试相关的主要功能。 一、下载安装华为云CodeArts IDE for Java 华为云CodeArts IDE for Java安装要求 至少需要 2 GB RAM &#xff0c;但是推荐8 GB RAM; 至少需要 2.5 GB 硬…...

MPI并行编程技术

MPI并行编程技术 MPI含义及环境搭建安装点对点通信阻塞型接口MPI_SendMPI_Recv 阻塞式示例tag雅可比迭代示例死锁 MPI含义及环境搭建安装 MPICH官网 Github地址 MPI历史版本下载地址 安装教程 MPI介绍 MPI课程 点对点通信 阻塞型接口 MPI_Send MPI_Recv 阻塞式示例 tag 雅…...

使用 pyspark 进行 Classification 的简单例子

This is the second assignment for the Coursera course “Advanced Machine Learning and Signal Processing” Just execute all cells one after the other and you are done - just note that in the last one you have to update your email address (the one you’ve u…...

[ROS2系列] ORBBEC(奥比中光)AstraPro相机在ROS2进行rtabmap 3D建图

目录 背景&#xff1a; 一、驱动AstraPro摄像头 二、安装rtabmap error1&#xff1a;缺包 三、尝试 四、参数讲解 五、运行 error2: Did not receive data since 5 seconds! 六、效果​编辑 error4: 背景&#xff1a; 1、设备&#xff1a;pc&#xff1b;jeston agx …...

墨迹天气商业版UTF-8模板,Discuz3.4灰白色风格(带教程)

1.版本支持&#xff1a;Discuzx3.4版本&#xff0c;Discuzx3.3版本&#xff0c;DiscuzX3.2版本。包括网站首页&#xff0c;论坛首页&#xff0c;论坛列表页&#xff0c;论坛内容页&#xff0c;论坛瀑布流,资讯列表页(支持多个)&#xff0c;产品列表页(支持多个)&#xff0c;关于…...

Godot 官方2D C#重构(2):弹幕躲避

前言 Godot 官方 教程 Godot 2d 官方案例C#重构 专栏 Godot 2d 重构 github地址 实现效果 技术点说明 异步函数 Godot的事件不能在Task中运行&#xff0c;因为会导致跨线程的问题。 //这样是不行的&#xff0c;因为跨线程了&#xff0c;而且会阻塞UI线程&#xff0c;具体原因…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...