ios yymodel 將字典轉數組模型_TensorNet——基于TensorFlow的大規模稀疏特征模型分布式訓練框架

TensorNet是什么?

TensorNet是一個構建在TensorFlow之上針對廣告推薦等大規模稀疏場景優化的分布式訓練框架。TensorNet的目標是讓所有使用TensorFlow的開發者可以快速的、方便的訓練出稀疏參數超過百億的超大模型。

訓練帶有大規模稀疏特征模型的主要挑戰

在廣告、搜索、推薦等場景下的深度模型都會存在大量的高維離散稀疏特征,訓練帶有高維稀疏特征的模型主要有兩個問題:

  1. 訓練樣本規模大。比如對于360廣告場景會有超過100TB的訓練數據。
  2. 模型參數多。比如對于360廣告場景會有超過100億的參數。

使用單機模式訓練模型速度慢,耗時長,嚴重制約了模型的迭代速度,使用分布式訓練已經成為業界標準。

使用TensorFlow訓練稀疏特征模型的主要問題

TensorFlow是最受開發者歡迎的深度學習訓練框架,但是TensorFlow對訓練帶有大規模稀疏特征的模型不太友好,主要問題有:

  1. TensorFlow支持的特征維度有限。一般的,TensorFlow需要對每一個特征定義一個矩陣,這個矩陣受限于內存,往往不能太大。
  2. TensorFlow2.x對參數服務器的支持較少,使用同步訓練的模式會比較慢。

TensorNet——基于TensorFlow的專為大規模稀疏特征模型優化的分布式訓練框架

TensorNet在復用TensorFlow的所有功能的基礎之上,專門定制使其支持大規模稀疏特征模型的訓練。TensorNet的主要提升包括:

  1. 使TensorFlow支持的稀疏特征的維度接近于無限
  2. 使TensorFlow2.2 keras支持基于參數服務器的異步訓練模式,極大的提升了訓練速度。在360真實業務場景下我們將原來的離線訓練時間由3.5小時提升到了25分鐘
  3. 配合TensorNet通過split graph的方法可以對在線推理的性能進行優化。在360真實場景測試中我們發現有近 35% 的性能提升。

TensorNet分布式訓練架構

TensorNet支持異步和同步模式訓練。異步模式在僅有CPU的集群中速度提升十分顯著,同步模式在網卡速度超過100GbE的GPU集群中表現突出。

TensorNet異步訓練架構

在僅有CPU的集群中使用參數服務器的異步訓練模式是訓練模型速度最快的方法,TensorNet異步訓練架構與TensorFlow的異步訓練架構有很大的區別:

  1. TensorNet將sparse參數和與dense參數分別使用不同的parameter server管理。
  2. TensorNet不設單獨的parameter server節點。在每個worker中都會維護一個sparse paramter server和dense parameter server。這省去了開發人員管理ps節點和worker節點的不少麻煩。
  3. TensorNet對sparse參數使用分布式哈希表按照哈希值均勻分布不同的節點上。這相較于TensorFlow需要讓開發者根據自身情況將tensor分布在不同的ps節點上的方法更加靈活,這不僅減小了節點通信熱點的概率,還減輕了開發者的工作量。
  4. TensorNet將模型的所有dense參數合并后使用分布式數組切分到不同的機器上,每次pull和push參數的時候只有一次網絡請求。相較于TensorFlow對每個tensor都有一次網絡請求的方法極大的減少了網絡請求的次數從而提升了模型訓練的速度。

v2-3dde8b6813c58daba73bf5d4bbca6cc1_b.jpg
TensorNet異步訓練架構

TensorNet同步訓練架構

TensorNet同步訓練架構基本與TensorFlow的MultiWorkerMirroredStrategy架構一致,主要區別如下:

  1. TensorNet使用單獨的sparse parameter server節點保存所有sparse參數。通過parameter server可以解決TensorFlow支持的sparse特征維度不能太大的問題。
  2. TensorNet對sparse參數做了特殊的定制化的同步。TensorNet在訓練時由于每個batch內的sparse參數的`IndexedSlices`指向的內容與TensorFlow默認的不同,我們對此做了定制化的同步。

v2-8a3fc77860b1ac3f26b2427bdbc6657a_b.jpg
TensorNet同步訓練架構

TensorNet核心優化

TensorNet最核心的優化是將模型的embedding tensor優化到了最小。如下圖所示,對于最簡單的wide&deep模型,如果在一個廣告系統中有3億用戶,那么就需要定義一個維度為3億的embedding矩陣,在訓練模型時需要在這個3億維的矩陣上做embedding_lookup得到當前batch內的用戶的embedding信息,近而在embedding之上做更加復雜的操作。

v2-fac431bcd2089b781e84b3917a862526_b.jpg
TensorFlow中的實現

TensorFlow中的實現在高維稀疏場景下,embedding矩陣太大,占用內存多。很顯然當特征較多的時候單機無法存儲整個模型。

TensorNet使用一個較小的,可以容納特征在一個batch內所有數據的embedding矩陣代替TensorFlow默認實現中需要定義的較大的embedding矩陣

