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

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

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

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

NVIDIA英偉達(dá)企業(yè)解決方案 ? 來(lái)源:NVIDIA英偉達(dá)企業(yè)解決方案 ? 2024-07-25 10:01 ? 次閱讀

介紹

通過(guò)封裝 NVIDIA Merlin HugeCTR,Sparse Operation Kit(以下簡(jiǎn)稱 SOK)使得 TensorFlow 用戶可以借助 HugeCTR 的一些相關(guān)特性和優(yōu)化加速 GPU 上的分布式 Embedding 訓(xùn)練。

在以往文章中(Merlin HugeCTR Sparse Operation Kit 系列之一、Merlin HugeCTR Sparse Operation Kit 系列之二)我們對(duì) HugeCTR SOK 的基本功能、性能、用法和原理做了詳細(xì)的介紹。近期 SOK 又發(fā)布了多個(gè)版本迭代,這篇博客對(duì)最新 v2.0 版本中的新特性(尤其是動(dòng)態(tài) Embedding 和在線訓(xùn)練增量導(dǎo)出)、用法進(jìn)行了歸納總結(jié)和介紹,并在最后介紹了 SOK 在手機(jī)行業(yè)的應(yīng)用案例。

5f44f974-48e1-11ef-b8af-92fbcf53809c.png

圖 1. SOK 訓(xùn)練的數(shù)據(jù)并行

- 模型并行-數(shù)據(jù)并行流程

特性

SOK 作為 TensorFlow 的 Plugin,專注于針對(duì) Embedding 的儲(chǔ)存和查詢過(guò)程進(jìn)行優(yōu)化,以下是目前 SOK 提供的主要功能:

提供 Embedding 部分的多機(jī)多卡模型并行功能;

為 Embedding Table 提供了 Hash Table 的功能,并且該 Hash Table 可以將 Embedding Vector 存放到 Device Memory 和 Host Memory 上,充分利用設(shè)備儲(chǔ)存;

為 Embedding Lookup 提供了高性能的 Embedding Lookup Kernel,采用 HugeCTR 的 Cuda Kernel 為后端,F(xiàn)use 多個(gè) Lookup Op 到一個(gè) Lookup Op,提升 Embedding Lookup 性能;

提供增量導(dǎo)出功能,導(dǎo)出某個(gè)時(shí)間點(diǎn)后 Embedding Table 中更新過(guò)的 Key 和 Value,減少訓(xùn)練權(quán)重推送到推理端的開(kāi)銷。

立即使用 SOK

Embedding Table

SOK 基于 TensorFlow 的 Variable 的基礎(chǔ)上,提供了 Variable 和 DynamicVariable 來(lái)儲(chǔ)存 Embedding Table。

不同于 TensorFlow 的 Variable 將數(shù)據(jù)儲(chǔ)存到某個(gè) GPU 中,SOK 的 Variable 可以將數(shù)據(jù)均勻儲(chǔ)存在訓(xùn)練的所有 GPU 上,也可以將數(shù)據(jù)儲(chǔ)存到某一個(gè) GPU 中,下面是使用 SOK 的 Variable 創(chuàng)建儲(chǔ)存在每一個(gè) GPU 和 Variable 儲(chǔ)存到 GPU0 上的例子:

#Defaultmethodofsok.VariableisDistributedmethod,VariableevenlydistributedtoeachGPU
v1 = sok.Variable(np.arange(15 * 16).reshape(15, 16), dtype=tf.float32)


#If you want to assign a sok.Variable to a specific GPU, add the parameter mode=“l(fā)ocalized:gpu_id” when defining sok.variable, where gpu_id refers to the rank number of a GPU in Horovod
v2=sok.Variable(np.arange(15*16).reshape(15,16),dtype=tf.float32,mode="localized:0")

