分享
(7)LLM分布式训练面面观
输入“/”快速插入内容
(7)LLM分布式训练面面观
作者:小A,aaronxic,
知乎个人主页
发表时间:2023年7月8日
原文地址:
https://zhuanlan.zhihu.com/p/664604792
50%
50%
开篇
大家好,我是小A。前面几篇我们感受了Transformer在LLM、多模态和AIGC等算法领域的应用,从这一篇开始我们把目光转向工程部分。本文将围绕LLM里面分布式训练,回答下面4个问题
•
分布式通信原语有哪些?
•
3D并行都是怎么做的?
•
ZeRO是如何降低数据并行的显存占用的?
•
Alpa是如何用自动化搜索方式逼近人工设计的最优方案的?
PS: 长文预警,本篇约2w字,关注&收藏后电脑上阅读体验更加哦~
(^_^)
分布式通信原语
LLM分布式训练需要用到多机多卡,通信是个最基础的问题。因此在正式介绍并行算法之前,我们先了解一下常用分布式通信源语(primitives)有哪些。
分布式通信一般有两种
•
点对点通信(Point-to-point Communication, P2P): 两个节点间通信
•
集合通信(Collective Communication, CC): 在一组节点内通信
使用最为广泛的分布式通信库有MPI和NCCL,在工程实践中通常CPU上用MPI,GPU上用NCCL
MPI
MPI(Message Passing Interface)全称是是消息传递接口,定义了一套接口,比较流行的开源实现是OpenMPI。常用于计算集群,超算上。针对CPU之间的通信做了很多优化。
目前MPI广泛用于节点的管理,但是GPU之间的通信优化得不好,MPI没有针对性的做优化
编译带mpi的c文件的时候,需要用
mpicxx
编译器
NCCL
NCCL(NVIDIA Collective Communication Library) 是NV专门针对自家的计算卡和网络的集合通信库,完成单机多卡和多机多卡的高速互联通信
这里
repo
包含了简单易懂的所有NCCL使用示例,感兴趣的可以移步学习。注意在编译nccl相关的cu文件时候,需要加上
-lnccl
的库
点对点通信原语
点对点的操作比较简单,只有发送和接收两个操作
•
发送的时候需要指定发送buffer和发送给哪个peer对象编号
•
接收的时候需要指定接收buffer和数据来自哪个peer对象编号
NCCL和MPI的接口如下所示
集合通信常用原语
集合通信是在一组节点内相互通信,在MPI中大致分成三种
•
一对多。例如Broadcast和Scatter等。
•
多对一。例如Reduce和Gather等
•
多对多。例如AllReduce、AllGather、ReduceScatter和AllToAll
值得注意的是在NCCL中,原语种类比MPI要少,只包含了5种,分别为Broadcast、Reduce、AllGather、ReduceScatter和AllReduce