機(jī)器學(xué)習(xí) | TensorFlow模型如何與線上工程交互

策略與工程共生關(guān)系

問題背景:當(dāng)數(shù)據(jù)科學(xué)從業(yè)者在線下通過TensorFlow/Keras將神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練出來之后,因?yàn)榫€上使用Java進(jìn)行工程實(shí)現(xiàn)而與模型無法良好對接预烙,導(dǎo)致形成了工程和策略之間的gap坞淮。
本文主要探討嘗試了幾種可能的解決方案以及相對應(yīng)的結(jié)果和優(yōu)缺點(diǎn)茴晋。


結(jié)論優(yōu)先

  • Java分布式方案:筆者嘗試的方式中,暫時沒有能有效對接TensorFlow/Keras模型和線上分布式Java Based Spark(下文中均用JBS替代)的交互模式回窘。(如有可行方式诺擅,歡迎在留言中探討)
  • Python/Java分布式方案:JBS處理的中間數(shù)據(jù)通過HDFS和Pyspark/Java對接處理,通過TensorflowOnSpark/Java Tensorflow將Tensorflow模型分布式部署到集群節(jié)點(diǎn)中進(jìn)行工程化預(yù)測啡直。
  • Java單節(jié)點(diǎn)方案:JBS處理的中間數(shù)據(jù)通過在單節(jié)點(diǎn)GPU上烁涌,通過Java Based Tensorflow對數(shù)據(jù)進(jìn)行處理之后返回JBS分布式處理。
  • Java分布式(手動)方案:將Java Based Tensorflow手動部署到集群節(jié)點(diǎn)付枫,JBS通過調(diào)用集群節(jié)點(diǎn)程序方式通過模型預(yù)測實(shí)現(xiàn)分布式烹玉。


Java分布式方案嘗試經(jīng)驗(yàn)


1. 采用PMML文件對接策略模型和線上工程:
  • Keras

    • 方式:通過keras2pmml項(xiàng)目對keras模型轉(zhuǎn)換到pmml文件格式,然后跟java對接阐滩。
    • 問題:該項(xiàng)目已經(jīng)很久沒人維護(hù)升級二打,版本停留在0.1.主要能支持一些DNN結(jié)構(gòu)模型,對RNN和CNN等更復(fù)雜的結(jié)構(gòu)模型無法進(jìn)行正確轉(zhuǎn)換掂榔,需要修改大量源代碼继效。
    • 改進(jìn)方案:部分activation類型改進(jìn)方案-如何把神經(jīng)網(wǎng)絡(luò)keras模型轉(zhuǎn)PMML文件?
    • 結(jié)論:對復(fù)雜神經(jīng)網(wǎng)絡(luò)模型不可行装获。

  • Tensorflow

    • 方式:采用jpmml-tensorflow項(xiàng)目瑞信,將keras模型轉(zhuǎn)換為tensorflow的savemodel類文件之后,通過github項(xiàng)目代碼進(jìn)行轉(zhuǎn)換為pmml文件穴豫。
      • 如何將keras模型轉(zhuǎn)換為savemodel類:

         model = keras.models.load_model("model.h5")
         sess = keras.backend.get_session()
         builder = tf.saved_model.builder.SavedModelBuilder(saved_model_dir)
         builder.add_meta_graph_and_variables(sess, ['serve'])
         builder.save()
        
    • 問題:該項(xiàng)目支持的模型種類也只有DNN凡简,并不支持CNN或者RNN等更復(fù)雜的模型逼友。所以中間會報(bào)模型種類無法找到illegal的error。
    • 結(jié)論:對復(fù)雜神經(jīng)網(wǎng)絡(luò)模型也不可行秤涩。

  • 結(jié)論

    • PMML工程方案對于復(fù)雜神經(jīng)網(wǎng)絡(luò)的支持性不完善帜乞,但對于簡單的神經(jīng)網(wǎng)絡(luò)以及其他傳統(tǒng)機(jī)器學(xué)習(xí)模型來說,PMML方式因?yàn)槠渫ㄓ眯钥鹁欤橇己玫乃惴ê凸こ蹄暯拥臉蛄骸?br>
2. Deeplearning4J方式轉(zhuǎn)換模型應(yīng)用:
  • Keras
    • 方式:采用deeplearning4j的方式黎烈,將模型文件通過deeplearning4j方式導(dǎo)入java,再通過JBS進(jìn)行預(yù)測處理匀谣。
    • 問題
      1. 項(xiàng)目對Keras 2.0的支持處于beta版本照棋,會對一些神經(jīng)網(wǎng)絡(luò)層出現(xiàn)bug,比如像ELU層會報(bào)錯武翎。所以使用的時候烈炭,或者去除ELU等有問題神經(jīng)網(wǎng)絡(luò)層,或者采用Keras 1.0進(jìn)行構(gòu)建網(wǎng)絡(luò)后频。
      2. 在進(jìn)行JBS分布式預(yù)測的時候梳庆,出現(xiàn)了一些網(wǎng)絡(luò)結(jié)構(gòu)無法解析的錯誤暖途,猜測可能是因?yàn)樵趕park集群的序列化和反序列化過程中出現(xiàn)了問題卑惜。但deeplearning4j官網(wǎng)架構(gòu)圖顯示其對于Spark的支持,所以不確定是否是使用方式問題導(dǎo)致了分布式出現(xiàn)模型結(jié)構(gòu)解析問題驻售。
    • 結(jié)論:在分布式(可能是序列化過程中)結(jié)構(gòu)中露久,deeplearning4j項(xiàng)目還存在一些問題,無法與JBS正常兼容欺栗。