v1 的申請(qǐng)中,SOK 會(huì)自動(dòng)將 v1 的數(shù)據(jù)均勻儲(chǔ)存到訓(xùn)練域中每一個(gè) GPU 上,v2 的申請(qǐng)中,在參數(shù)中添加了mode="localized:0" 這個(gè)字符串參數(shù),SOK 會(huì)將 v2 的數(shù)據(jù)放置在 GPU0 中。

SOK 中提供了 Variable 和 DynamicVariable 兩種不同的形式儲(chǔ)存 Embedding Table。Variable 可以簡(jiǎn)稱為 Static Embedding Table,一個(gè)是靜態(tài)的二維數(shù)據(jù),在申請(qǐng)時(shí)需要確定 Embedding Table 的 Shape,申請(qǐng)結(jié)束后,SOK 會(huì)相應(yīng)申請(qǐng)好數(shù)據(jù)使用的空間(如果 Static Embedding Table 分布在所有 GPU 上,那么所有 GPU 平分這個(gè)空間)。因?yàn)?Static Embedding Table 是一個(gè)靜態(tài)的二維數(shù)組,這也意味著 Lookup 時(shí)查找的 Indice,是無(wú)法超出這個(gè)二維數(shù)組第一個(gè) Dimension 的長(zhǎng)度的,否則會(huì)發(fā)生越界問(wèn)題。

Static Embedding Table,對(duì)于 Lookup Indice 存在范圍限制,很多用戶輸入的 Lookup Indice 又是 Hash 過(guò)的 Key,所以 SOK 提出 DynamicVariable 來(lái)解決 Lookup Indice 范圍限制的問(wèn)題。SOK 的 DynamicVariable 是使用 Hash Table 來(lái)儲(chǔ)存 Embedding Table 的,解決了這個(gè)問(wèn)題。

SOK 的 DynamicVariable 封裝了 2 個(gè)基于 GPU 的 Hash Table(HierarchicalKV 和 Dynamic Embedding Table),其中 HierarchicalKV(以下簡(jiǎn)稱 HKV)是 NVIDIA Merlin 框架下的 Hash Table Repo,它有以下 2 個(gè)特性:

HKV 可以利用 GPU Memory 和 Host Memory 儲(chǔ)存 Embedding Table 中的 Embedding Vector,充分利用訓(xùn)練中的內(nèi)存資源;

HKV 的 Hash Table 擁有 Eviction 功能,Hash Table 滿了后不會(huì)繼續(xù)增長(zhǎng),繼續(xù) Insert 會(huì)淘汰掉最不常用的 Key/Value,提供 LRU、LFU 等常用淘汰策略,也可以自定義淘汰策略。

HKV 的 Repo 地址為 HKV repo,提供了 C++ Level 的 Hash Table API,也為推薦系統(tǒng)提供了組合 API,方便推薦系統(tǒng)用戶使用。SOK 中申請(qǐng) HKV Embedding Table 的代碼如下:

