隨著互聯(lián)網(wǎng)的發(fā)展和人工智能的進(jìn)步,各個廠家都開始針對性的向用戶推薦自己的內(nèi)容,這些內(nèi)容包括了文章、視頻、商品以及一些其他的希望被用戶看到的內(nèi)容了,能夠讓用戶有好的內(nèi)容的體驗,更好的捕捉到用戶所需要的內(nèi)容,這背后的成功都?xì)w功于推薦系統(tǒng)。
企業(yè)中的推薦系統(tǒng)包括哪幾個部分
上面是企業(yè)中一個常見的推薦系統(tǒng)的架構(gòu)圖,一般來講,一個完整的推薦系統(tǒng)企業(yè)級的架構(gòu)應(yīng)該包括數(shù)據(jù)的存儲、業(yè)務(wù)模型、服務(wù)層以及上層對于用戶來講可見的 App 或者一些其他可視化是產(chǎn)品。
數(shù)據(jù)存儲
對于數(shù)據(jù)存儲來講,幾乎是每一個完整的推薦系統(tǒng)必不可少的一個部分,所有的用戶數(shù)據(jù)、候選內(nèi)容的所有的信息、日志系統(tǒng)以及緩存等,全都屬于數(shù)據(jù)存儲的一部分,后續(xù)我們要做的與用戶相關(guān)的畫像、內(nèi)容畫像以及其他需要提取的特征信息也全都來自于數(shù)據(jù)系統(tǒng)。
一般來講,數(shù)據(jù)系統(tǒng)是一個很大的概念,它不僅限于某一個數(shù)據(jù)庫,或者某一個數(shù)據(jù)處理邏輯,而是一整套與數(shù)據(jù)相關(guān)的系統(tǒng),用于存儲用戶信息的關(guān)系型數(shù)據(jù)庫、用戶存儲商品信息的數(shù)據(jù)模型、用于進(jìn)行大數(shù)據(jù)運算的數(shù)據(jù)湖和數(shù)據(jù)集群等,我們把這些處理數(shù)據(jù)的系統(tǒng)整合,形成了推薦系統(tǒng)的數(shù)據(jù)存儲部分。
業(yè)務(wù)模型
業(yè)務(wù)模型是推薦系統(tǒng)的核心。推薦系統(tǒng)的效果好壞可以說 90% 以上是由于業(yè)務(wù)模型決定的。在一個推薦系統(tǒng)中,數(shù)據(jù)系統(tǒng)一般包含三個部分,數(shù)據(jù)邏輯層、召回層和排序?qū)印?/p>
一般來講,我們當(dāng)從用戶進(jìn)入到我們的系統(tǒng)的時候,推薦系統(tǒng)就已經(jīng)在發(fā)揮作用了。首先,我們會將用戶的數(shù)據(jù)通過各種數(shù)據(jù)處理、深度學(xué)習(xí)或者機(jī)器學(xué)習(xí)的方法進(jìn)行數(shù)據(jù)的處理,這一部分的處理一般包括類似于用戶日志采集,分詞、內(nèi)容畫像、用戶畫像等,這里可用使用大量的深度學(xué)習(xí)方式來做。
接下來,我們可以使用這些畫像和特征來進(jìn)行針對于特定用戶的內(nèi)容召回,這里的召回實際上就是通過各種方法來找到用戶可能感興趣的內(nèi)容。
當(dāng)找到用戶可能感興趣的內(nèi)容之后,我們一般會對這些內(nèi)容進(jìn)行進(jìn)一步的篩選和排序,找到在這些內(nèi)容中,用戶最感興趣的前面的幾個或者幾十個內(nèi)容分別是什么,這一步,一般我們稱之為排序?qū)印?/p>
最后,我們可以將排序后的結(jié)果輸出給用戶進(jìn)行界面的展示,從而達(dá)到最后的推薦效果。
使用 TensorFlow Serving 賦能
目前來講,無論是數(shù)據(jù)邏輯、召回層還是排序?qū)樱伎梢允褂煤芏嗌疃葘W(xué)習(xí)的方法來做。例如數(shù)據(jù)邏輯中有關(guān)命名實體識別的部分可以使用 TensorFlow 來實現(xiàn),召回層可以使用 TensorFlow 來實現(xiàn) YoutubeDNN 模型并部署到生產(chǎn)環(huán)境中,在排序?qū)游覀円部梢允褂?xDeepFM 等深度學(xué)習(xí)方法來實現(xiàn)。
那么對于這些深度學(xué)習(xí)模型來講,最好的模型上線和部署方式莫過于使用 TensorFlow Serving 進(jìn)行部署了。
由于 TensorFlow Serving 本身就是 Google 自家的產(chǎn)品,也是 TensorFlow 大家族的一部分,因此,使用 TensorFlow Serving 對 TensorFlow 的模型進(jìn)行部署無疑是最好的選擇。
在我所在的企業(yè)中,幾乎所有的深度學(xué)習(xí)所涉及到的模型都會被轉(zhuǎn)換成 TensorFlow Serving 的模式進(jìn)行部署。在使用 TensorFlow Serving 進(jìn)行模型部署的時候,實際上會有很多個 tricks。
例如,在實際的操作當(dāng)中,很多人會發(fā)現(xiàn),自己也把模型轉(zhuǎn)換成了 PB 模型,也能自己使用代碼的方式加載這個 pb 模型進(jìn)行推理,但是,放到 TensorFlow Serving 上之后就無法進(jìn)行推理,然后還會報各種各樣莫名其妙的錯誤。一般來講,造成這個問題的原因有以下幾種。
1. pb 模型轉(zhuǎn)換的類型錯誤
pb 模型轉(zhuǎn)換的類型錯誤是大部分 TensorFlow 開發(fā)人員常見的錯誤之一,一般來講,TensorFlow 可以轉(zhuǎn)換的 pb 文件大致可以分成兩種,一種是直接轉(zhuǎn)換成一個 pb 文件,這種文件只是一個以模型名稱命名,以 .pb 為格式的單個文件,這個文件一般使用在終端的推理中,比如移動端的推理,或者是給到 C++ 等語言進(jìn)行模型的調(diào)用,但是如果把它直接使用 TensorFlow Serving 進(jìn)行部署的話,往往就會出錯。
實際上,如果想使用 TensorFlow Serving 進(jìn)行部署,那么我們就需要將我們的模型轉(zhuǎn)換成 Saved Model 格式的 pb 文件。Saved Model 格式的 pb 文件與一般的 pb 文件相比不同之處在于,Saved Model 格式的 pb 文件一般是凍結(jié)圖文件,它可以更方便的部署。一般來講,使用 Saved Model 格式進(jìn)行打包之后,除了模型文件本身,會生成 variables 目錄,其中 pb 文件是模型的定義文件,variables 目錄下存放的是模型的各個推理所需要的參數(shù)。
因此,如果你生成了一個 pb 文件在本地可以推理,但是放在 TensorFlow Serving 中部署的時候不能推理的話,首先看看是不是這里的問題。
2. 在 TensorFlow Serving 中推理的時候沒有加入版本標(biāo)識
有些同學(xué)在使用 TensorFlow Serving 的時候,也能夠轉(zhuǎn)換成 Saved Model 格式的 pb 文件了,而且在本地驗證也沒有問題了,但是放到 TensorFlow Serving 的相關(guān)服務(wù)上就會報錯,總是提示找不到版本,一般來講,這種問題是你導(dǎo)出的模型中沒有添加模型的版本號所導(dǎo)致的,我們在 TensorFlow Serving 中進(jìn)行模型部署的時候,往往都需要在最外層定義一個模型的版本號,而 TensorFlow Serving 也會通過判斷模型的版本號來進(jìn)行模型的更新。
3. 模型沒有標(biāo)明正確的輸入輸出
有些同學(xué)在模型轉(zhuǎn)換完之后,發(fā)現(xiàn)無法在推理環(huán)境中運行,一直提示輸入的 tensor 不正確,這種情況下一般來講是在對模型進(jìn)行導(dǎo)出時,沒有對輸入輸出的參數(shù)進(jìn)行命名,從而使得模型使用了標(biāo)準(zhǔn)的命名,導(dǎo)致無法進(jìn)行推理。
TensorFlow Serving 的性能優(yōu)化
之前很多人在使用 TensorFlow Serving 在做模型部署的時候,都跟我說它的性能不好,部署 Albert tiny 模型的 QPS 連 50 都不到,還不如使用傳統(tǒng)的部署方法,當(dāng)我跟大家說,我使用 TensorFlow Serving 部署時,在 CPU 服務(wù)器上 QPS 能上到 2000 多,在 GPU 服務(wù)器上 QPS 甚至能達(dá)到 5000 以上,那么,為什么差異會這么大呢?
實際上,如果按照正常的部署方式,沒有帶任何參數(shù)的話,它的并發(fā)確實會很低,但是實際上,TensorFlow Serving 給我們提供了針對于高并發(fā)的部署方案,在 http://tensorflow.google.cn/tfx/serving/serving_config 中,有一個叫做 Batching Configuration 的配置的示例:
max_batch_size { value: 128 }
batch_timeout_micros { value: 0 }
max_enqueued_batches { value: 1000000 }
num_batch_threads { value: 8 }
這個示例,很大程度上決定了并發(fā)的性能。一般來講,在使用 CPU 部署的時候,我們可以將 num_batch_threads 設(shè)置為 CPU 核數(shù)的 2 倍加 1,例如我們的 CPU 是 48 核,這里可以設(shè)置為 97;當(dāng)我們使用 GPU 進(jìn)行部署的時候,這里面的 num_batch_threads 最好設(shè)置為 GPU 的個數(shù)。這樣的設(shè)置,能夠最大的程度上利用到我們的 CPU 和 GPU,使得并發(fā)提高。
在部署方面,TensorFlow Serving 給我們提供了 2 種大類別的 docker,一個是 GPU 的一個是 CPU 的,這個在做 docker 部署的時候一定要注意區(qū)分,否則很容易導(dǎo)致部署之后的性能低;另外,在 TensorFlow Serving 所提供的 docker 中,又可以分為 devel 版本和正常版本,其中 devel 里面帶有一些內(nèi)置的開發(fā)環(huán)境,一般用于調(diào)試用,在正式環(huán)境中,我們更建議使用正常的 docker 版本。
實際上,在工業(yè)界,將 TensorFlow 與推薦系統(tǒng)結(jié)合的例子很多,我們可以利用好 TensorFlow Serving 做好模型的推理,從而更好的提供相關(guān)的服務(wù)。
責(zé)任編輯:haq
-
人工智能
+關(guān)注
關(guān)注
1791文章
47350瀏覽量
238744
原文標(biāo)題:社區(qū)分享 | TensorFlow Serving如何結(jié)合推薦系統(tǒng)在企業(yè)中落地
文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論