一:綜述
在通用推薦系統(tǒng)中钢拧,如何找到用戶所需蟹漓,可以被拆解為兩部分,也就是matching 和 ranking源内,matching的好壞是能在全集中找到用戶所需的候選葡粒,而ranking做的好壞直接決定用戶觸達(dá)所需內(nèi)容/商品/商戶的成本份殿,可以減少用戶的額外操作(比如翻頁,下滑等)嗽交。ranking的核心問題就是點(diǎn)擊率預(yù)估(pctr)卿嘲。
?隨著DeepLearning技術(shù)的日漸成熟,越來越多的公司在pctr問題上夫壁,采用deep model取代淺層模型來進(jìn)行任務(wù)落地拾枣。很多公司紛紛發(fā)表了paper,其中就有g(shù)oogle/facebook等世界top互聯(lián)網(wǎng)公司盒让,本文所敘述的model離線訓(xùn)練思想源自于閱讀谷歌公司在2016年6月24日發(fā)表的論文Wide & Deep Learning for Recommender Systems[引用1]梅肤,如果在后續(xù)文章講解中不能盡解此論文之奧妙,請各位看官大神指出邑茄。而在工程落地上同樣采用了tensorflow體系中的成熟grpc框架tensorflow serving姨蝴。谷歌敢于開源出引領(lǐng)業(yè)界的paper,代碼肺缕,框架左医,系統(tǒng),讓天下碼農(nóng)共同學(xué)習(xí)同木。其格局之高令人敬佩浮梢。
作者在嘗試將論文中思想實(shí)踐到作者所致力于開發(fā)的短視頻推薦系統(tǒng)rank部分,提高算法性能的過程中彤路,發(fā)現(xiàn)網(wǎng)上對這方面的文章不是很多秕硝,作者也曾遇到一個問題翻遍stackoverflow,而不得解的苦惱斩萌,也曾遇到技術(shù)達(dá)人寫的github而豁然開朗的愉悅缝裤。作者希望分享出一份包含離線模型訓(xùn)練,在線server選型一級如何構(gòu)建的小資料颊郎,讓致力于實(shí)戰(zhàn)的算法朋友們規(guī)避我曾經(jīng)走過的彎路,從而少走一些彎路霎苗。請記住姆吭,閉門造車永遠(yuǎn)不能推動技術(shù)的革新。多學(xué)習(xí)多share才是王道唁盏。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
二:概要 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1.實(shí)戰(zhàn)之deep model離線訓(xùn)練與評估内狸。 ? ? ? ? ??
2.dnn model server提供技術(shù)方案一:基于thrift的rpc(python)。
3.dnn model server提供技術(shù)方案二:基于grpc的tf serving厘擂。?
4.推薦系統(tǒng)sever對dnn model server的使用昆淡。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
5.線上小流量實(shí)驗(yàn)效果分析。
三:正文(以及概要部分的介紹順序)
該算法從讀paper開始到上線完成截止刽严,開發(fā)耗時昂灵,3周零4天(單人)。其中1.部分耗時一周,2.部分耗時一周后由于性能不符合要求改用3. ? ?34兩部分耗時一周零一天眨补,最后三天用于線上server部署管削,添加負(fù)載均衡等。對于一名有一定經(jīng)驗(yàn)的機(jī)器學(xué)習(xí)算法工程師來說撑螺,第一部分是最簡單的含思,準(zhǔn)備放在最后講,優(yōu)先講2甘晤,3含潘,4工程實(shí)踐部分。所以本文主要講概要第2部分线婚,dnn model server 提供技術(shù)方案一:基于thrift的rpc调鬓。
基于引用1論文的model 訓(xùn)練方法被封裝在了tensorflow的contrib.learn api中,屬于tensorflow的高級api請參考https://www.tensorflow.org/api_docs/python/tf/contrib/learn酌伊,所以在這里我們的線上推薦系統(tǒng)(java)不能直接load腾窝,加載好的訓(xùn)練模型,java目前對tensorflow的支持僅限于低級別api居砖,生態(tài)不是做的十分出色虹脯。在離線訓(xùn)練完模型后,根據(jù)這個情況奏候,只能采用model server的方式循集,java client 調(diào)用這個model server,來完成打分排序蔗草。好處就是服務(wù)之間完全解耦咒彤,而壞處就是增加一層通信,會帶來耗時的開銷咒精。關(guān)于apache thrift rpc框架的基本介紹镶柱,這里不做過多介紹。
我們希望搭建的流程圖是如上圖所示的模叙,但是就在我代碼全部寫完歇拆,server搭建完成以為可以close這個項(xiàng)目的時候,發(fā)現(xiàn)自己還是太年輕了范咨,下文詳細(xì)敘述故觅。我們參考tensor 官網(wǎng)(詳細(xì)可以參見https://www.tensorflow.org/tutorials/wide_and_deep)給出的代碼搭建model。代碼截圖如下:
然后類似于sklearn的方式渠啊,進(jìn)行model.fit(train_data),進(jìn)行model的訓(xùn)練输吏,這個時候model 就已經(jīng)存在上截圖代碼的model_dir里面了。在這個時候我們經(jīng)期時就想一個問題替蛉,如果load這個model到內(nèi)存贯溅,如果能有其它的那些開源平臺那么簡單粗暴就好了拄氯,在像加載低階api訓(xùn)練出的model一樣,嘗試了幾次后發(fā)現(xiàn)事與愿違盗迟,查詢了一些資料后發(fā)現(xiàn)坤邪,tf高階api的model load與低階是完全不同的。心灰意冷之際罚缕,隨便去stackoverflow艇纺,搜這個問題,發(fā)現(xiàn)有人說model.fit后邮弹,下一次只需要按上圖代碼構(gòu)建model黔衡,而直接調(diào)用model.predict 就可以了,model會自動check model_dir里已經(jīng)訓(xùn)練好的文件腌乡。在訓(xùn)練完model評估效果的時候盟劫,果然可以這樣用。又在自己高興不已与纽,按圖1搭建完server侣签,測試性能的時候發(fā)現(xiàn)500個視頻的單次打分,和2000個基本一樣急迂,耗時在800ms+影所,完全不可以接受,這個時候意識到僚碎,可能model.predict 函數(shù)是每次都去加載model猴娩,而不是圖2,構(gòu)建model的時候就已經(jīng)加載入內(nèi)存勺阐,這完全是一個令人沮喪而且不可以接受的消息卷中。
所以我就詳細(xì)的閱讀了/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py里面關(guān)于predict的實(shí)現(xiàn),打出了耗時渊抽,期望自己能夠改一下蟆豫,每次都load model的這部分耗時,立時1.5天后宣告失敗腰吟。這個時候我已經(jīng)覺著自己這個項(xiàng)目無法在online部分上線了无埃。就在又心情跌入谷底時。突然又看到了一些希望毛雇。預(yù)知后事如何,且看part2分析侦镇。
參考
引用1:Wide & Deep Learning for Recommender Systems(谷歌論文)
完成于20170825灵疮,如轉(zhuǎn)載請注明出處