#init_capacityandmax_capacityareparametersacceptedbytheHKVtable.ThemeaningsoftheseparameterscanbefoundintheHKVdocumentation.
v2 = sok.DynamicVariable(
  dimension=16, # embedding vector length
  var_type="hybrid", # use HKV backend
  initializer="uniform", # use uniform distribution random initializer
  init_capacity=1024 * 1024, # The number of embedding vectors allocated initially in the hash table
  max_capacity=1024 * 1024, # The number of embedding vectors allocated finally in the hash table
max_hbm_for_vectors=2,#howmanyGPUmemoryshouldthishashtableuse,unitisGB

從上面代碼可見(jiàn),SOK 申請(qǐng) HKV Hash Table 時(shí),需要設(shè)置一些參數(shù),這些參數(shù)如何設(shè)置可以閱讀 SOK 和 HKV 的文檔。

SOK 的 Variable 和 DynamicVariable 均繼承自 TensorFlow 的 ResourceVariable,除了 SOK 的自己定義的參數(shù)外,讀者和用戶可以按照使用 ResourceVariable 的習(xí)慣添加 ResourceVariable 的參數(shù)。

Embedding Lookup

SOK embedding lookup_sparse 提供與 tf.nn.embedding_lookup_sparse 相似的 API,與 tf.nn.embedding_lookup_sparse 不同的是,SOK 的 embedding lookup_sparse 可以同時(shí)將多個(gè) Lookup Fuse 到一起,代碼如下:

#UseSOKembeddinglookupsparsetodo2embeddinglookups
    emb1, emb2 = sok.lookup_sparse([sok_var1, sok_var2],[keys1, keys2],combiners=["sum", "mean"])
# equals to
    emb1 = tf.nn.embedding_lookup_sparse(v1, indices1, combiner="sum")
emb2=tf.nn.embedding_lookup_sparse(v2,indices2,combiner="mean")

Embedding Table Dump/Load

SOK 關(guān)于 Embedding Table 的權(quán)重提供了 Dump/Load 和增量導(dǎo)出 Incremental Dump 的功能。

Dump/Load 可以自動(dòng)并行的進(jìn)行 Embedding Table 的 Key、Value、Optimizer 中狀態(tài)變量(可選)在文件系統(tǒng)中的讀寫(xiě),將 Embedding Table 的 Key、Value、Optimizer 中的狀態(tài)變量?jī)?chǔ)存成二進(jìn)制文件/從二進(jìn)制文件中讀取,下面是 SOK 中 Dump/Load 的例子:

#optimizerstatesareoptional.IftheyareunspecifiedincallingtheAPIsabove,onlythekeysandvaluesareloaded.
optimizer = tf.keras.optimizers.SGD(learning_rate=1.0)
sok_optimizer = sok.OptimizerWrapper(optimizer)
path = "./weights"
sok_vars = [sok_var1,sok_var2]
sok.dump(path, sok_vars, sok_optimizer)
sok.load(path,sok_vars,sok_optimizer)

在大部分推薦系統(tǒng)業(yè)務(wù)中,Embedding Table 的內(nèi)存占用非常大,因此,在 Continued Training 中,用戶通常會(huì)將訓(xùn)練一段時(shí)間后更新了的 Key 和 Value 推送到推理端,這樣可以避免推送整個(gè) Embedding Table 產(chǎn)生的巨大開(kāi)銷,SOK 同樣提供了 incremental_dump 的 API 來(lái)實(shí)現(xiàn)這個(gè)功能。incremental_dump 接受一個(gè) UTC Time Threshold,可以將 Time Threshold 后更新的 Key/Value 導(dǎo)出到 Numpy Array 中:

#sokincrementaldump
import pytz
from datetime import datetime


#should convert datatime to utc time
utc_time_threshold = datetime.now(pytz.utc)


sok_vars = [sok_var1,sok_var2]
#keys and values are Numpy array
keys,values=sok.incremental_model_dump(sok_vars,utc_time_threshold)

SOK 與 TensorFlow 的兼容性

SOK 目前兼容 TF2 的靜態(tài)圖,但是不支持 TensorFlow 的 XLA,如果開(kāi)啟 TensorFlow 的 XLA,需要手動(dòng)將 SOK 的 Lookup 的 Layer 排除在外,偽代碼如下所示:

@tf.function
def sok_layer(inputs): 
     return sok.lookup_sparse(inputs)


@tf.function(jit_compile=True) 
def xla_layer(inputs): 
     x = xla_layer(inputs) 
returnx

應(yīng)用案例分享

以下是近期 NVIDIA 技術(shù)團(tuán)隊(duì)開(kāi)展的部分手機(jī)行業(yè)推薦場(chǎng)景高性能優(yōu)化項(xiàng)目實(shí)踐經(jīng)驗(yàn)分享:

案例 1:通過(guò) NVIDIA Merlin

HugeCTR SOK 以及 NVTabular

實(shí)現(xiàn)了 GPU 加速的推薦系統(tǒng)

