0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SOK的Embedding計(jì)算過程及原理詳解

NVIDIA英偉達(dá)企業(yè)解決方案 ? 來源:NVIDIA英偉達(dá)企業(yè)解決方案 ? 作者:NVIDIA英偉達(dá)企業(yè)解 ? 2022-06-14 11:34 ? 次閱讀

在上期文章中,我們對(duì) HugeCTR Sparse Operation Kit (以下簡(jiǎn)稱SOK) 的基本功能,性能,以及 API 用法做了初步的介紹,相信大家對(duì)如何使用 SOK 已經(jīng)有了基本的了解。在這期文章中,我們將從在 TensorFlow 上使用 SOK 時(shí)常見的“數(shù)據(jù)并行-模型并行-數(shù)據(jù)并行”流程入手,帶大家詳細(xì)了解 SOK 的原理。

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

SOK 的 Embedding 計(jì)算主要分為三個(gè)階段:input-dispatcher -> lookup -> output-dispatcher,接下來我們將以 all-to-all 稠密 Embedding 層為例,帶大家梳理各個(gè)階段的計(jì)算過程。

1. Input Dispatcher

Input Dispatcher 的職責(zé)是將數(shù)據(jù)以并行的形式的輸入,分配到各個(gè) GPU 上??偣卜譃橐韵聨讉€(gè)步驟:

第一步:對(duì)每個(gè) GPU 接收到的數(shù)據(jù)并行的 category key,按照 key 求余 GPU 的數(shù)量計(jì)算出其對(duì)應(yīng)的 GPU ID,并分成和 GPU 數(shù)量相同的組;同時(shí)計(jì)算出每組內(nèi)有多少 key。例如圖 2 中,GPU 的總數(shù)為 2,GPU 0 獲取的輸入為 [0, 1, 2, 3],根據(jù)前面所講的規(guī)則,它將會(huì)被分成 [0, 2], [1, 3]兩組。注意,在這一步,我們還會(huì)為每個(gè)分組產(chǎn)生一個(gè) order 信息,用于 output dispacher 的重排序。

第二步:通過 NCCL 交換各個(gè) GPU 上每組 key 的數(shù)量。由于每個(gè) GPU 獲取的輸入,按照 key 求余 GPU 數(shù)量不一定能夠均分,如圖 3 所示,提前在各個(gè) GPU 上交換 key 的總數(shù),可以在后面交換 key 的時(shí)候減少通信量。

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

第三步:使用 NCCL,在各個(gè) GPU 間按照 GPU ID 交換前面分好的各組 key,如圖 4 所示。

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

Step4:對(duì)交換后的所有 key 除以 GPU 總數(shù),這一步是為了讓每個(gè) GPU 上的 key的數(shù)值范圍都小于 embedding table size 整除 GPU 的數(shù)量,保證后續(xù)在每個(gè) worker 上執(zhí)行 lookup 時(shí)不會(huì)越界,結(jié)果如圖 5 所示。

總而言之,經(jīng)過上面 4 個(gè)步驟,我們將數(shù)據(jù)并行地輸入,按照其求余 GPU 數(shù)量的結(jié)果,分配到了不同對(duì)應(yīng)的 GPU 上,完成了 input key 從數(shù)據(jù)并行到模型并行的轉(zhuǎn)化。雖然用戶往每個(gè) GPU 上輸入的都可以是 embedding table 里的任何一個(gè) key,但是經(jīng)過上述的轉(zhuǎn)化過程后,每個(gè) GPU 上則只需要處理 embedding table 里 1/GPU_NUMBER 的 lookup。

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

2. Lookup

Lookup 的功能比較簡(jiǎn)單,和單機(jī)的 lookup 的行為相同,就是用 input dispatcher 輸出的 key,在本地的 embedding table 里查詢出對(duì)應(yīng)的 embedding vector,我們同樣用一個(gè)簡(jiǎn)單的圖來舉例。注意下圖中 Global Index 代表每個(gè) embedding vector 在實(shí)際的 embedding table 中對(duì)應(yīng)的 key,而 Index 則是當(dāng)前 GPU 的“部分”embedding table 中的 key。

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

3. Output Dispatcher

和 input dispatcher 的功能對(duì)應(yīng),output dispatcher 是將 embedding vector 按照和 input dispatcher 相同的路徑、相反的方向?qū)?embedding vector 返回給各個(gè) GPU,讓模型并行的 lookup 結(jié)果重新變成數(shù)據(jù)并行。

第一步:復(fù)用 input dispatcher 中的分組信息,將 embedding vector 進(jìn)行分組,如圖 7 所示。

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

第二步:通過 NCCL 將 embedding vector 按 input dispatcher 的路徑返還,如圖 8 所示。

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

第三步:復(fù)用 input dispatcher 第一步驟的結(jié)果,將 embedding vector 進(jìn)行重排序,讓其和輸入的 key 順序保持一致,如圖 9 所示。

