0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SOKey如何将数据并行转化为模型并行再转回数据并行

科技绿洲 来源:NVIDIA英伟达企业解决方案 作者:NVIDIA英伟达企业解 2022-06-14 15:05 次阅读

在上期文章中,我们对 HugeCTR Sparse Operation Kit (以下简称SOK) 的基本功能,性能,以及 API 用法做了初步的介绍,相信大家对如何使用 SOK 已经有了基本的了解。在这期文章中,我们将从在 TensorFlow 上使用 SOK 时常见的“数据并行-模型并行-数据并行”流程入手,带大家详细了解 SOK 的原理。

poYBAGKoMvSAYGaWAABmdfsrJiE812.png

SOK 的 Embedding 计算主要分为三个阶段:input-dispatcher -》 lookup -》 output-dispatcher,接下来我们将以 all-to-all 稠密 Embedding 层为例,带大家梳理各个阶段的计算过程。

1. Input Dispatcher

Input Dispatcher 的职责是将数据以并行的形式的输入,分配到各个 GPU 上。总共分为以下几个步骤:

第一步:对每个 GPU 接收到的数据并行的 category key,按照 key 求余 GPU 的数量计算出其对应的 GPU ID,并分成和 GPU 数量相同的组;同时计算出每组内有多少 key。例如图 2 中,GPU 的总数为 2,GPU 0 获取的输入为 ,根据前面所讲的规则,它将会被分成两组。注意,在这一步,我们还会为每个分组产生一个 order 信息,用于 output dispacher 的重排序。

第二步:通过 NCCL 交换各个 GPU 上每组 key 的数量。由于每个 GPU 获取的输入,按照 key 求余 GPU 数量不一定能够均分,如图 3 所示,提前在各个 GPU 上交换 key 的总数,可以在后面交换 key 的时候减少通信量。

poYBAGKoMv2AJqUBAAA3cyhqBsc646.png

第三步:使用 NCCL,在各个 GPU 间按照 GPU ID 交换前面分好的各组 key,如图 4 所示。

pYYBAGKoMwWAT6j4AAAq8s52F_A277.png

Step4:对交换后的所有 key 除以 GPU 总数,这一步是为了让每个 GPU 上的 key的数值范围都小于 embedding table size 整除 GPU 的数量,保证后续在每个 worker 上执行 lookup 时不会越界,结果如图 5 所示。

总而言之,经过上面 4 个步骤,我们将数据并行地输入,按照其求余 GPU 数量的结果,分配到了不同对应的 GPU 上,完成了 input key 从数据并行到模型并行的转化。虽然用户往每个 GPU 上输入的都可以是 embedding table 里的任何一个 key,但是经过上述的转化过程后,每个 GPU 上则只需要处理 embedding table 里 1/GPU_NUMBER 的 lookup。

pYYBAGKoMxKAYivpAAAu6m8aqLA636.png

2. Lookup

Lookup 的功能比较简单,和单机的 lookup 的行为相同,就是用 input dispatcher 输出的 key,在本地的 embedding table 里查询出对应的 embedding vector,我们同样用一个简单的图来举例。注意下图中 Global Index 代表每个 embedding vector 在实际的 embedding table 中对应的 key,而 Index 则是当前 GPU 的“部分”embedding table 中的 key。

poYBAGKoMxyAHnezAAD8Q5G-3Ho061.png

3. Output Dispatcher

和 input dispatcher 的功能对应,output dispatcher 是将 embedding vector 按照和 input dispatcher 相同的路径、相反的方向将 embedding vector 返回给各个 GPU,让模型并行的 lookup 结果重新变成数据并行。

第一步:复用 input dispatcher 中的分组信息,将 embedding vector 进行分组,如图 7 所示。

poYBAGKoMyaAayGnAABezq78Is0376.png

第二步:通过 NCCL 将 embedding vector 按 input dispatcher 的路径返还,如图 8 所示。

poYBAGKoMy-AULrGAABdfOr709U744.png

第三步:复用 input dispatcher 第一步骤的结果,将 embedding vector 进行重排序,让其和输入的 key 顺序保持一致,如图 9 所示。

pYYBAGKoMzeAWghNAABg1OZ5H-A524.png

可以看到, GPU 0 上输入的[0, 1, 3, 5],最终被转化为了[0.0, …], [0.1, …], [0.3, …], [0.5, …] 四个 embedding vector,虽然其中有 3 个 embedding vector 被存储在 GPU 1 上,但是以一种对用户透明的方式,在 GPU 0 上拿到了对应的 vector。在用户看来,就好像整个 embedding table 都存在 GPU 0 上一样。

4. Backward

在 backward 中,每个 GPU 会得到和 input 的 key 所对应的梯度,也就是数据并行的梯度。此时的梯度对应的 embedding vector 可能并不在当前 GPU 上,所以还需要做一步梯度的交换。这个步骤和 output dispatcher 的第三步骤中的工作流程的路径完全相同,只是方向相反。仍然以前面的例子举例,GPU 0 获取了 key [0, 1, 3, 5]的梯度,我们把它们分别叫做 grad0, grad1, grad3, grad5;由于 grad1,grad3,grad5 对应的 embedding vector 在 GPU 1 上,所以我们把它们和 GPU 1 上的 grad4, grad6 进行交换,最终在得到了 GPU 0 上的梯度为[grad0, grad4, grad6],GPU 1 上的梯度为[grad1, grad3, grad5, grad5, gard7]。

