Z.S.K.'s Records

工程侧如何加速模型训练

模型训练除了算法侧需要优化之外,工程师也可以做很多落地来加速这个过程,今天就结合作者在落地训练平台的经验来聊一聊其中常用技术.

训练常常提到的单机单卡,单机多卡,多机多卡以及数据并行及模型并行的概念(作者并不是算法研究工作者,也没有能力深入了解其代码细节,所以接下来只会广义上引出一些概念)

GPU使用

单机单卡

这是最简单的一种方式, 使用一台机器上的一张卡运行任务, 常常用于本地调试目的,这个没什么好说的

单机多卡

有时只使用一张卡效率太慢,如果刚好一台机器上又有好几块GPU,那么自然就会想到是不是可以从单卡扩展到多卡上,同时在多张卡上运行

多机多卡

一般情况下,一台服务器可安装8块GPU,如果性能还是无法满足的情况下,就需要使用多机多卡方式了,从单机扩展到多机实现分布式

单机多卡多机多卡(分布式)的区别:

  • 单机多卡:只需运行一份代码,由该代码分配该台机器上GPU资源的使用
  • 多机多卡:每台机器上都需要运行一份代码,机器之间需要互相通信传递梯度,并且模型参数的更新也存在同步训练模式和异步训练模式的区别

GPU并行

那么有以上几种对GPU的使用, 存在多GPU的情况下,又涉及到另一个问题就是: 多GPU之间如何协调数据、模型的关系呢?

显然要么把数据切分,要么把模型切分,业界大体以数据并行、模型并行的方式实现,而又以数据并行使用较多

数据并行

数据并行时,每个GPU设备上保持了同样的模型数据,且一次完整的训练过程包括以下3步:

  • 1.CPU负责将不同的训练数据(mini-batch)分别喂给GPU0和GPU1设备;
  • 2.不同的显卡设备上存储了完全一致的模型,通过mini-batch数据进行了前向和反向传播;
  • 3.位于不同GPU设备上的模型进行权重同步和更新

其中第一点关心的是训练数据如何平均地分配给GPU,也就是dataloader, 这个大多数的训练框架都会实现

数据并行又分为同步、异步, 这里就不展开了

模型并行

相对于数据并行而言,模型并行就是将模型切成若干份放到若干GPU中(模型就是网络,分为很多层,我们可以将网络层切割分布到不同的GPU上)

关于模型并行作者所在的业务中几乎没有用到,而且网络上使用的也不是太多,作者了解不多,这里就不误人子弟了,有空的时候再详细研究研究

OK, 回到正题, 那么多卡的情况下,他们的通信如何加速呢?

加速训练

还是这张图

从这个图我们可以知道,不管是在单机多卡还是多机多卡训练场景下, 如果有parameter server参与,则ps很容易成为瓶颈, 如果想让速度更快,就成本而言,有那么下面几种方式:

成本小:

  • 把训练时的单卡 batchsize 加大,将计算量增大而传输量不变
  • 让研究员尽量训更大的网络,让他们多放点 Conv 而不是 FC,这让计算量增加的比参数量(即传输的数据量)更多一些
  • 说服研究员不要坚持等价的 SGD,换用 ASGD,计算与通讯同时进行

成本小的方案一般需要通过调参得到最优解

成本大:

  • 把 PS 变成多机版本,每台服务器管一部分 weight,从而带宽压力可以均摊到更多服务器上,降低传输量
  • 依靠更好的硬件
    • 机器间通讯:万兆网络是底线,Infiniband 和 RoCE 的带宽从 56Gbps 一直上升到 100Gbps 甚至 200Gbps,让 Mellanox 这家公司生意越来越好(现在被 NVIDIA 直接收购了)
    • 机器内通讯:AMD 比牙膏厂更早支持 PCIe 4.0,让带宽翻了个倍;NVIDIA 搞出 NVLink,愣是把通讯带宽搞上了不可思议的 600Gb/s……
  • Mellanox 表示:我们的智能 Switch 可以直接当 PS,我没带宽瓶颈!

直接换性能更好的硬件效果是立竿见影,就是太费钱, 所以要千方百计的降低传输,又引出了若干niubility的技术

RDMA

DMA全称为Direct Memory Access,即直接内存访问。意思是外设对内存的读写过程可以不用CPU参与而直接进行

如果说DMA解决的是本机外设直接操作内存的话,而RDMA则是Remote Direct Memory Access, 解决的对远程节点的内存直接访问

关于DMA,这篇博文写的不错,可以参考: 海思专家如何看待RDMA技术?

RDMA本身指的是一种技术,不是一类特定的产品, 具体协议层面,包含Infiniband(IB),RDMA over Converged Ethernet(RoCE)和internet Wide Area RDMA Protocol(iWARP)。三种协议都符合RDMA标准。

DMA需要硬件的支持,所以成本比较贵

IB

需要硬件、协议、软件的全套支持,现在IB已经达到了全双工惊人的400Gb/s

这玩意就更贵了,除了网关外,交换机也需要配套

高性能计算知识:高性算InfiniBand网络详解.pdf

RoCE