3. Java Based Tensorflow方式應(yīng)用模型:
  • Keras/Tensorflow:
    • 步驟一:將keras模型先轉(zhuǎn)換為tensorflow靜態(tài)圖模型文件毫痕,.pb格式或者ckpt格式。(ckpt與pb的異同:Tensorflow學(xué)習(xí)筆記-模型保存與加載

      • 如何將keras模型轉(zhuǎn)換為ckpt文件類型:

        model = keras.models.load_model("model.h5")
        sess = keras.backend.get_session()
        saver = tf.train.Saver()
        save_path = saver.save(sess, "/tmp/model.ckpt")
        
      • 如何將keras模型轉(zhuǎn)換為pb文件類型:
        keras模型保存為tensorflow的二進(jìn)制模型

    • 步驟二: 然后通過Java Based Tensorflow讀取pb文件迟几,對數(shù)據(jù)進(jìn)行預(yù)測消请。(關(guān)于java如何調(diào)用tensorflow模型例子:TensorFlow-Java-Examples

    • 問題

      • 單機(jī)的情況下,可以采用java來調(diào)用tensorflow类腮。
      • 分布式的情況下臊泰,由于tensorflow底層是cpp,所以在序列化打包和反序列的時候會出現(xiàn)問題蚜枢,導(dǎo)致分布式節(jié)點(diǎn)機(jī)器無法正常調(diào)用缸逃。
      • 所以只有在單機(jī)情況下才能跟java兼容〕С椋或者分布式采用pyspark中的tensorflowonspark包或者通過預(yù)先在分布式集群節(jié)點(diǎn)中部署本地tensorflow服務(wù)需频,然后java遠(yuǎn)程調(diào)用tensorflow服務(wù)來實(shí)現(xiàn)手動分布式

各方案優(yōu)缺點(diǎn):


  • Pyspark/Java分布式
    • 優(yōu)點(diǎn):通過TensorflowOnSpark/Java Tensorflow可以實(shí)現(xiàn)Tensorflow在分布式集群上的工程化部署。
    • 缺點(diǎn):與線上JBS交互需要通過HDFS做中間層筷凤,文件IO的效率會影響線上工程服務(wù)的速率昭殉。
  • Java單機(jī)
    • 優(yōu)點(diǎn):跟線上Java工程兼容,無需HDFS的IO。
    • 缺點(diǎn):需要使用GPU機(jī)器提升單機(jī)預(yù)測效率挪丢,沒有利用分布式集群莽鸭,性價(jià)比相對較低。
  • Java手動分布式
    • 優(yōu)點(diǎn):利用分布式集群資源吃靠,且跟線上工程Java兼容硫眨。
    • 缺點(diǎn):手動部署集群效率太低。

參考文獻(xiàn):
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巢块,一起剝皮案震驚了整個濱河市礁阁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌族奢,老刑警劉巖姥闭,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異越走,居然都是意外死亡棚品,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門廊敌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铜跑,“玉大人,你說我怎么就攤上這事骡澈」模” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵肋殴,是天一觀的道長囤锉。 經(jīng)常有香客問我,道長护锤,這世上最難降的妖魔是什么官地? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮烙懦,結(jié)果婚禮上驱入,老公的妹妹穿的比我還像新娘。我一直安慰自己修陡,他們只是感情好沧侥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著魄鸦,像睡著了一般宴杀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拾因,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天旺罢,我揣著相機(jī)與錄音旷余,去河邊找鬼。 笑死扁达,一個胖子當(dāng)著我的面吹牛正卧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跪解,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炉旷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叉讥?” 一聲冷哼從身側(cè)響起窘行,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎图仓,沒想到半個月后罐盔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡救崔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年惶看,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片六孵。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡纬黎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狸臣,到底是詐尸還是另有隱情莹桅,我是刑警寧澤昌执,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布烛亦,位于F島的核電站,受9級特大地震影響懂拾,放射性物質(zhì)發(fā)生泄漏煤禽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一岖赋、第九天 我趴在偏房一處隱蔽的房頂上張望檬果。 院中可真熱鬧,春花似錦唐断、人聲如沸选脊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恳啥。三九已至,卻和暖如春丹诀,著一層夾襖步出監(jiān)牢的瞬間钝的,已是汗流浹背翁垂。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留硝桩,地道東北人沿猜。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像碗脊,于是被迫代替她去往敵國和親啼肩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容