如下圖所示,在batch_size設置為1024的場景下,對于用戶id特征,在TensorNet中只需要定義一個維度為1024的embedding矩陣,TensorNet的主要處理步驟如下:

  1. 定義模型時定義userid的embedding矩陣的維度為一個batch內所有用戶id個數的最大值。
  2. 訓練模型時得到當前batch內的所有用戶id。
  3. 將用戶id排序,并按照先后順序為每個userid分配索引,索引從0開始,對應為下圖中的virtual sparse feature
  4. 使用userid從parameter server中獲取相應的embedding向量,然后按照其對應的索引放置到embedding矩陣中。
  5. 使用轉換后的virtual sparse feature作為模型的輸入。

v2-3310b6d506a2ca1f73e746c26a57d1a1_b.jpg
TensorNet中的實現

從上述可見,TensorNet由于極大的減小了模型所需要的embedding矩陣,從而可以極大的減小內存的開銷,以及通過parameter server的方式使得稀疏特征的維度可以支持到接近無限維,從而可以極大的提升模型的刻畫能力。

TensorNet Inference優化

由于TensorNet只更改了模型的第一層,從而模型的inference也變得極其簡單。

在使用TensorNet構造模型的時候,可以將模型切分為兩部分,如下圖所示,embedding_lookup_graph只在離線訓練時使用,在線inference時只需要將sparse embedding導出成字典供inference_graph作為輸入即可,具體的請參考以下系列文章:

1. 為inference準備——模型切分: https://github.com/Qihoo360/tensornet/blob/master/doc/tutorial/03-split-to-sub-graph.ipynb

2. 使用XLA方式進行在線預估: https://github.com/Qihoo360/tensornet/blob/master/doc/tutorial/04-deploy-tf-graph-online.ipynb

3. sparse embedding字典導出: https://github.com/Qihoo360/tensornet/blob/master/doc/tutorial/05-export-sparse-feature-embedding.ipynb

v2-196d6ee523e927f6804e282d735b6bf7_b.jpg
TensorNet中split graph inference方案

TensorNet中split graph inference方案

在360內部場景中我們測試發現通過split graph配合XLA AOT的方法性能提升近35%

TensorNet開源及使用

TensorNet已經成功落地應用到了360廣告ctr預估相關的場景中,并取得了顯著的效果,我們已將代碼、文檔及我們在360廣告的應用經驗全部整理到了項目中,歡迎關注。

tensorNet主頁:https://github.com/Qihoo360/TensorNet

tensornet快速上手:https://github.com/Qihoo360/tensornet/blob/master/doc/tutorial/01-begin-with-wide-deep.ipynb

更多文檔請看:https://github.com/Qihoo360/TensorNet/README.md

聯系方式:張彥升(zhangyansheng@360.cn),姚磊(yaolei@360.cn)

微信交流群:

https://weixin.qq.com/g/AQYAAB0H54Ncc-QyDTtKD2l-4V19WXGdpbUfFa6QqwS8NphK5kZ5tWAD0_c342jf (二維碼自動識別)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396901.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396901.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396901.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql 索引及索引創建原則

是什么 索引用于快速的查詢某些特殊列的某些行。如果沒有索引, MySQL 必須從第一行開始,然后通過搜索整個表來查詢有關的行。表越大,查詢的成本越大。如果表有了索引的話,那么 MySQL 可以很快的確定數據的位置,而不用查…

php文件怎么制定編碼格式,php文件編碼格式對結果有影響

最近弄個小網站,發現windows下的文件上傳到linux服務器上后,出現了標簽錯亂的問題。比如,我的代碼是:print testtest;但是,瀏覽器的解析格式缺成了下面的樣子:testtest進過不停地搜索,發現了問題所在&#…

【鏈表】Add Two Numbers

