微博深度學(xué)習(xí)平臺架構(gòu)和實(shí)踐
隨著人工神經(jīng)網(wǎng)絡(luò)算法的成熟、GPU計算能力的提升,深度學(xué)習(xí)在眾多領(lǐng)域都取得了重大突破。本文介紹了微博引入深度學(xué)習(xí)和搭建深度學(xué)習(xí)平臺的經(jīng)驗,特別是機(jī)器學(xué)習(xí)工作流、控制中心、深度學(xué)習(xí)模型訓(xùn)練集群、模型在線預(yù)測服務(wù)等核心部分的設(shè)計、架構(gòu)經(jīng)驗。微博深度學(xué)習(xí)平臺極大地提升了深度學(xué)習(xí)開發(fā)效率和業(yè)務(wù)迭代速度,提高了深度學(xué)習(xí)模型效果和業(yè)務(wù)效果。
深度學(xué)習(xí)平臺介紹
人工智能和深度學(xué)習(xí)
人工智能為機(jī)器賦予人的智能。隨著計算機(jī)計算能力越來越強(qiáng),在重復(fù)性勞動和數(shù)學(xué)計算方面很快超過了人類。然而,一些人類通過直覺可以很快解決的問題,例如自然語言理解、圖像識別、語音識別等,長期以來很難通過計算機(jī)解決。隨著人工神經(jīng)網(wǎng)絡(luò)算法的成熟、GPU計算能力的提升,深度學(xué)習(xí)在這些領(lǐng)域也取得了重大的突破,甚至已經(jīng)超越人類。深度學(xué)習(xí)大大拓展了人工智能的領(lǐng)域范圍。
深度學(xué)習(xí)框架
深度學(xué)習(xí)框架是進(jìn)行深度學(xué)習(xí)的工具。簡單來說,一套深度學(xué)習(xí)框架就是一套積木,各個組件就是某個模型或算法;開發(fā)者通過簡單設(shè)計和組裝就能獲得自己的一套方案。深度學(xué)習(xí)框架的出現(xiàn)降低了深度學(xué)習(xí)門檻。開發(fā)者不需要編寫復(fù)雜的神經(jīng)網(wǎng)絡(luò)代碼,只需要根據(jù)自己的數(shù)據(jù)集,使用已有模型通過簡單配置訓(xùn)練出參數(shù)。
TensorFlow、Caffe和MXNet是三大主流的深度學(xué)習(xí)開源框架:TensorFlow的優(yōu)勢是社區(qū)最活躍,開源算法和模型最豐富;Caffe則是經(jīng)典的圖形領(lǐng)域框架,使用簡單,在科研領(lǐng)域占有重要地位;MXNet在分布式性能上表現(xiàn)優(yōu)異。PaddlePaddle、鯤鵬、Angel則是百度、阿里、騰訊分別推出的分布式計算框架。
2015年底,Google開源了TensorFlow深度學(xué)習(xí)框架,可以讓開發(fā)者方便地組合CNN、RNN等模塊實(shí)現(xiàn)復(fù)雜的神經(jīng)網(wǎng)絡(luò)模型。TensorFlow是一個采用數(shù)據(jù)流圖(data flow graphs),用于數(shù)值計算的開源軟件庫。
2016年,百度開源了PaddlePaddle(PArallel Distributed Deep LEarning 并行分布式深度學(xué)習(xí))深度學(xué)習(xí)框架。PaddlePaddle具有易用,高效,靈活和可伸縮等特點(diǎn),為百度內(nèi)部多項產(chǎn)品提供深度學(xué)習(xí)算法支持。
深度學(xué)習(xí)平臺
深度學(xué)習(xí)框架主要提供神經(jīng)網(wǎng)絡(luò)模型實(shí)現(xiàn),用于進(jìn)行模型訓(xùn)練。模型訓(xùn)練只是機(jī)器學(xué)習(xí)和深度學(xué)習(xí)中的一環(huán),除此之外還有數(shù)據(jù)輸入、數(shù)據(jù)處理、模型預(yù)測、業(yè)務(wù)應(yīng)用等重要環(huán)節(jié)。深度學(xué)習(xí)平臺就是整合深度學(xué)習(xí)各環(huán)節(jié),為開發(fā)者提供一體化服務(wù)的平臺。深度學(xué)習(xí)平臺能夠加快深度學(xué)習(xí)的開發(fā)速度,縮減迭代周期;同時,深度學(xué)習(xí)平臺能夠?qū)⒂嬎隳芰?、模型開發(fā)能力共享,提升開發(fā)效率和業(yè)務(wù)效果,也能夠?qū)①Y源合理調(diào)度,提高資源利用率。
騰訊深度學(xué)習(xí)平臺DI-X
騰訊深度學(xué)習(xí)平臺DI-X于2017年3月發(fā)布。DI-X基于騰訊云的大數(shù)據(jù)存儲與處理能力來提供一站式的機(jī)器學(xué)習(xí)和深度學(xué)習(xí)服務(wù)。DI-X支持TensorFlow、Caffe以及Torch等三大深度學(xué)習(xí)框架,主要基于騰訊云的GPU計算平臺。DI-X的設(shè)計理念是打造一個一站式的機(jī)器學(xué)習(xí)平臺,集開發(fā)、調(diào)試、訓(xùn)練、預(yù)測、部署于一體, 讓算法科學(xué)家和數(shù)據(jù)科學(xué)家,無須關(guān)注機(jī)器學(xué)習(xí)(尤其是深度學(xué)習(xí))的底層工程繁瑣的細(xì)節(jié)和資源,專注于模型和算法調(diào)優(yōu)。
DI-X在騰訊內(nèi)部使用了一年,其主要用于游戲流失率預(yù)測、用戶標(biāo)簽傳播以及廣告點(diǎn)擊行為預(yù)測等。
阿里機(jī)器學(xué)習(xí)平臺PAI
阿里機(jī)器學(xué)習(xí)平臺PAI1.0于2015年發(fā)布,包括數(shù)據(jù)處理以及基礎(chǔ)的回歸、分類、聚類算法。阿里機(jī)器學(xué)習(xí)平臺PAI2.0于2017年3月發(fā)布,配備了更豐富的算法庫、更大規(guī)模的數(shù)據(jù)訓(xùn)練和全面兼容開源的平臺化產(chǎn)品。深度學(xué)習(xí)是阿里機(jī)器學(xué)習(xí)平臺PAI2.0的重要功能,支持TensorFlow、Caffe、MXNet框架,這些框架與開源接口兼容。在數(shù)據(jù)源方面,PAI2.0支持非結(jié)構(gòu)化、結(jié)構(gòu)化等各種數(shù)據(jù)源;在計算資源方面,支持CPU、GPU、FPGA等異構(gòu)計算資源;在工作流方面,支持模型訓(xùn)練和預(yù)測一體化。
PAI已經(jīng)在阿里巴巴內(nèi)部使用了2年?;谠撈脚_,在淘寶搜索中,搜索結(jié)果會基于商品和用戶的特征進(jìn)行排序。
百度深度學(xué)習(xí)平臺
百度深度學(xué)習(xí)平臺是一個面向海量數(shù)據(jù)的深度學(xué)習(xí)平臺,基于PaddlePaddle和TensorFlow開源計算框架,支持GPU運(yùn)算,為深度學(xué)習(xí)技術(shù)的研發(fā)和應(yīng)用提供可靠性高、擴(kuò)展靈活的云端托管服務(wù)。通過百度深度學(xué)習(xí)平臺,不僅可以輕松訓(xùn)練神經(jīng)網(wǎng)絡(luò),實(shí)現(xiàn)情感分析、機(jī)器翻譯、圖像識別,也可以利用百度云的存儲和虛擬化產(chǎn)品直接將模型部署至應(yīng)用環(huán)境。
微博深度學(xué)習(xí)平臺設(shè)計
微博在Feed CTR、反垃圾、圖片分類、明星識別、視頻推薦、廣告等業(yè)務(wù)上廣泛使用深度學(xué)習(xí)技術(shù),同時廣泛使用TensorFlow、Caffe、Keras、MXNet等深度學(xué)習(xí)框架。為了融合各個深度學(xué)習(xí)框架,有效利用CPU和GPU資源,充分利用大數(shù)據(jù)、分布式存儲、分布式計算服務(wù),微博設(shè)計開發(fā)了微博深度學(xué)習(xí)平臺。
微博深度學(xué)習(xí)平臺支持如下特性:
- 方便易用:支持?jǐn)?shù)據(jù)輸入、數(shù)據(jù)處理、模型訓(xùn)練、模型預(yù)測等工作流,可以通過簡單配置就能完成復(fù)雜機(jī)器學(xué)習(xí)和深度學(xué)習(xí)任務(wù)。特別是針對深度學(xué)習(xí),僅需選擇框架類型和計算資源規(guī)模,就能模型訓(xùn)練。
- 靈活擴(kuò)展:支持通用的機(jī)器學(xué)習(xí)算法和模型,以及用戶自定義的算法和模型。
- 多種深度學(xué)習(xí)框架:目前支持TensorFlow、Caffe等多種主流深度學(xué)習(xí)框架,并進(jìn)行了針對性優(yōu)化。
- 異構(gòu)計算:支持GPU和CPU進(jìn)行模型訓(xùn)練,提高模型訓(xùn)練的效率。
- 資源管理:支持用戶管理、資源共享、作業(yè)調(diào)度、故障恢復(fù)等功能。
- 模型預(yù)測:支持一鍵部署深度學(xué)習(xí)模型在線預(yù)測服務(wù)。
微博深度學(xué)習(xí)平臺架構(gòu)和實(shí)踐
微博深度學(xué)習(xí)平臺是微博機(jī)器學(xué)習(xí)平臺的重要組成部分,除繼承微博機(jī)器學(xué)習(xí)平臺的特性和功能以外,支持TensorFlow、Caffe等多種主流深度學(xué)習(xí)框架,支持GPU等高性能計算集群。微博深度學(xué)習(xí)平臺架構(gòu)如圖1所示。
圖1 微博深度學(xué)習(xí)平臺架構(gòu)
下面將以機(jī)器學(xué)習(xí)工作流、控制中心、深度學(xué)習(xí)模型訓(xùn)練集群、模型在線預(yù)測服務(wù)等典型模塊為例,介紹微博深度學(xué)習(xí)平臺的實(shí)踐。
機(jī)器學(xué)習(xí)工作流WeiFlow
微博深度學(xué)習(xí)和機(jī)器學(xué)習(xí)工作流中,原始數(shù)據(jù)收集、數(shù)據(jù)處理、特征工程、樣本生成、模型評估等流程占據(jù)了大量的時間和精力。為了能夠高效地端到端進(jìn)行深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的開發(fā),我們引入了微博機(jī)器學(xué)習(xí)工作流框架WeiFlow。
WeiFlow的設(shè)計初衷就是將微博機(jī)器學(xué)習(xí)流的開發(fā)簡單化、傻瓜化,讓業(yè)務(wù)開發(fā)人員從紛繁復(fù)雜的數(shù)據(jù)處理、特征工程、模型工程中解脫出來,將寶貴的時間和精力投入到業(yè)務(wù)場景的開發(fā)和優(yōu)化當(dāng)中,徹底解放業(yè)務(wù)人員的生產(chǎn)力,大幅提升開發(fā)效率。
WeiFlow的誕生源自于微博機(jī)器學(xué)習(xí)的業(yè)務(wù)需求。在微博的機(jī)器學(xué)習(xí)工作流中(如圖2所示),多種數(shù)據(jù)流經(jīng)過實(shí)時數(shù)據(jù)處理,存儲至特征工程并生成離線的原始樣本。在離線系統(tǒng),對原始樣本進(jìn)行各式各樣的數(shù)據(jù)處理、特征處理、特征映射,從而生成訓(xùn)練樣本;業(yè)務(wù)人員根據(jù)實(shí)際業(yè)務(wù)場景(排序、推薦),選擇不同的算法模型,進(jìn)行模型訓(xùn)練、預(yù)測、測試和評估;待模型迭代滿足要求后,通過自動部署將模型文件和映射規(guī)則部署到線上。線上系統(tǒng)根據(jù)模型文件和映射規(guī)則,從特征工程中拉取相關(guān)特征,根據(jù)映射規(guī)則進(jìn)行預(yù)處理,生成可用于預(yù)測的樣本格式,進(jìn)行線上實(shí)時預(yù)測,最終將預(yù)測結(jié)果(用戶對微博內(nèi)容的興趣程度)輸出,供線上服務(wù)調(diào)用。
圖2 微博機(jī)器學(xué)習(xí)工作流
為了應(yīng)對微博多樣的計算環(huán)境,WeiFlow采用了雙層的DAG任務(wù)流設(shè)計,如圖3所示。外層的DAG由不同的Node構(gòu)成,每一個Node是一個內(nèi)層的DAG,具備獨(dú)立的執(zhí)行環(huán)境,即上文提及的Spark、TensorFlow、Hive、Storm、Flink等計算引擎。
圖3 WeiFlow雙層DAG任務(wù)流設(shè)計
外層DAG設(shè)計的初衷是利用各個計算引擎的特長,同時解決各個計算引擎間的依賴關(guān)系和數(shù)據(jù)傳輸問題。內(nèi)層的DAG,利用引擎的特性與優(yōu)化機(jī)制,實(shí)現(xiàn)不同的抽象作為DAG中計算模塊之間數(shù)據(jù)交互的載體。
在使用方面,業(yè)務(wù)人員根據(jù)事先約定好的規(guī)范和格式,將雙層DAG的計算邏輯定義在XML配置文件中。依據(jù)用戶在XML指定的依賴關(guān)系和處理模塊,WeiFlow自動生成DAG任務(wù)流圖,并在運(yùn)行時階段調(diào)用處理模塊的實(shí)現(xiàn)來完成用戶指定的任務(wù)流。通過在XML配置文件中將所需計算模塊按照依賴關(guān)系堆疊,即可以搭積木的方式完成配置化、模塊化的流水線作業(yè)開發(fā)。
控制中心WeiCenter
控制中心WeiCenter的目標(biāo)就是簡單、方便、易用,讓大家便利地使用微博深度學(xué)習(xí)平臺。下面將介紹控制中心的作業(yè)管理、數(shù)據(jù)管理和調(diào)度管理等部分。
作業(yè)管理:我們在進(jìn)行深度學(xué)習(xí)、大規(guī)模機(jī)器學(xué)習(xí)、實(shí)時處理的過程中,由于需要各種不同框架的配合使用共同完成一個任務(wù),比如TensorFlow適合進(jìn)行高性能學(xué)習(xí)、Spark適合大規(guī)模億維特征訓(xùn)練、Storm或者Flink適合實(shí)時特征生成以及實(shí)時模型生成等,將這些結(jié)合到一起才能完成從離線訓(xùn)練到線上實(shí)時預(yù)測。以前這需要開發(fā)者去學(xué)習(xí)各種框架復(fù)雜的底層開發(fā),現(xiàn)在通過控制中心選擇不同的作業(yè)類型,可以方便地生成各種類型的作業(yè)任務(wù)。用戶只需要在可視化UI上進(jìn)行作業(yè)類型選擇、數(shù)據(jù)源選擇、輸出目的地選擇或者使用WeiFlow進(jìn)行編程,就能生成一個高大上的深度學(xué)習(xí)或機(jī)器學(xué)習(xí)作業(yè)。
數(shù)據(jù)管理:當(dāng)大數(shù)據(jù)的數(shù)據(jù)量,每天按P級增長,使用人員每天上百人時,數(shù)據(jù)管理就顯得尤為重要。如果模型訓(xùn)練的集群和數(shù)據(jù)所在的集群,不是同一個集群,如何高效地將數(shù)據(jù)同步到模型訓(xùn)練的集群是一個難點(diǎn)。并且在完成模型訓(xùn)練后,能自動根據(jù)訓(xùn)練結(jié)果作出評估,對訓(xùn)練數(shù)據(jù)進(jìn)行刪除。由于使用集群的開發(fā)人員素質(zhì)不齊,你會發(fā)現(xiàn)總是有很多冗余數(shù)據(jù)沒刪除,而且總有無用數(shù)據(jù)生成,這個時候需要一個統(tǒng)一的數(shù)據(jù)管理平臺,去約束大家生成數(shù)據(jù)的同時刪除數(shù)據(jù),去各個平臺上探測長時間無訪問的數(shù)據(jù)并進(jìn)行確認(rèn)清理。
調(diào)度管理:作業(yè)有多種分類,按重要程度分:高、中、低;按占用資源量分:占用多、占用一般、占用少;按調(diào)度器分:Yarn、Mesos、Kubernetes等。Spark、Hadoop利用Yarn調(diào)度解決了優(yōu)先級高的作業(yè)和資源占用多作業(yè)之間的矛盾;TensorFlow利用成熟的Kubernetes或Mesos調(diào)度TensorFlow節(jié)點(diǎn)進(jìn)行GPU集群化任務(wù)管理;普通離線作業(yè)和服務(wù)部署利用Mesos進(jìn)行資源調(diào)度??刂浦行募闪硕喾N調(diào)度器,利用各種成熟的解決方案,簡化了作業(yè)負(fù)責(zé)調(diào)度這一難題。
總之,控制中心負(fù)責(zé)用戶權(quán)限控制、作業(yè)圖依賴管理、數(shù)據(jù)依賴管理等,調(diào)度服務(wù)負(fù)責(zé)具體的作業(yè)執(zhí)行、資源抽象、資源管理??刂浦行暮驼{(diào)度服務(wù)如圖4所示。
圖4 控制中心和調(diào)度服務(wù)
深度學(xué)習(xí)模型訓(xùn)練集群
微博深度學(xué)習(xí)訓(xùn)練集群與傳統(tǒng)HPC集群有重大區(qū)別,分別體現(xiàn)在計算服務(wù)器選型、分布式訓(xùn)練、網(wǎng)絡(luò)設(shè)備、存儲系統(tǒng)、作業(yè)調(diào)度系統(tǒng)。
單機(jī)多GPU卡:深度學(xué)習(xí)模型訓(xùn)練大部分情況下單機(jī)運(yùn)算,且?guī)缀跬耆揽縂PU,因此選用能掛載2/4/8塊GPU的服務(wù)器,盡量提高單機(jī)運(yùn)算能力。
分布式訓(xùn)練:如果訓(xùn)練時間長或者樣本規(guī)模大,超過單臺服務(wù)器能力時,需要支持分布式訓(xùn)練。以TensorFlow分布式運(yùn)行方式為例進(jìn)行說明,如圖5所示。一個TensorFlow分布式程序?qū)?yīng)一個抽象的集群,集群(cluster)由工作節(jié)點(diǎn)(worker)和參數(shù)服務(wù)器(parameter server)組成。工作節(jié)點(diǎn)(worker)承擔(dān)矩陣乘、向量加等具體計算任務(wù),計算出相應(yīng)參數(shù)(weight和bias),并把參數(shù)匯總到參數(shù)服務(wù)器;參數(shù)服務(wù)器(parameter server)把從眾多工作節(jié)點(diǎn)收集參數(shù)匯總并計算,并傳遞給相應(yīng)工作節(jié)點(diǎn),由工作節(jié)點(diǎn)進(jìn)行下一輪計算,如此循環(huán)往復(fù)。
圖5 TensorFlow分布式架構(gòu)
萬兆以太網(wǎng)絡(luò):參數(shù)更新過程中,通信粒度大,而且允許異步通信,對延時沒有嚴(yán)格要求。因此,訓(xùn)練集群沒有選用HPC集群必備的InfiniBand或Omini-Path低延時網(wǎng)絡(luò)設(shè)備,而是選用普通的以太網(wǎng)設(shè)備。
HDFS分布式文件系統(tǒng):TensorFlow分布式工作節(jié)點(diǎn)讀取訓(xùn)練樣本文件時,不同工作節(jié)點(diǎn)讀取的數(shù)據(jù)段不交叉,訓(xùn)練過程中也不會交換樣本數(shù)據(jù)。寫出模型文件也只有某一個工作節(jié)點(diǎn)負(fù)責(zé),不涉及工作節(jié)點(diǎn)間的數(shù)據(jù)交換。因此,深度學(xué)習(xí)訓(xùn)練作業(yè)不要求HPC機(jī)群中常見的并行文件系統(tǒng),只要是一個能被所有工作節(jié)點(diǎn)同時訪問文件系統(tǒng)就可以。實(shí)際上,微博深度學(xué)習(xí)平臺采用HDFS,不但滿足要求,而且方便與其它業(yè)務(wù)共享數(shù)據(jù)。
定制的作業(yè)調(diào)度系統(tǒng):TensorFlow分布式參數(shù)服務(wù)器進(jìn)程不會自動結(jié)束,需要手動殺死,而HPC應(yīng)用中的MPI進(jìn)程同時開始同時結(jié)束。設(shè)計作業(yè)調(diào)度方案時必須考慮這個特點(diǎn),使之能夠在所有工作節(jié)點(diǎn)都運(yùn)行結(jié)束后自動殺死參數(shù)服務(wù)器進(jìn)程。
模型在線預(yù)測服務(wù)WeiServing
模型在線預(yù)測服務(wù)是深度學(xué)習(xí)平臺的一個重要功能。由于微博業(yè)務(wù)場景需求,模型在線預(yù)測服務(wù)并發(fā)量大,對延時、可用性要求極高??紤]到這些業(yè)務(wù)需求以及服務(wù)本身以后的高擴(kuò)展性,微博分布式模型在線預(yù)測服務(wù)WeiServing的架構(gòu)如圖6所示。
圖6 WeiServing-微博分布式模型在線預(yù)測服務(wù)架構(gòu)
特征處理多樣化:模型在線預(yù)測服務(wù)首先要解決的問題是,將在線的原始特征數(shù)據(jù),映射成模型可以處理的數(shù)據(jù)格式?;诖罅康臉I(yè)務(wù)模型實(shí)踐與調(diào)優(yōu),微博機(jī)器學(xué)習(xí)工作流框架WeiFlow抽象出了一套特征處理函數(shù),來提升開發(fā)效率和業(yè)務(wù)效果。WeiServing與WeiFlow在特征處理方面一脈相承,支持一系列特征處理函數(shù),包括piecewise、pickcat、descartes、combinehash等映射函數(shù),對特征進(jìn)行歸一化、離散化、ID化、組合等特征處理。
多模型多版本支持:由于微博業(yè)務(wù)場景多種多樣,不同的業(yè)務(wù)場景對模型與特征有不同的需求,WeiServing支持同一個集群為多個業(yè)務(wù)提供服務(wù),通過docker+k8s進(jìn)行資源隔離與負(fù)載均衡。在相同特征情況下,可以選擇不同的模型算法進(jìn)行處理。另外,對于同一個模型,WeiServing支持在線升級與多版本同時在線,為業(yè)務(wù)灰度測試提供可能。所有的差異化都被映射到配置文件中,通過簡單的配置來完成線上模型的轉(zhuǎn)換。
分布式服務(wù)支持:為了應(yīng)對大規(guī)模模型服務(wù)與在線機(jī)器學(xué)習(xí),WeiServing參考通用的參數(shù)服務(wù)器解決方案,實(shí)現(xiàn)了WeiParam分布式服務(wù)架構(gòu),除了支持傳統(tǒng)的PS功能之外,WeiParam針對在線服務(wù)需求,通過分布式調(diào)度系統(tǒng),提供多副本、高可用、高性能的系統(tǒng)機(jī)制。
多源支持:對于普通離線學(xué)習(xí),模型會導(dǎo)出到文件中,WeiServing通過ModelManager模塊管理模型加載,支持本地存儲與分布式存儲。同時,WeiServing為支持在線機(jī)器學(xué)習(xí),提供對實(shí)時流接口對接,在線訓(xùn)練的模型參數(shù)可以實(shí)時推送到WeiParam中,為線上提供服務(wù)。
總結(jié)
本文介紹了深度學(xué)習(xí)框架和平臺的概念和特征,基于微博深度學(xué)習(xí)平臺深入探討了深度學(xué)習(xí)平臺的設(shè)計思考和技術(shù)架構(gòu)。機(jī)器學(xué)習(xí)工作流和控制中心是我們在規(guī)范機(jī)器學(xué)習(xí)工作流程的設(shè)計成果,系統(tǒng)化的標(biāo)準(zhǔn)流程能極大提升機(jī)器學(xué)習(xí)開發(fā)效率和業(yè)務(wù)迭代速度。深度學(xué)習(xí)模型訓(xùn)練集群和模型在線預(yù)測服務(wù)是我們在深度學(xué)習(xí)模型訓(xùn)練、模型預(yù)測的集群化、服務(wù)化方面的系統(tǒng)產(chǎn)出,是保障模型效果和業(yè)務(wù)效果的基礎(chǔ)。希望上述介紹能給大家?guī)硭伎己蛶椭?nbsp;