20ac5ea6-eb09-11ec-ba43-dac502259ad0.png

可以看到, GPU 0 上輸入的[0, 1, 3, 5],最終被轉(zhuǎn)化為了[0.0, …], [0.1, …], [0.3, …], [0.5, …] 四個(gè) embedding vector,雖然其中有 3 個(gè) embedding vector 被存儲(chǔ)在 GPU 1 上,但是以一種對(duì)用戶透明的方式,在 GPU 0 上拿到了對(duì)應(yīng)的 vector。在用戶看來,就好像整個(gè) embedding table 都存在 GPU 0 上一樣。

4. Backward

在 backward 中,每個(gè) GPU 會(huì)得到和 input 的 key 所對(duì)應(yīng)的梯度,也就是數(shù)據(jù)并行的梯度。此時(shí)的梯度對(duì)應(yīng)的 embedding vector 可能并不在當(dāng)前 GPU 上,所以還需要做一步梯度的交換。這個(gè)步驟和 output dispatcher 的第三步驟中的工作流程的路徑完全相同,只是方向相反。仍然以前面的例子舉例,GPU 0 獲取了 key [0, 1, 3, 5]的梯度,我們把它們分別叫做 grad0, grad1, grad3, grad5;由于 grad1,grad3,grad5 對(duì)應(yīng)的 embedding vector 在 GPU 1 上,所以我們把它們和 GPU 1 上的 grad4, grad6 進(jìn)行交換,最終在得到了 GPU 0 上的梯度為[grad0, grad4, grad6],GPU 1 上的梯度為[grad1, grad3, grad5, grad5, gard7]。

結(jié)語(yǔ)

以上就是 SOK 將數(shù)據(jù)并行轉(zhuǎn)化為模型并行再轉(zhuǎn)回?cái)?shù)據(jù)并行的過程,這整個(gè)流程都被封裝在了 SOK 的 Embedding Layer 中,用戶可以直接調(diào)用相關(guān)的 Python API 即可輕松完成訓(xùn)練。

原文標(biāo)題:Merlin HugeCTR Sparse Operation Kit 系列之二

文章出處:【微信公眾號(hào):NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    4862

    瀏覽量

    102722
  • 計(jì)算
    +關(guān)注

    關(guān)注

    2

    文章

    442

    瀏覽量

    38706
  • SOK
    SOK
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    6325

原文標(biāo)題:Merlin HugeCTR Sparse Operation Kit 系列之二