應(yīng)用背景:

客戶的推薦系統(tǒng)是針對(duì)客戶手機(jī)端的廣告和內(nèi)容,該推薦系統(tǒng)之前是使用 CPU PS 架構(gòu)運(yùn)行,客戶希望使用 GPU 架構(gòu)來(lái)進(jìn)行加速。

應(yīng)用方案/效果以及影響:

通過(guò) HugeCTR Sparse Operation Kit + NVTabular 實(shí)現(xiàn)了 GPU 加速的推薦系統(tǒng),性能加速如下:

實(shí)驗(yàn)性能對(duì)比:

SOK 將原有只能單 GPU 訓(xùn)練的任務(wù)擴(kuò)展到多 GPU 訓(xùn)練,并且達(dá)到了很好的弱擴(kuò)展性,支持更大的模型。SOK + tfrecord 3GPU 耗時(shí)約 1.3 個(gè)小時(shí) vs TF + tfrecord 1GPU 耗時(shí)約 3.4 個(gè)小時(shí)。

業(yè)務(wù)性能對(duì)比:

由于業(yè)務(wù)系統(tǒng)輸入數(shù)據(jù)較大,因此客戶采取 Parquet 數(shù)據(jù)格式進(jìn)行 Input 數(shù)據(jù)壓縮,業(yè)務(wù)性能提升如下,NVTabular Load Parquet 耗時(shí)約 1.8 個(gè)小時(shí) vs TF Load Parquet 耗時(shí)約 7.8 個(gè)小時(shí)。

在 SOK 加速的基礎(chǔ)上,NVTabular Parguet Datareader 進(jìn)一步解決了數(shù)據(jù)讀取瓶頸的問(wèn)題,在實(shí)際業(yè)務(wù)測(cè)試中,相比原生 TensorFlow Parquet Datareader 達(dá)到了 400% 的速度提升。

案例 2:通過(guò) NVIDIA Merlin

HugeCTR SOK 實(shí)現(xiàn)了

GPU 加速的推薦系統(tǒng)

應(yīng)用背景:

客戶的推薦系統(tǒng)是針對(duì)客戶手機(jī)端的廣告和內(nèi)容,該推薦系統(tǒng)使用 CPU + PS 和 GPU + PS 的架構(gòu)運(yùn)行。

應(yīng)用方案/效果以及影響:

通過(guò) HugeCTR Sparse Operation Kit 進(jìn)行了 GPU 加速的推薦系統(tǒng)的實(shí)驗(yàn),性能加速如下:

End to End 時(shí)間從 CPU + PS 的 760 毫秒優(yōu)化至 300 毫秒,性能提升約 60%。GPU + PS 的 450 毫秒優(yōu)化至 300 毫秒,性能提升約 33%。

GPU + PS 架構(gòu)的 Embedding 部分耗時(shí)為 250 毫秒,SOK 的 Embedding 部分耗時(shí)為 85 毫秒,性能提升 67%。

5f63d7a4-48e1-11ef-b8af-92fbcf53809c.png

結(jié)束語(yǔ)

SOK v2.0 通過(guò)封裝 HKV 和 HugeCTR 的底層代碼提供了模型并行,且功能完善的動(dòng)態(tài) Embedding Table 和高效的相關(guān)計(jì)算。在多個(gè)業(yè)內(nèi)實(shí)際使用場(chǎng)景中,從速度效率、模型擴(kuò)展、功能完善等角度,使用戶獲得了不錯(cuò)的收益。

關(guān)于作者

康暉

GPU 計(jì)算專家,2022 年加入 NVIDIA,當(dāng)前主要從事 SOK 的設(shè)計(jì)與開(kāi)發(fā)。研究領(lǐng)域包括推薦系統(tǒng)工程實(shí)現(xiàn)與優(yōu)化,通訊優(yōu)化。

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

    關(guān)注

    14

    文章

    4818

    瀏覽量

    102644
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    27

    文章

    4639

    瀏覽量

    128467
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3073

    瀏覽量

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

    關(guān)注

    0

    文章

    5

    瀏覽量

    6323

