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

    文章

    5725

    浏览量

    110287
  • 计算
    +关注

    关注

    2

    文章

    460

    浏览量

    40165
  • SOK
    SOK
    +关注

    关注

    0

    文章

    5

    浏览量

    6476

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STPMC1可编程多相电能计算器IC:设计与应用详解

    STPMC1可编程多相电能计算器IC:设计与应用详解 在电力计量领域,精准且高效的电能计算是关键。STPMC1作为一款可编程多相电能计算器IC,为电力线系统的有效电能测量提供了强大的解
    的头像 发表于 03-02 16:55 666次阅读

    RAG(检索增强生成)原理与实践

    向量的特点: 语义相似的文本,向量距离更近 向量可以进行数学运算 (相似度计算) 降维后可视化 (理解语义空间) 常用的Embedding模型 OpenAI
    发表于 02-11 12:46

    反激开关电源反馈环路计算过程

    TL431通过分压电阻检测输出电压,当REF端电压达到基准电压(典型值2.495V)时导通。
    的头像 发表于 01-28 14:47 4144次阅读
    反激开关电源反馈环路<b class='flag-5'>计算过程</b>

    差示扫描量热仪DSC-600S关于DSC辅助线计算焓值

    中基线漂移、倾斜等干扰因素,从而精准捕获相变峰的净热量数据,为材料特性分析提供可靠支撑。在实际测算过程中,焓值计算的核心逻辑是获取基线与DSC曲线相交区域的面积,再结合
    的头像 发表于 12-12 16:07 483次阅读
    差示扫描量热仪DSC-600S关于DSC辅助线<b class='flag-5'>计算</b>焓值

    详解NMOS晶体管的工作过程

    在每一颗芯片的内部,数十亿个晶体管如同高速开合的微型水闸,构成数字世界的最小逻辑单元。以NMOS为例,我们将揭开它如何依靠电场控制电子流动,在“关断”与“导通”之间瞬间切换,并以此写下计算的语言。
    的头像 发表于 12-10 15:17 1450次阅读
    <b class='flag-5'>详解</b>NMOS晶体管的工作<b class='flag-5'>过程</b>

    IRL 指标计算公式,PLTS计算过程指南

    审核编辑 黄宇
    的头像 发表于 11-05 16:20 331次阅读
    IRL 指标<b class='flag-5'>计算</b>公式,PLTS<b class='flag-5'>计算过程</b>指南

    Camellia算法的实现(基于开源蜂鸟E203协处理器)

    开头的数据,我们称之为子密钥。F为轮函数,FL和FL-1为FL函数和FL-1函数。 左上图所示为产生子密钥的运算过程。该运算过程与数据的加解密过程类似,也要用到F函数和大量的异括运算。与后者
    发表于 10-30 07:04

    如何使用恢复算法来实现开平方运算

    我们输入的操作数X=0.1011,那么按照上述的步骤计算,就可以算出结果为Q=0.1101,具体计算过程如下:如果我们输入的操作数X=0.1011,那么按照上述的步骤计算,就可以算出结果为Q
    发表于 10-24 13:33

    e203乘除法模块(e203_exu_alu_muldiv.v)中的back2back和special case信号的含义

    的两个源寄存器相同,则说明这两条指令的运算结果是可以在同一次乘法计算过程中得出,这样可以在17个周期完成两条指令的运算, Mul指令输出低位,mulh(如mulhu等写回计算结果高位的指令)指令输出高位
    发表于 10-24 06:37

    测斜仪数据计算方法解析:从公式理解到智能应用

    测斜仪作为工程安全监测的重要设备,其测量数据的准确计算直接关系到结构物安全状态的判断。南京峟思将系统为大家介绍测斜仪数据的计算原理与方法,帮助用户更好地理解监测数据的产生过程。测斜仪计算
    的头像 发表于 09-28 13:30 928次阅读
    测斜仪数据<b class='flag-5'>计算</b>方法解析:从公式理解到智能应用

    横河功率分析仪WT5000低功率因数测量精度解析

    借助横河WT5000功率分析仪,用户可通过运算公式精确计算误差值。为简化计算过程,WT500还提供了更为简易的算法。当电流S≥0.5A时,直接将S乘以0.02%,便可轻松获取误差数值,大大提高了测试效率。
    的头像 发表于 07-16 17:36 1094次阅读
    横河功率分析仪WT5000低功率因数测量精度解析

    HarmonyOS NEXT应用元服务布局优化利用布局边界减少布局计算

    Measure阶段,其节点中保存了对应的大小信息,如果组件内容较多时,由于避免了其中组件整体的测算过程,性能会带来较大的提升。 我们通过修改以下示例代码中Column的宽度,对比给Row设置固定宽度
    发表于 06-26 11:13

    达梦数据库常用管理SQL命令详解

    达梦数据库常用管理SQL命令详解
    的头像 发表于 06-17 15:12 7834次阅读
    达梦数据库常用管理SQL命令<b class='flag-5'>详解</b>

    安徽京准:北斗卫星同步时钟的安装与调试详解

    安徽京准:北斗卫星同步时钟的安装与调试详解
    的头像 发表于 06-05 10:08 1862次阅读
    安徽京准:北斗卫星同步时钟的安装与调试<b class='flag-5'>详解</b>

    SSH常用命令详解

    SSH常用命令详解
    的头像 发表于 06-04 11:30 2273次阅读