文章出處:【微信號(hào):NVIDIA-Enterprise,微信公眾號(hào):NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    CPK為什么要大于1.33?一文詳解CPK計(jì)算

    原文標(biāo)題:CPK為什么要大于1.33?一文詳解CPK計(jì)算
    的頭像 發(fā)表于 11-01 11:08 ?171次閱讀

    求助,TAS5731關(guān)于DRC和EQ的寄存器的計(jì)算和設(shè)置問題?

    TAS5731的文檔只描述了寄存器地址,但是并沒有說明這些寄存器如何計(jì)算設(shè)置,文檔里說明參考EVM的設(shè)計(jì)手冊(cè),可是這手冊(cè)中也沒有具體計(jì)算和設(shè)置說明,只是說需要通過GE軟件計(jì)算。并沒有計(jì)算過程
    發(fā)表于 10-28 08:29

    計(jì)算滯回比較器的上下門限電壓

    請(qǐng)教各位大佬,如圖是過欠壓保護(hù)電路,過壓部分和欠壓部分的上下門限電壓怎么計(jì)算呢?以及二極管D6、D8的作用是什么? 如果能給出詳細(xì)計(jì)算過程那就太感激不盡了!?。?
    發(fā)表于 09-20 15:44

    求助,以下恒流源電路Io的計(jì)算表達(dá)式怎么計(jì)算

    這個(gè)恒流源電路Io的計(jì)算表達(dá)式怎么計(jì)算,求給出詳細(xì)計(jì)算過程
    發(fā)表于 08-22 08:16

    SOK在手機(jī)行業(yè)的應(yīng)用案例

    通過封裝 NVIDIA Merlin HugeCTR,Sparse Operation Kit(以下簡(jiǎn)稱 SOK)使得 TensorFlow 用戶可以借助 HugeCTR 的一些相關(guān)特性和優(yōu)化加速 GPU 上的分布式 Embedding 訓(xùn)練。
    的頭像 發(fā)表于 07-25 10:01 ?281次閱讀
    <b class='flag-5'>SOK</b>在手機(jī)行業(yè)的應(yīng)用案例

    簡(jiǎn)述遞歸神經(jīng)網(wǎng)絡(luò)的計(jì)算過程

    、時(shí)間序列預(yù)測(cè)等領(lǐng)域有著廣泛的應(yīng)用。本文將詳細(xì)介紹RNN的計(jì)算過程。 基本概念 1.1 神經(jīng)網(wǎng)絡(luò) 神經(jīng)網(wǎng)絡(luò)是一種受人腦神經(jīng)元結(jié)構(gòu)啟發(fā)的計(jì)算模型,由大量的神經(jīng)元(或稱為節(jié)點(diǎn))組成,這些神經(jīng)元通過權(quán)重連接在一起。每個(gè)神經(jīng)元接收輸入信號(hào),通過激活函數(shù)處理信號(hào),并將處
    的頭像 發(fā)表于 07-05 09:30 ?402次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)計(jì)算過程和步驟

    卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN)是一種深度學(xué)習(xí)模型,廣泛應(yīng)用于圖像識(shí)別、視頻分析、自然語(yǔ)言處理等領(lǐng)域。本文將詳細(xì)介紹卷積神經(jīng)網(wǎng)絡(luò)的計(jì)算過程和步驟
    的頭像 發(fā)表于 07-03 09:36 ?398次閱讀

    TouchGFX 中 MCU 負(fù)載的計(jì)算過程介紹

    從 TouchGFX Desinger 下載的 TBS(TouchGFX Board Setup)大都帶有 MCU 的 負(fù)載計(jì)算功能,那么如何在自己的板子上增加 MCU 負(fù)載計(jì)算功能呢?本文檔參考從 TouchGFX Designer 上下載的 STM32F746 的 T
    的頭像 發(fā)表于 05-24 13:24 ?429次閱讀
    TouchGFX 中 MCU 負(fù)載的<b class='flag-5'>計(jì)算過程</b>介紹

    全志T527芯片詳解計(jì)算性能與高清圖像編解碼

    全志T527芯片詳解計(jì)算性能與高清圖像編解碼
    的頭像 發(fā)表于 05-21 14:37 ?2634次閱讀
    全志T527芯片<b class='flag-5'>詳解</b>:<b class='flag-5'>計(jì)算</b>性能與高清圖像編解碼

    GD32 MCU ADC采樣率如何計(jì)算?

    大家在使用ADC采樣的時(shí)候是否計(jì)算過ADC的采樣率,這個(gè)問題非常關(guān)鍵!
    的頭像 發(fā)表于 01-23 09:29 ?2454次閱讀
    GD32 MCU ADC采樣率如何<b class='flag-5'>計(jì)算</b>?

    stm32啟動(dòng)過程詳解

    STM32啟動(dòng)過程詳解 近年來,STM32微控制器在嵌入式系統(tǒng)中的應(yīng)用越來越廣泛。STM32微控制器具有高性能、低功耗、易擴(kuò)展和豐富的外設(shè)接口等優(yōu)勢(shì)。而要讓STM32微控制器正常工作,首先要了解它
    的頭像 發(fā)表于 12-08 15:47 ?1477次閱讀

    詳解開關(guān)電源RCD鉗位電路工作過程,為什么它能夠吸收能量?

    詳解開關(guān)電源RCD鉗位電路工作過程,為什么它能夠吸收能量?
    的頭像 發(fā)表于 12-06 16:14 ?1132次閱讀
    <b class='flag-5'>詳解</b>開關(guān)電源RCD鉗位電路工作<b class='flag-5'>過程</b>,為什么它能夠吸收能量?

    一個(gè)RC電路計(jì)算過程

    計(jì)算思路如下:總電壓為交流電壓,由基爾霍夫電壓定律找出回路,列出回路電壓方程,R2C3串聯(lián)支路、R5C4串聯(lián)支路的電壓方程。得出中間結(jié)論。
    的頭像 發(fā)表于 11-22 15:13 ?1769次閱讀
    一個(gè)RC電路<b class='flag-5'>計(jì)算過程</b>

    AD8304輸出電壓如何計(jì)算

    下面是AD8304使用自適應(yīng)偏壓再加低通濾波,計(jì)算輸出電壓是否使用,這個(gè)公式呢 我看網(wǎng)上有些計(jì)算是這種,那么下圖實(shí)際計(jì)算過程是怎樣的呢
    發(fā)表于 11-16 06:06

    永磁同步電機(jī)驅(qū)動(dòng)系統(tǒng)的效率Map圖計(jì)算過程

    與電控的高度集成化趨勢(shì),在電機(jī)性能設(shè)計(jì)仿真階段及時(shí)評(píng)估驅(qū)控系統(tǒng)的影響,并獲得更加精確的驅(qū)動(dòng)系統(tǒng)效率Map圖的需求正逐漸成為主流。因此,本文將以某一永磁同步電機(jī)為例,通過Altair Flux和Altair PSIM軟件,說明如何進(jìn)行永磁同步電機(jī)驅(qū)動(dòng)系統(tǒng)的效率Map圖計(jì)算過程
    的頭像 發(fā)表于 11-15 09:19 ?6311次閱讀
    永磁同步電機(jī)驅(qū)動(dòng)系統(tǒng)的效率Map圖<b class='flag-5'>計(jì)算過程</b>