结语

以上就是 SOK 将数据并行转化为模型并行再转回数据并行的过程,这整个流程都被封装在了 SOK 的 Embedding Layer 中,用户可以直接调用相关的 Python API 即可轻松完成训练。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6511

    浏览量

    87596
  • gpu
    gpu
    +关注

    关注

    27

    文章

    4417

    浏览量

    126689
  • API
    API
    +关注

    关注

    2

    文章

    1382

    浏览量

    60990
  • SOK
    SOK
    +关注

    关注

    0

    文章

    4

    浏览量

    6316
收藏 人收藏

    评论

    相关推荐

    用单片机进行串并行数据转化及其在家用电器控制中的应用

    Holtek单片机46R47配合74HC164移位锁存器来实现串行数据并行数据转化,并探讨如何将其应用到键盘扫描和显示之中。
    发表于 03-03 14:56

    mat数据转化为analyze数据

    请教各位,matlab如何将mat数据转化为analyze数据,谢谢
    发表于 12-18 11:41

    串行lvds数据并行TTL数据

    现在输入2路lvds串行数据和1路lvds时钟信号,频率480M,请问如何解出串行数据,并恢复成并行TTL信号
    发表于 04-28 18:08

    如何将十六进制数据转化为JPEG格式的数据??

    如何将十六进制数据转化为JPEG格式的数据??
    发表于 01-12 14:14

    verilog串并转换,串行输入八个12位的数据,请问如何将这八个12位的数据并行输出?

    串行输入八个12位的数据,请问如何将这八个12位的数据并行输出?
    发表于 04-01 12:41

    595芯片的输入,用595控制16x16点阵的列,怎么把只读存储器的并行数据转化为串行数据,怎么输出latch和clk?

    本人毕业生,求大神神详细讲讲图片中的内部运行原理,图片后连的是595芯片的输入,用595控制16x16点阵的列,怎么把只读存储器的并行数据转化为串行数据,怎么输出latch和clk
    发表于 04-28 12:56

    串行和并行的区别

    传输时,数据是一位一位地在通信线上传输的,先由具有几位总线的计算机内的发送设备,几位并行数据经并--串转换硬件转换成串行方式,逐位经 传输线到达接收站的设备中,并在接收端
    发表于 11-24 18:24

    串行和并行的区别

    速度快,处理简单。 串行数据传输时,数据是一位一位地在通信线上传输的,先由具有几位总线的计算机内的发送设备,几位并行数据经并--串转换硬件转换成串行方式,
    发表于 01-11 09:40

    并行编程模型有什么优势

    并行编程模型并行计算,尤其是并行软件的基础,也是并行硬件系统的导向,在面临多核新挑战的情况下,什么样的
    发表于 07-11 08:03

    算法隐含并行性的物理模型

    算法隐含并行性的物理模型:利用物理学原理对算法的隐含并行性进行了分析,提出算法的不确定性和高熵态是隐含并行性出现的根源,但算法的隐含并行性会
    发表于 10-21 08:23 10次下载

    什么是数据并行传输,并行传输原理是什么?

    什么是数据并行传输,并行传输原理是什么? 数据通信的基本方式可分为并行通信与串行通信。 并行
    发表于 03-17 16:25 8043次阅读

    并行总线是什么?(并行总线协议介绍)

    并行总线,就是并行接口与计算机设备之间传递数据的通道。采用并行传送方式在 微型计算机与外部设备之间进行数据传送的接口叫
    发表于 11-13 09:55 1.3w次阅读
    <b class='flag-5'>并行</b>总线是什么?(<b class='flag-5'>并行</b>总线协议介绍)

    Spark的并行数据挖掘的研究

    本文研究了基于Spark的并行数据挖掘,并将其应用到了流程对象数据分析中。文章通过对串行的流程 对象数据挖掘算法流的研究,提出了一种基于Spark并行计算框架的
    发表于 12-30 17:31 0次下载

    图解大模型训练之:数据并行上篇(DP, DDP与ZeRO)

    数据并行的核心思想是:在各个GPU上都拷贝一份完整模型,各自吃一份数据,算一份梯度,最后对梯度进行累加来更新整体模型。理念不复杂,但到了大
    发表于 06-16 09:54 2032次阅读
    图解大<b class='flag-5'>模型</b>训练之:<b class='flag-5'>数据</b><b class='flag-5'>并行</b>上篇(DP, DDP与ZeRO)

    模型分布式训练并行技术(一)-概述

    数据并行是最常见的并行形式,因为它很简单。在数据并行训练中,数据集被分割成几个碎片,每个碎片被分
    的头像 发表于 08-24 15:17 656次阅读
    大<b class='flag-5'>模型</b>分布式训练<b class='flag-5'>并行</b>技术(一)-概述