原文標(biāo)題:借助最新 NVIDIA Merlin TensorFlow 插件實(shí)現(xiàn)大規(guī)模 Embedding 擴(kuò)展

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    GPS在手機(jī)上的定位系統(tǒng)設(shè)計(jì)

    `<p><font face="Verdana"><strong>GPS在手機(jī)
    發(fā)表于 12-18 15:09

    手機(jī)在手,IC我有

    手機(jī)在手,IC我有!一鍵撥號(hào),即刻聯(lián)系供應(yīng)商。洽洽搜搜讓您實(shí)現(xiàn)隨時(shí)隨地找貨、詢價(jià)、報(bào)價(jià)。點(diǎn)擊下載吧!
    發(fā)表于 09-20 10:24

    聲表面濾波器有用在手機(jī)上嗎?

    今天看到一篇文章,有提到聲表面濾波器可以用在智能手機(jī)上,我自己就有銷售聲表面濾波器,但是從培訓(xùn)到現(xiàn)在都沒(méi)聽(tīng)說(shuō)聲表面濾波器可以用在手機(jī)上,那么聲表面濾波器到底能不能用在手機(jī)上呢?具體又是那一款呢?
    發(fā)表于 12-02 21:30

    通過(guò)GPS參數(shù)怎么在手機(jī)地圖上顯示

    用STM32和GPS模塊做了個(gè)手機(jī)短信定位,手機(jī)可以收到GPS參數(shù) ,求大神指導(dǎo)怎么通過(guò)收到的GPS參數(shù)在手機(jī)地圖上顯示位置。。。。
    發(fā)表于 06-13 17:41

    在手機(jī)上采用USB傳輸高清視頻

    高清錄像作為他們的高端產(chǎn)品。在手機(jī)中整合高清視頻將會(huì)進(jìn)一步體現(xiàn)其實(shí)用價(jià)值,因?yàn)樗巡粌H是一個(gè)數(shù)碼相機(jī),還是一個(gè)數(shù)碼攝像機(jī)。把高清錄像放到手機(jī)會(huì)帶來(lái)新的問(wèn)題:如何使高清視頻回放。在手機(jī)上直接回放視頻是很
    發(fā)表于 05-16 10:44

    5G在手機(jī)中的應(yīng)用真實(shí)情況究竟是什么樣的呢?

    引言“預(yù)計(jì)5G 手機(jī)將成為今后十年智能手機(jī)行業(yè)增長(zhǎng)最快的領(lǐng)域?!?G 標(biāo)準(zhǔn)的加速發(fā)展使移動(dòng)運(yùn)營(yíng)商能夠推進(jìn)其5G 部署計(jì)劃,其中一些早期部署將于明年完成。根據(jù)Strategy Analytics 預(yù)測(cè)
    發(fā)表于 07-31 08:26

    應(yīng)用在手機(jī)領(lǐng)域的各類傳感器介紹

    智能手機(jī)之所以被稱之為智能,主要原因是它具備了傳統(tǒng)通訊設(shè)備所沒(méi)有的附加屬性。智能手機(jī)在智能的道路上越走越遠(yuǎn),我們平日里用手機(jī)解決大部分的問(wèn)題,上網(wǎng)、游戲、導(dǎo)航、支付等等,從中受益頗多。在手機(jī)
    發(fā)表于 07-30 08:06

    怎么做到在手機(jī)上自主分析數(shù)據(jù)的?

    看很多人都說(shuō)在手機(jī)上就能分析數(shù)據(jù),還是從自己的立場(chǎng)出發(fā)去調(diào)整報(bào)表,針對(duì)性分析自己關(guān)心的數(shù)據(jù)。這是怎么做到的?用什么數(shù)據(jù)分析工具實(shí)現(xiàn)的?用數(shù)據(jù)可視化工具制作的報(bào)表就可以在手機(jī)端自主分析。也就是上段提到
    發(fā)表于 04-13 10:00

    射頻模塊儀表PXI在手機(jī)生產(chǎn)測(cè)試上的應(yīng)用是什么

    射頻模塊儀表PXI在手機(jī)生產(chǎn)測(cè)試上的應(yīng)用是什么
    發(fā)表于 05-06 09:24

    UWB在手機(jī)中的應(yīng)用是什么

    或者多個(gè)比如三個(gè)以上iPhone 11,才可能給出位置坐標(biāo),或者有別的新技術(shù)?IoT、工業(yè)互聯(lián)網(wǎng)等需要測(cè)距定位的場(chǎng)合,是UWB的用武之地。其實(shí),UWB在IoT中已經(jīng)有了很多應(yīng)用,目前是上升時(shí)期。UWB在手機(jī)中的應(yīng)用,iPho...
    發(fā)表于 07-26 06:39

    如何在手機(jī)上打開(kāi)/啟動(dòng)應(yīng)用程序?

    您希望如何在手機(jī)上打開(kāi)/啟動(dòng)應(yīng)用程序?您會(huì)手動(dòng)啟動(dòng)還是通過(guò)語(yǔ)音命令啟動(dòng)它?
    發(fā)表于 05-04 08:56

    基于ERP在手機(jī)制造行業(yè)中的應(yīng)用

    近些年來(lái),國(guó)內(nèi)手機(jī)制造行業(yè)的發(fā)展極其迅猛,產(chǎn)品的質(zhì)量和數(shù)量都有了大幅度的提升,相當(dāng)一部分優(yōu)勢(shì)企業(yè)已開(kāi)始問(wèn)鼎國(guó)際市場(chǎng)并取得了不俗的戰(zhàn)績(jī)。但是近兩年,受美日經(jīng)濟(jì)增速減緩的影響,國(guó)內(nèi)的手機(jī)制造行業(yè)
    發(fā)表于 09-23 16:18 ?0次下載
    基于ERP<b class='flag-5'>在手機(jī)</b>制造<b class='flag-5'>行業(yè)</b>中的應(yīng)用

    機(jī)器人在手機(jī)行業(yè)的應(yīng)用

    很多的顧慮。 目前,手機(jī)行業(yè)對(duì)于機(jī)器人的使用要求,主要呈現(xiàn)出以下幾個(gè)特點(diǎn)。 首先,機(jī)器人可使用環(huán)節(jié)眾多,但要求精度高。 據(jù)了解,手機(jī)的自動(dòng)化產(chǎn)線分為組裝線和配件生產(chǎn)線,光是組裝就有上百道工序,而現(xiàn)
    發(fā)表于 09-29 17:09 ?0次下載
    機(jī)器人<b class='flag-5'>在手機(jī)</b><b class='flag-5'>行業(yè)</b>的應(yīng)用

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

    在上期文章中,我們對(duì) HugeCTR Sparse Operation Kit (以下簡(jiǎn)稱SOK) 的基本功能,性能,以及 API 用法做了初步的介紹,相信大家對(duì)如何使用 SOK 已經(jīng)有了基本的了解
    的頭像 發(fā)表于 06-14 11:34 ?1412次閱讀

    了解SOK的原理

      以上就是 SOK 將數(shù)據(jù)并行轉(zhuǎn)化為模型并行再轉(zhuǎn)回?cái)?shù)據(jù)并行的過(guò)程,這整個(gè)流程都被封裝在了 SOK 的 Embedding Layer 中,用戶可以直接調(diào)用相關(guān)的 Python API 即可輕松完成訓(xùn)練。
    的頭像 發(fā)表于 08-15 15:22 ?1775次閱讀
    了解<b class='flag-5'>SOK</b>的原理