课题组第五周学习

高效直接访问主机内存的方法

现有方法存在的问题

通过加载后执行的方法

面对巨大的模型参数规模,现有GPU的显存难以支撑大模型的训练。因此产生了一种通过加载后执行的方法,即将模型参数存储在主机内存中,每次训练时将参数加载到显存中,训练结束后将参数保存到主机内存中。这种方法的缺点是每次训练都需要将参数加载到显存中,这个过程会消耗大量的时间,例如在v100上,加载时间会是处理时间的4倍以上,导致训练效率低下。有一种异步加载方法,将加载层和训练层分开,训练层在训练时异步加载参数,但是这种方法会导致训练时的显存占用过高,而且层数较多时加载时间过高的劣势逐渐显现,优化并不明显。

本文提出的方法

直接主机访问

避开加载和训练不同步的问题,直接将cpu内存当作gpu的虚拟内存进行访问,这样避免了加载过程中占用gpu显存过高的问题,但是由于访问和数据流动要经过pcie总线,传输速度较慢。
因此,DHA使用了这样一种办法,使得其可以自适应选择访问方式,其可以通过直接主机访问和加载后执行两种方法进行训练,使得加载的时间可以隐藏在训练流的流水线中。

多GPU方法

对于多个GPU,由于GPU间通信效率要高于PCIE通信效率,因此可以将模型拆分成多个部分,分别存储在不同的GPU中,这样每次训练的加载都可以直接从其他GPU中加载,而不需要从主机内存中加载,这样可以减少加载时间。

DeepPlan

本文还提出了一个工具:用来为给定模型自动生成执行计划,过程如下:

  • 对本地GPU显存和主机内存分析性能
  • 通过比较DHA和流水线方法的延迟差异来决定每一层的策略
  • 如果有多个GPU,则根据GPU数量平均划分模型
  • 协调将直接主机访问的执行和加载后执行的执行进行协调
    本方案在部署时只需要进行一次执行。

    原理分析

    对于不同层,加载——执行策略与DHA策略的时间是不同的,
    加载——执行策略 DHA策略 结论
    卷积层 小规模差异不大 大规模较慢 推荐在较小卷积层使用DHA,同时加载较大卷积层等待直接执行
    全连接层 加载快 执行慢 推荐在全连接层使用加载后执行,因为其需要频繁访问内存
    嵌入层 加载较慢 执行较快 推荐在嵌入层使用DHA,因为其规模较大,而层中一些参数的访问较少
    归一化层 LayerNorm更好 BatchNorm更好 需要根据具体情况进行选择

产生差异的原因则是不同层对内存访问的需求不同,导致pcie访问次数不同,pcie作为瓶颈,访问次数越多,延迟越大。

并行传输

对于多GPU场景,将模型划分为多个部分后,采用并行传输策略:从内存并行地将模型传输到两个GPU,再从第二个GPU向第一个GPU传输,这样可以减少传输时间。
在此基础上,可以将GPU2——GPU1的传输变为流水线传输,这样可以进一步减少传输时间。
但是,由于CPU提供的PCIE总线数量限制,多GPU系统,例如8GPU也只能每两个GPU公用一组总线,因此多GPU的总线需要考虑总线拓扑。

DeepPlan实现

整体实现思路

再进行训练前,deepPlan会根据每一层的性能分析,推理出当前层采用何种方式进行训练(加载——执行orDHA)。遍历完整个网络后,将根据策略直接执行训练。如果在多GPU系统中,DeepPlan还会根据GPU连连接拓扑,将模型划分为多个部分,应用并行传输方案。

单层性能分析

利用单层执行时间的统计数据,或者执行一次单层来得到每一层的性能数据。

层间性能分析

对于每层性能已经得到的情况。检查每一层切换策略到DHA后其获得的性能差异是否比加载后执行的停滞时间更短,如果是的话则切换为DHA。并且通过递归的方式检查每个层之前最多可以使用几个DHA来缩短总加载停滞时间。

模型传输规划

DeepPlan根据GPU拓扑,和PCIE交换机布局,避免并行加载的总线冲突,检查所选GPU是否使用NVLink,如果使用则直接进行并行传输,否则使用流水线传输。同时,根据并行传输带来的性能优化,重新规划每一层使用的策略。