https://mp.weixin.qq.com/s?src=11timestamp=1509090286ver=477signature=cgdv6tbrM5s58sUA9FGT7bBpm*a
機(jī)器學(xué)習(xí)與微博:TensorFlow在微博的大規(guī)模應(yīng)用與實(shí)踐
??AI前線 作者|何滄平編輯|陳思TensorFlow 在微博業(yè)務(wù)中有豐富的應(yīng)用場(chǎng)景,文字、圖片、視頻,各具特色。微博機(jī)器學(xué)習(xí)平臺(tái)集成 TensorFlow 服務(wù),支持分布式訓(xùn)練,在廣告點(diǎn)擊預(yù)測(cè)應(yīng)用中,本輪分享的主講人何滄平積累了一些 TensorFlow 優(yōu)化經(jīng)驗(yàn),在 8 月 3 日晚 AI 前線社群分享活動(dòng)中,他將自己的這些經(jīng)驗(yàn)分享給了大家。本文首發(fā)于 InfoQ 垂直公眾號(hào) AI 前線。借 AI 前線提供的交流機(jī)會(huì),我給各位匯報(bào)一下 TensorFlow 在微博的使用情況和在分布式計(jì)算上的一點(diǎn)經(jīng)驗(yàn),錯(cuò)誤疏漏不足之處,敬請(qǐng)批評(píng)指教。
TensorFlow 在微博的應(yīng)用場(chǎng)景??
今天的分享內(nèi)容由虛到實(shí),由概括到具體。
微博的日活和月活數(shù)量都在增長(zhǎng),移動(dòng)端比例很高,占 91%。2017 年 4 月份的財(cái)報(bào)顯示,營(yíng)收同比增漲 67%,一個(gè)重要原因就是移動(dòng)端搶到了用戶的碎片時(shí)間。
微博里隨處可見(jiàn)推薦信息:推薦的新聞、推薦的視頻、推薦的新賬號(hào)。最重要還有推薦的廣告。
用戶登錄以后,立刻就要計(jì)算推薦什么內(nèi)容。拿推薦廣告來(lái)說(shuō),備選的廣告數(shù)以萬(wàn)計(jì),需要排序給出最可能被點(diǎn)擊的幾條廣告。
如果切中用戶的購(gòu)買需要,廣告就不再是打擾。
垃圾嚴(yán)重影響用戶體驗(yàn),色情、暴力、反動(dòng)、低俗,寧可錯(cuò)殺不可漏網(wǎng),十分嚴(yán)格。
人工智能反垃圾的目標(biāo)是提高準(zhǔn)確度、降低成本。
圖像質(zhì)量也是用戶體驗(yàn)的基本要求。
用戶可以容忍不感興趣的圖片,但很難容雜亂的圖像。
例如左邊的美女圖,看起來(lái)賞心悅目,手機(jī)上刷過(guò),即使不停下細(xì)看,也不會(huì)反感。
右邊的圖片,里面也是美女,但加上文字之后,立刻變得雜亂,版式與酒店里的小卡片相仿。很可能被認(rèn)定為騙子。
明星是微博制勝的法寶。明星是公眾人物,話題多、熱度高、影響力大。明星粉絲狂熱,消費(fèi)力強(qiáng)。
為粉絲推薦她他喜歡的明星的行程、事件、各種評(píng)價(jià),粉絲愛(ài)看。甚至明星代言的廣告,粉絲可能都會(huì)喜歡。停留在微博的時(shí)間越長(zhǎng),有意無(wú)意瀏覽的廣告就越多。正確識(shí)別明星就很重要了,如果不巧推薦了用戶討厭的明星,可能就沒(méi)了刷微博的心情。
明星臉識(shí)別是微博的特色,有海量的明星圖片,也有巨大的識(shí)別需求。
明星臉識(shí)別有特別的困難:常用人臉識(shí)別研究所用的照片表情、造型較少,不同人之間的差別較大。而明星表情豐富,造型多變,無(wú)論男女都化妝!不少人妝容近似,有些整容臉連人腦都傻傻分不清,計(jì)算機(jī)就更難分清了。
上部的圖片可能歸屬兩個(gè)及以上類別,因此稱為“兼類”。
圖片、視頻分類的最終目的都是為了關(guān)聯(lián)廣告。喜歡旅游的用戶就給她他推薦旅游景點(diǎn)、線路、酒店、機(jī)票、戶外裝備等。
如果廣告能夠切中用戶本來(lái)就要買的物品,就不必費(fèi)盡心機(jī)說(shuō)服用戶購(gòu)買不必要的商品,只需要將購(gòu)買場(chǎng)所由一個(gè)地點(diǎn)(網(wǎng)站、實(shí)體店)轉(zhuǎn)移到另一個(gè)地點(diǎn),將購(gòu)買時(shí)間由將來(lái)轉(zhuǎn)移到現(xiàn)在,將商品品牌由 A 切換為 B。這樣廣告效果自然會(huì)好很多,點(diǎn)擊率高,用戶還不反感。
例如,印度電影《三個(gè)白癡》中幾次提到太空筆,我當(dāng)時(shí)就特別想買一支,在京東上搜了半個(gè)小時(shí)。如果能夠提前識(shí)別到這個(gè)廣告點(diǎn),并在播放過(guò)程中推薦購(gòu)買鏈接,很可能立即就下單了。
但是,圖像分類難,視頻精細(xì)分類更難,又不得不分。短視頻(5 分鐘以內(nèi))方興未艾,變現(xiàn)模式還不成熟,處于燒錢階段。相對(duì)于文本、圖片,短視頻的帶寬成本更高,消耗的用戶時(shí)間更多。如果關(guān)聯(lián)廣告的轉(zhuǎn)化率不高,入不敷出,無(wú)法長(zhǎng)久。
TensorFlow 在微博的應(yīng)用技術(shù) & 案例??務(wù)虛內(nèi)容結(jié)束,下面是具體點(diǎn)的技術(shù)。
微博機(jī)器學(xué)習(xí)平臺(tái)承擔(dān)了離線訓(xùn)練和在線預(yù)測(cè)任務(wù)。微博實(shí)時(shí)產(chǎn)生的文本、圖片、視頻顯示后轉(zhuǎn)入后臺(tái),用于提取特征、離線訓(xùn)練。
越來(lái)越多的業(yè)務(wù)使用深度學(xué)習(xí)方法,TensorFlow/Caffe 框架被集成進(jìn)來(lái)。
離線訓(xùn)練主要使用 GPU 機(jī)群。由于業(yè)務(wù)增長(zhǎng)過(guò)快,計(jì)算機(jī)群有一部分來(lái)自阿里云。
這一頁(yè)完全是個(gè)人理解。
對(duì)規(guī)模巨大的訓(xùn)練任務(wù),TensorFlow 提供了分布式的模式。
TensorFlow 分布式計(jì)算與 HPC 的 MPI(Message Passing Interface) 分布計(jì)算區(qū)別很大。用過(guò) MPI 的人都知道,MPI 進(jìn)程相互平等,保證沒(méi)有瓶頸進(jìn)程。MPI-IO 也設(shè)計(jì)得每個(gè)主機(jī)都能均勻分擔(dān) IO 壓力。MPI 進(jìn)程上的計(jì)算任務(wù)也要求均勻劃分,保證各個(gè)進(jìn)程的計(jì)算進(jìn)度保持一致。MPI 進(jìn)程之間也只交換數(shù)據(jù)塊的邊界,盡量減少網(wǎng)絡(luò)流量,壓縮通信時(shí)間。
TensorFlow 的分布式計(jì)算設(shè)計(jì)得簡(jiǎn)單粗暴。
若干參數(shù)服務(wù)器 (parameter server) 和若干勞工 (worker) 組成一個(gè)機(jī)群 (cluster),勞工承擔(dān)運(yùn)算任務(wù),將每步運(yùn)算得到的參數(shù)(權(quán)重和 bias)提交給參數(shù)服務(wù)器,參數(shù)服務(wù)器將來(lái)自所有 worker 的參數(shù)合并起來(lái),得到全局參數(shù),然后將全局參數(shù)發(fā)送給勞工。勞工在全局參數(shù)的基礎(chǔ)上繼續(xù)下一步運(yùn)算。
TensorFlow 采用主從模式,參數(shù)服務(wù)器是瓶頸。每步都要傳遞所有的參數(shù),網(wǎng)絡(luò)流量太大,假設(shè)每個(gè)勞工上參數(shù)占用內(nèi)存 1GB,機(jī)群包含 1 個(gè)參數(shù)服務(wù)器和 10 個(gè)勞工,那么每個(gè)迭代步將產(chǎn)生 20GB 的網(wǎng)絡(luò)流量,按照 10GbE 網(wǎng)絡(luò)計(jì)算,通信時(shí)間至少需 16 秒。而實(shí)際上,每個(gè) batch 數(shù)據(jù)的運(yùn)算時(shí)間可能還不足 1 秒,模型參數(shù)占用的內(nèi)存可能遠(yuǎn)大于 1GB。從理論分析來(lái)看,TensorFlow 分布式運(yùn)算的效率不如 MPI。
有人說(shuō)深度學(xué)習(xí)只是高性能計(jì)算的一個(gè)特殊應(yīng)用,我認(rèn)為不是這樣。
如圖中表格所列,TensorFlow 機(jī)群就與 HPC 機(jī)群有重大區(qū)別。
HPC 機(jī)群的 3 大特點(diǎn):高性能計(jì)算芯片(高端 CPU、GPU)、高速網(wǎng)絡(luò)、并行存儲(chǔ)。TensorFlow 機(jī)群只需要其中的 1 個(gè):高端 GPU。
勞工在一批數(shù)據(jù)上訓(xùn)練得到?W 和?b(合稱為?P),稱為一步訓(xùn)練。
如上圖所示,所有的勞工(Device A/B/C)在完成一步訓(xùn)練后,暫停訓(xùn)練,將自己得到的?P 發(fā)送到參數(shù)服務(wù)器(Parameter Device)。參數(shù)服務(wù)器一直等待,直到來(lái)自所有的勞工的參數(shù)變化量?P 都接收成功。參數(shù)服務(wù)器將所有的?P 相加取平均,然后用這個(gè)均值更新舊參數(shù)(更新公式請(qǐng)參見(jiàn)隨機(jī)梯度算法),得到新參數(shù) P,接著將 P 發(fā)送給所有的勞工。勞工在接收到新參數(shù) P 以后,才進(jìn)行下一步的訓(xùn)練。
與用 1 臺(tái)服務(wù)器訓(xùn)練相比,用 N 臺(tái)勞工同時(shí)訓(xùn)練 + 同步更新參數(shù)等價(jià)于將 batch 的規(guī)模擴(kuò)大了 N 倍。具體來(lái)說(shuō),如果用 1 臺(tái)服務(wù)器時(shí),每步訓(xùn)練采用 100 張數(shù)字圖片(batch=100), 那么用 4 個(gè)勞工得到的參數(shù)變化量(即?P)同步更新,就相當(dāng)于每步訓(xùn)練采用 400 張數(shù)字圖片(batch=400)。從而,參數(shù)變化得更平穩(wěn),收斂更快。
同步更新也有缺點(diǎn):整體速度取決于最慢的那個(gè)勞工。如果勞工之間的軟硬件配置差別較大,有明顯的速度差異,同步更新計(jì)算速度較慢。
為了避免勞工有快有慢造成的等待,TensorFlow 提供了異步更新策略。
如圖下部所示,當(dāng)有一個(gè)勞工訓(xùn)練得到一個(gè)參數(shù)變化量?P 時(shí),不妨假設(shè)是圖中的 Device A,該勞工立即將?P 發(fā)送給參數(shù)服務(wù)器。參數(shù)服務(wù)器接收到來(lái)自勞工 Device A 的?P 后,不等待其它的勞工,立即用?P 更新全局參數(shù),得到全局參數(shù) P,緊接著將 P 發(fā)送給勞工 Device A。勞工 Device A 接收到全局參數(shù) P 后,立即開始下一步訓(xùn)練。
由異步更新參數(shù)的過(guò)程可知,它等價(jià)于只用 1 臺(tái)服務(wù)器訓(xùn)練:都是每次用一小批(batch)圖像訓(xùn)練更新參數(shù),只是各批數(shù)據(jù)的上場(chǎng)順序不能事先確定,上場(chǎng)順序由勞工的隨機(jī)運(yùn)行狀態(tài)確定。
剛開始運(yùn)算時(shí),勞工 0(左邊) 先算了 10100 步(對(duì)應(yīng) localstep), 此后勞工 1(右邊)才開始運(yùn)算。這說(shuō)明,在異步運(yùn)算模式下,勞工之間確實(shí)不相互等待。勞工 0 和勞工 1 都運(yùn)算了全局第 10100 步 (global_step_value),說(shuō)明運(yùn)算的剖分并不十分準(zhǔn)確。
2 個(gè)勞工都執(zhí)行了第 13142、13144、13146、13148 步,但都沒(méi)有執(zhí)行 13143、13145、13147 這 3 步。這說(shuō)明 Tensorflow 異步更新的任務(wù)指派會(huì)隨機(jī)出錯(cuò),并不是絕對(duì)不重不漏。所幸隨機(jī)梯度法對(duì)更新順序沒(méi)有要求,少量的錯(cuò)誤對(duì)最終計(jì)算結(jié)果影響不大。
同步更新模式不能真正地同步執(zhí)行,將程序殺死的時(shí)候,2 個(gè)勞工執(zhí)行完的步數(shù)相差很多。勞工 0 本地執(zhí)行了 11023 步之后,全局步數(shù)竟然只有 7072,肯定出錯(cuò)了。
網(wǎng)絡(luò)上也有人報(bào)告了這個(gè)錯(cuò)誤:
https://github.com/tensorflow/tensorflow/issues/9596,
TensorFlow 開發(fā)者已經(jīng)確認(rèn)這是一個(gè)漏洞,但尚未修復(fù)。
?? ?公式預(yù)警。。。。
以 MNIST 手寫數(shù)字識(shí)別為例,上部分公式迭代一步就使用所有 n 個(gè)樣本。
下部公式將所有樣本分割成若干批次(batch)。
TensorFlow 的異步更新,就是不同的勞工使用不同的小批訓(xùn)練樣本來(lái)更新權(quán)重和 bias,不能事先確定每個(gè)勞工的更新順序。具體舉例:假設(shè)有 2 個(gè)勞工執(zhí)行訓(xùn)練任務(wù),勞工 0 負(fù)責(zé)更新奇數(shù)批次樣本 b1/b3/b5…b499,勞工 1 負(fù)責(zé)更新偶批樣本 b2/b4,…,b500。
由于各種隨機(jī)因素,樣本的使用順序可能是 b1àb3àb5àb2àb7àb4à…因?yàn)闃颖镜呐蝿澐直旧砭褪请S機(jī)的,這樣亂序更新仍然是隨機(jī)的,對(duì)最終結(jié)果沒(méi)有什么影響。
TensorFlow 同步更新時(shí),對(duì)所有勞工得到的梯度求平均,然后更新權(quán)重和截距。仍然假設(shè)有 2 個(gè)勞工,它們分別訓(xùn)練第 1 批和第 2 批樣本得到梯度?w1 和?b1 截距分別為?w2 和?b2,同步之后的梯度如圖中所示。
從而,同步更新等價(jià)于一次使用 2m 個(gè)訓(xùn)練樣本,正則化系數(shù)和 batch 大小都擴(kuò)大為原來(lái)的 2 倍而已。如果勞工數(shù)量很多(例如 20 個(gè)),那么同步更新就等價(jià)于一次使用 2000 個(gè)訓(xùn)練樣本,與劃分 batch 的初衷不符。因此,建議不要使用同步更新。
注意公式里紅色的(2m)
下面是一個(gè)具體優(yōu)化案例:
CTR(Click-Through-Rate,點(diǎn)擊通過(guò)率)是營(yíng)收的關(guān)鍵。
對(duì)候選廣告按點(diǎn)擊可能性排序,然后插入到用戶信息流之中。
deepCTR 不完全是特征工程,輸入層與隱層的連接關(guān)系也是不全連接。
千億樣本數(shù)據(jù)近百 TB,為提高效率,采用多人推薦過(guò)的 TensorFlow 隊(duì)列。
個(gè)人理解,隊(duì)列的設(shè)計(jì)初衷很好(如圖中表格所示),但實(shí)際性能很差,GPU 利用率只有 5%。查找原因發(fā)現(xiàn),程序卡在線程同步操作上,而這個(gè)線程同步就來(lái)自于 TensorFlow 隊(duì)列。于是嘗試用別的方式讀取訓(xùn)練樣本文件。
左圖橫軸采用對(duì)數(shù)坐標(biāo)。
隊(duì)列讀以 CSV 帶寬只有極限帶寬的 1/467,隊(duì)列讀取 tfrecord 格式文件帶寬提升至 1.24MB/s,提高至 3.2 倍。由于 tfrecord 格式文件較小,讀完一個(gè)文件的耗時(shí)降低至 15%(272.6/1789.9)。
用 pandas 讀取文件帶寬達(dá)到極限帶寬的 35%。最終舍棄 TensorFlow 隊(duì)列,選用 pandas 讀 CSV 文件。
當(dāng) CSV 文件小于 1/3 內(nèi)存時(shí),直接用 pandas 一次性讀入內(nèi)存。不用 tf 隊(duì)列,數(shù)據(jù)混洗就要程序員自己完成,所幸不麻煩。
對(duì)大于內(nèi)存 1/3 的文件,直接拆分成多個(gè)小文件。需要程序員自行保證均勻使用各個(gè)小文件。
最后給各位匯報(bào)一個(gè)小游戲。
用 MNIST 訓(xùn)練得到的 CNN 網(wǎng)絡(luò)來(lái)識(shí)別漢字,“霸”字被識(shí)別為 1。這點(diǎn)很容易理解,得到的 CNN 網(wǎng)絡(luò)只有 10 個(gè)類別,不得不在 0~9 個(gè)數(shù)字中選一個(gè)。
因?yàn)椤鞍浴弊峙c任何數(shù)字都不像,識(shí)別為任何數(shù)字的“概率”應(yīng)該都不太大吧,例如都小于 0.2(隨便說(shuō)的數(shù)值)。可是實(shí)際情況卻是這樣:0~9 分類對(duì)應(yīng)的概率差別很大,最大接近 0.8,最小接近 0,卷積網(wǎng)絡(luò)識(shí)別漢字的時(shí)候不會(huì)猶豫不決,錯(cuò)得十分堅(jiān)定。
從這個(gè)小實(shí)驗(yàn)里可以發(fā)現(xiàn)幾個(gè)問(wèn)題:
圖像的特征究竟是什么?如果有,如何用這些特征來(lái)區(qū)分不認(rèn)識(shí)的圖像(比如這個(gè)例子里的漢字)?
如何控制一個(gè)網(wǎng)絡(luò)的泛化能力?這個(gè)例子中的泛化能力看起來(lái)太強(qiáng)了,以致于把漢字都識(shí)別成數(shù)字了。目前看來(lái),CNN 的泛化能力幾乎是聽(tīng)天由命。
softmax 后的值真的代表概率嗎?看起來(lái)它們僅僅是和為 1 正數(shù)。概率本質(zhì)的隨機(jī)性體現(xiàn)在哪里呢?
這些問(wèn)題,我還沒(méi)有想明白,這里提出來(lái),請(qǐng)各位朋友批評(píng)指教。
問(wèn)答環(huán)節(jié)???? ?問(wèn)題 1:隊(duì)列讀取性能差是否是由于設(shè)置 cache 的樣本數(shù)問(wèn)題?回答:cache 基本沒(méi)有影響。batch_size 會(huì)有影響,最關(guān)鍵還是線程鎖的問(wèn)題。
?? ?問(wèn)題 2:(反垃圾)這一步的準(zhǔn)確率怎么算的?是模型準(zhǔn)確率嗎?回答:這個(gè)涉及到業(yè)務(wù),不便透露。可以私下交流。
?? ?問(wèn)題 3:千億級(jí)別 feature 沒(méi)有模型并行嗎?感覺(jué)模型單機(jī)放不了,不能數(shù)據(jù)并行。回答:數(shù)據(jù)并行,因此研究分布式運(yùn)算。
?? ?問(wèn)題 4:1 億條評(píng)論的話,你怎么判斷分類器是否分正確了?還是說(shuō)這里的準(zhǔn)確率只是在測(cè)試集上的準(zhǔn)確率?回答:業(yè)務(wù)上具體做法不便透露。這里提醒一下,微博有舉報(bào)、屏蔽功能。
?? ?問(wèn)題 5:微博的 TensorFlow 環(huán)境配置,資源管理和分布式計(jì)算是用的第三方平臺(tái)嗎?還是自己封裝的回答:資源管理和分布式計(jì)算嘗試過(guò)幾種方案,開源軟件 + 自行定制。多種機(jī)群,安全級(jí)別和管理方式不完全一樣,因此資源管理方式(網(wǎng)絡(luò)、存儲(chǔ)、權(quán)限)也不一樣。
?? ?問(wèn)題 6:會(huì)考慮評(píng)價(jià) GPU 的利用率嗎?比如用 deepbench 測(cè)?有什么 GPU 提升利用率的經(jīng)驗(yàn)分享?回答:GPU 利用率是成本核算的重要指標(biāo),很重視。查看 GPU 利用率比較簡(jiǎn)單:命令行 nvidia-smi,英偉達(dá)還有專門的庫(kù),提供輕量級(jí)的 C、JAVA 等接口。
提高 GPU 利用率經(jīng)驗(yàn):如果顯存能裝得下,盡量使用 1 個(gè)模型訓(xùn)練;設(shè)定顯存使用量(例如 0.5),將 2 個(gè)及以上作業(yè)放在同一個(gè) GPU 上。IO 性能差的話,會(huì)導(dǎo)致數(shù)據(jù)供應(yīng)不上,從而 GPU 利用低。PPT 中 deepCTR 優(yōu)化案例就是這個(gè)情況。batch 太小、權(quán)重矩陣過(guò)小,都會(huì)導(dǎo)致不能充分利用 GPU 的大量核心(通常有 4000-5000 個(gè)),利用率低。
?? ?問(wèn)題 7:如果在龐大的 csv 上訓(xùn)練, 用 tf 隊(duì)列和用 spark df 制作生成器的效果有比對(duì)過(guò)么?回答:目前沒(méi)有對(duì)比過(guò) tf 隊(duì)列和 spark df。
作者介紹
何滄平,微博研發(fā)中心算法工程師,目前負(fù)責(zé)建設(shè)深度學(xué)習(xí)平臺(tái)。對(duì)高性能計(jì)算(HPC)較熟悉,著有《OpenACC 并行編程實(shí)戰(zhàn)》一書。如有相關(guān)技術(shù)問(wèn)題可以私下與講師討論,講師微信:272702575
今日薦文
點(diǎn)擊下方圖片即可閱讀
? ? ? ? ? ? ? ? ? ? ? ? ? ??? ??? ?2017 年已經(jīng)過(guò)去 218 天,大數(shù)據(jù)雜談 80 篇精選文章千萬(wàn)別又雙叒叕錯(cuò)過(guò)啦
CNUTCon 全球運(yùn)維技術(shù)大會(huì)將于 9 月 10-11 日在上海舉行,大會(huì)主題是“智能時(shí)代的新運(yùn)維”,并特設(shè)“大數(shù)據(jù)運(yùn)維”專場(chǎng),邀請(qǐng)了來(lái)自騰訊、蘇寧等公司大咖分享他們?cè)谧钚逻\(yùn)維技術(shù)實(shí)踐過(guò)程中遇到的坑與經(jīng)驗(yàn),更有 Google、Uber、eBay、BAT 等一線技術(shù)大牛現(xiàn)場(chǎng)為你解疑答惑,點(diǎn)擊“閱讀原文”了解更多精彩!9 折限時(shí)優(yōu)惠,本文的讀者在報(bào)名時(shí)輸入 CNUTCon666 還可再減 200 哦!
??
微信掃一掃
關(guān)注該公眾號(hào)
總結(jié)
以上是生活随笔為你收集整理的https://mp.weixin.qq.com/s?src=11timestamp=1509090286ver=477signature=cgdv6tbrM5s58sUA9FGT7bBpm*a的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [分享] Ken Lunde《中日韓越資
- 下一篇: http://api.showji.co