題目: You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. Input: (2 -> 4 -> 3) (5…

我們為何要使用多線程,它有什么優點?

其實在平時的開發中,很多程序員都不會去寫線程,為啥?因為麻煩,其次是用到的地方并不多,除非逼不得已,大家都不會去寫,畢竟寫一天代碼,拿一天工資,是吧? 麻煩歸…

ecs服務器數據遷移_如何非常方便地從Windows文件服務器把數據完整地遷移到ONTAP Select...

這是一個續篇,如果你依然愛你的Windows文件服務器或者使用Windows文件服務沒有任何問題的話,請忽略我。續自:從Windows文件服務器,到ONTAP Select軟件定義存儲感謝聯想凌拓合作伙伴新銳英誠的幫助,我們成功地做到了從海…

yum第三方安裝-軟件包沒簽名及更新錯誤

yum安裝時 后面加 --nogpgcheck 阿里云源文件:http://mirrors.aliyun.com/repo/Centos-7.repo epel repo源:http://mirrors.aliyun.com/repo/epel-7.repo yum update 錯誤提示 Error: initscripts conflicts with centos-release-7-4.1708.el7.centos.x8…

oracle觸發和存儲過程,Oracle存儲過程與觸發器

Oracle存儲過程與觸發器存儲過程存儲過程最直接的理解:就是保存了批量的sql(select,insert,if for),以后可以通過一個名字把這些批量的sql執行,使用存儲過程在大批量數據查詢或計算時會帶來高性能,存儲過程編寫和調試比較復雜&…

(hdu 簡單題 128道)平方和與立方和(求一個區間的立方和和平方和)

題目:平方和與立方和Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 108212 Accepted Submission(s): 34915Problem Description給定一段連續的整數。求出他們中全部偶數的平方和以及全部奇數的立方…

企業高可用切換的說明

企業的應用場景,基本上都離不開高可用,不管是windows下自帶的集群軟件,或者是Linux下的heartbeat,keepalived等,AIX下的hacmp等。-----------------------------引用老男孩老師對高可用切換的說明--------------------…

swift int轉string_Swift集合類型協議淺析(下)

關注【搜狐技術產品】公眾號,第一時間獲取技術干貨導讀本篇是Swift集合類型協議淺析系列文章的下篇,在這篇文章中,我們將繼續圍繞集合類型協議展開討論,側重點更多地關注于String相關的周邊協議。StringProtocol代表一個字符串&am…

50 jQuery綁定事件 阻止默認事件發生 內置動畫 each data

主要內容 1 阻止后續事件繼續執行 return false: 常用于表單提交 event.preventDefault : 阻止默認事件發生 <body> <form action""><input type"text" id"t1"><input type"submit" class"s1" id&qu…

oracle視圖執行腳本,Sh腳本中查詢Oracle v$視圖時需要在$號前加轉義符“\”

DBA經常會部署一些sh腳本登陸Oracle數據庫查詢v$動態視圖得到一些東西來實際管理自動化的目的&#xff0c;但在sh腳本中寫ORACLE SQL語句時&#xff0c;如果語句查詢v$視圖&#xff0c;直接寫v$XXXX是不能成功的&#xff0c;shell會將$當成一個參數來處理。以下面一段簡單的sh腳…

Linux下實現視頻讀取(二)---camera參數設定

Camera的可設置項極多&#xff0c;V4L2 支持了不少。但Sam之前對這些設置的使用方法和涵義都是在看videodev2.h中邊看邊理解。感覺很生澀。直到寫這篇blog時&#xff0c;才發現v4l2有專門的SPEC來說明&#xff1a; http://www.linuxtv.org/downloads/legacy/video4linux/API/V4…

微信小程序頁面跳轉與返回并回傳數據

2019獨角獸企業重金招聘Python工程師標準>>> A頁面&#xff1a; .wxml文件 <view class"flex-wrp"><text style"width: 32%;">選擇城市</text><input style"width: 68%;" type"text" bindtap"ci…

地址欄 輸入 參數 刷新參數丟失_小米11 Pro屏幕參數曝光:2K屏幕+120Hz刷新率

本周一&#xff0c;高通已經宣布將于12月初舉行的驍龍技術峰會上正式發布新一代旗艦處理器——驍龍875。根據此前的曝光消息&#xff0c;小米11系列將首發搭載這顆芯片&#xff0c;網上也已經開始對這款新機進行曝光。日前&#xff0c;海外知名論壇XDA在MIUI 12的代碼中發現了一…

Cypress EZ-USB FX3 DMA模式下的串口通訊

由于公司設備升級后出了問題&#xff0c;需要對USB驅動進行修改&#xff0c;原本使用的是寄存器模式進行UART傳輸&#xff0c;但是由于FX3寄存器模式會出現長時間延時等待的問題&#xff0c;不得不對其傳輸模式進行修改。雖然賽普拉斯的EZ-USB FX3系列芯片功能強大&#xff0c;…

php如何寫一個能讓外部訪問的接口,如何寫一個接口供外界訪問

在工作的時候經常調用別人的接口&#xff0c;獲取數據&#xff0c;然后就想知道這中間的原理是什么呢&#xff1f;今天上一個自己寫的一個測試例子&#xff1a;首先是自己遠程寫好的一個接口&#xff1a;public function testming(){$arrarray(first > 1,hospitalname > …

win10遠程桌面連接

有的情況下&#xff0c;Win10設置了允許遠程桌面連接后&#xff0c;遠程主機仍然不能桌面連接到目標主機上&#xff0c;這時可以在目標主機上嘗試如下修改&#xff1a; 開始-->運行->gpedit.msc->計算機配置->Windows設置->安全設置->本地策略->安全選項-…

10494,沒過,待解決,大數除法

10494,沒過,待解決,大數除法 import java.io.*; import java.util.*;public class Main {public static void main(String[] args) throws FileNotFoundException{// Scanner scanner new Scanner(new File("d://1.txt"));Scanner scanner new Scanner(System.in);…

springboot md5加密_實在!基于Springboot和WebScoket,寫了一個在線聊天小程序

基于Springboot和WebScoket寫的一個在線聊天小程序(好幾天沒有寫東西了&#xff0c;也沒有去練手了&#xff0c;就看了看這個。。。)項目說明此項目為一個聊天的小demo&#xff0c;采用springbootwebsocketvue開發。其中有一個接口為添加好友接口&#xff0c;添加好友會判斷是否…