RoCE从英文全称就可以看出它是基于以太网链路层的协议,v1版本网络层仍然使用了IB规范,而v2使用了UDP+IP作为网络层,使得数据包也可以被路由

某种程度上可以做为IB的低成本替代方案,不过性能肯定是不及IB的

浅析RoCE网络技术

MPI

mpi做为老牌的消息通信接口,多用于HPC或者超算的并发编程领域, 作者所在的平台中也使用到了基于mpi实现的mpich2库.

MPI框架学习一架构组件

MPI工作大多在CPU端,如果想作用于GPU,则会有些损耗(MPI传递GPU中的数据是有一个步骤是从Device拷贝数据到Host的内存), 所以对GPU来说(切确来说是nvidia gpu),则不得不说nccl

####NCCL

Nvidia于2015年公开发布NCCL,一个开源的、基于自身硬件的开源的集合通信库实现。其算法基本实现原理,和mpi的实现是基本类似的,由于其完全基于自家硬件,可以进行充分的优化,所以基于nvidia-gpu时,使用nccl性能是很强的,目前nccl是v2版本

NCCL 最初只支持单机多 GPU 通信,从 NCCL2 开始支持多机多 GPU 通信

以nvidia v100 gpu为例,来看看v100的Hardware Architecture

图中不同的连线代表不同的通信方式,有3种通信方式: nvlink、PCIE、QPI

nvlink是nvidia出品的高速 GPU 互连技术, 目前已经更新至nvlink v3(A100上就是),v100是 nvlink v2

由于nvlink是全双工的通道,单向通道带宽为25Gb/s,双向则为50Gb/s,6个的话最大300Gb/s

这里要注意, 一块GPU上的nvlink通道是有限的,v100上最大是6通道,所以从图上可以看到,GPU与GPU之间的通道是nvlink, 但是只有6通道,所以没办法实现一块GPU跟其它的GPU都建立nvlink通道,所以没办法建立nvlink的两块gpu只得通过PCIE来进行通信了

PCIE

PCIE(PCI-Express),实质上是一种高速串行计算机扩展总线标准, 最新为PCIE v5版本,GPU上用的最多的还是PCIE v4

PCIE v4版本的速度大概在16Gb/s,而且还得看PCIE的插槽数量

所以可看出,如果GPU与GPU之间通过PCIE通道,则会比nvlink v2差很多.

同样,要注意PCIE v4直连CPU最大只能有16条

QPI

Intel的QuickPath Interconnect技术缩写为QPI,译为快速通道互联,也是全双工的

每个QPI总线总带宽=每秒传输次数(即QPI频率)×每次传输的有效数据(即16bit/8=2Byte)×双向

即QPI频率为4.8GT/s的总带宽=4.8GT/s×2Byte×2=19.2GB/s,QPI频率为6.4GT/s的总带宽=6.4GT/s×2Byte×2=25.6GB/s

另外说一下,nvidia v100的GPU与cpu也可以通过nvlink实现通信

所以,这就是为什么很多大厂在GPU调度时要做GPU的拓扑感知的原因, 也是为了让GPU之间的路径更短, 不同的通道不同速度

最后,来说说在nvidia gpu的场景下,怎么知道走的是哪个方案呢, 使用以下命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ nvidia-smi topo -m
GPU0 GPU1 GPU2 GPU3 mlx5_0 mlx5_1 CPU Affinity
GPU0 X PIX SYS SYS SYS SYS 0-11,24-35
GPU1 PIX X SYS SYS SYS SYS 0-11,24-35
GPU2 SYS SYS X PIX PHB PHB 12-23,36-47
GPU3 SYS SYS PIX X PHB PHB 12-23,36-47
mlx5_0 SYS SYS PHB PHB X PIX
mlx5_1 SYS SYS PHB PHB PIX X

Legend:

X = Self
SYS = Connection traversing PCIe as well as the SMP interconnect between NUMA nodes (e.g., QPI/UPI)
NODE = Connection traversing PCIe as well as the interconnect between PCIe Host Bridges within a NUMA node
PHB = Connection traversing PCIe as well as a PCIe Host Bridge (typically the CPU)
PXB = Connection traversing multiple PCIe switches (without traversing the PCIe Host Bridge)
PIX = Connection traversing a single PCIe switch
NV# = Connection traversing a bonded set of # NVLinks

可以看到,上述服务器上有4块GPU卡,48个CPU核。

GPU0和GPU1之间是通过PCIe switch通信的(不经过cpu);

GPU2和GPU3之间也是通过PCIe switch通信的;

其它的GPU卡两两之间是通过QPI通信的(PCIe + QPI总线);

而mlx5_0 和mlx5_1是Mellanox ConnectX-4 PCIe网卡设备(10/25/40/50千兆以太网适配器,另外该公司是IBA芯片的主要厂商)。

当然,就算只说通信方向也还有很多的方法可以加速训练过程. 就CPU来说,外设也有远近之分,NUMA技术就是解决这个问题之一

百度飞桨的深度学习分布式训练专题非常不错,值得看看.

数据并行:提升训练吞吐的高效方法 |深度学习分布式训练专题

参考文章:

转载请注明原作者: 周淑科(https://izsk.me)

 wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?