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

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

3天内不再提示

SOK的Embedding计算过程及原理详解

NVIDIA英伟达企业解决方案 来源:NVIDIA英伟达企业解决方案 作者:NVIDIA英伟达企业解 2022-06-14 11:34 次阅读

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

1f4928c8-eb09-11ec-ba43-dac502259ad0.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 获取的输入为 [0, 1, 2, 3],根据前面所讲的规则,它将会被分成 [0, 2], [1, 3]两组。注意,在这一步,我们还会为每个分组产生一个 order 信息,用于 output dispacher 的重排序。

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

1f8b1b0c-eb09-11ec-ba43-dac502259ad0.png

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

1f971a24-eb09-11ec-ba43-dac502259ad0.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。

1fc5d65c-eb09-11ec-ba43-dac502259ad0.png

2. Lookup

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

201f419c-eb09-11ec-ba43-dac502259ad0.png

3. Output Dispatcher

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

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

204b0610-eb09-11ec-ba43-dac502259ad0.png

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

2078053e-eb09-11ec-ba43-dac502259ad0.png

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

20ac5ea6-eb09-11ec-ba43-dac502259ad0.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 即可轻松完成训练。

原文标题:Merlin HugeCTR Sparse Operation Kit 系列之二

文章出处:【微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红

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

    关注

    14

    文章

    4985

    浏览量

    103035
  • 计算
    +关注

    关注

    2

    文章

    450

    浏览量

    38798
  • SOK
    SOK
    +关注

    关注

    0

    文章

    5

    浏览量

    6330

原文标题:Merlin HugeCTR Sparse Operation Kit 系列之二

文章出处:【微信号:NVIDIA-Enterprise,微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ADS1299器件手册里的这个衰减怎么计算出来的?

    我的计算过程:33uV x 10.3/(952+10.3) = 0.35uV ?而不是要求的3.5uV,请指教
    发表于 11-18 06:41

    CPK为什么要大于1.33?一文详解CPK计算

    原文标题:CPK为什么要大于1.33?一文详解CPK计算
    的头像 发表于 11-01 11:08 330次阅读

    求助,TAS5731关于DRC和EQ的寄存器的计算和设置问题?

    TAS5731的文档只描述了寄存器地址,但是并没有说明这些寄存器如何计算设置,文档里说明参考EVM的设计手册,可是这手册中也没有具体计算和设置说明,只是说需要通过GE软件计算。并没有计算过程
    发表于 10-28 08:29

    计算滞回比较器的上下门限电压

    请教各位大佬,如图是过欠压保护电路,过压部分和欠压部分的上下门限电压怎么计算呢?以及二极管D6、D8的作用是什么? 如果能给出详细计算过程那就太感激不尽了!!!
    发表于 09-20 15:44

    求助,以下恒流源电路Io的计算表达式怎么计算

    这个恒流源电路Io的计算表达式怎么计算,求给出详细计算过程
    发表于 08-22 08:16

    正反馈式恒流源电路原理是什么?

    想问一下各位,这个的原理是什么?如果可以的话,能否给一个计算过程
    发表于 08-13 07:14

    SOK在手机行业的应用案例

    通过封装 NVIDIA Merlin HugeCTR,Sparse Operation Kit(以下简称 SOK)使得 TensorFlow 用户可以借助 HugeCTR 的一些相关特性和优化加速 GPU 上的分布式 Embedding 训练。
    的头像 发表于 07-25 10:01 349次阅读
    <b class='flag-5'>SOK</b>在手机行业的应用案例

    【《计算》阅读体验】量子计算

    相互作用,其中大部分振幅相互抵消,只留下几个答案,甚至一个答案。测量这个答案,或者重等计算过程并记录下答案的分布,就能得到所有2\"个输入的信息。 另一个制造量子计算机的巨大困难来自量子的退
    发表于 07-13 22:15

    简述递归神经网络的计算过程

    、时间序列预测等领域有着广泛的应用。本文将详细介绍RNN的计算过程。 基本概念 1.1 神经网络 神经网络是一种受人脑神经元结构启发的计算模型,由大量的神经元(或称为节点)组成,这些神经元通过权重连接在一起。每个神经元接收输入信号,通过激活函数处理信号,并将处
    的头像 发表于 07-05 09:30 454次阅读

    卷积神经网络计算过程和步骤

    卷积神经网络(Convolutional Neural Network, CNN)是一种深度学习模型,广泛应用于图像识别、视频分析、自然语言处理等领域。本文将详细介绍卷积神经网络的计算过程和步骤
    的头像 发表于 07-03 09:36 579次阅读

    深度学习模型训练过程详解

    深度学习模型训练是一个复杂且关键的过程,它涉及大量的数据、计算资源和精心设计的算法。训练一个深度学习模型,本质上是通过优化算法调整模型参数,使模型能够更好地拟合数据,提高预测或分类的准确性。本文将
    的头像 发表于 07-01 16:13 1268次阅读

    TouchGFX 中 MCU 负载的计算过程介绍

    从 TouchGFX Desinger 下载的 TBS(TouchGFX Board Setup)大都带有 MCU 的 负载计算功能,那么如何在自己的板子上增加 MCU 负载计算功能呢?本文档参考从 TouchGFX Designer 上下载的 STM32F746 的 T
    的头像 发表于 05-24 13:24 482次阅读
    TouchGFX 中 MCU 负载的<b class='flag-5'>计算过程</b>介绍

    全志T527芯片详解计算性能与高清图像编解码

    全志T527芯片详解计算性能与高清图像编解码
    的头像 发表于 05-21 14:37 2886次阅读
    全志T527芯片<b class='flag-5'>详解</b>:<b class='flag-5'>计算</b>性能与高清图像编解码

    什么是寄生电感?如何计算过孔的寄生电感?

    对电路的性能产生影响,因此需要进行计算和考虑。电感是指导体或线圈对电流变化的响应能力。当电流通过导体或线圈时,会产生磁场,这个磁场又会导致导体或线圈内部产生感应电动
    的头像 发表于 03-15 08:19 2279次阅读
    什么是寄生电感?如何<b class='flag-5'>计算过</b>孔的寄生电感?

    GD32 MCU ADC采样率如何计算

    大家在使用ADC采样的时候是否计算过ADC的采样率,这个问题非常关键!
    的头像 发表于 01-23 09:29 2613次阅读
    GD32 MCU ADC采样率如何<b class='flag-5'>计算</b>?