第19課:模型部署上線的幾種服務發(fā)布方式

在前面所有的模型訓練和預測中糯累,我們訓練好的模型都是直接通過控制臺或者 Jupyter Notebook 來進行預測和交互的,在一個系統(tǒng)或者項目中使用這種方式顯然不可能扰她,那在 Web 應用中如何使用我們訓練好的模型呢芽突?本文將通過以下四個方面對該問題進行講解:

  1. 微服務架構簡介;
  2. 模型的持久化與加載方式队他;
  3. Flask 和 Bottle 微服務框架卷仑;
  4. Tensorflow Serving 模型部署和服務。

微服務架構簡介

微服務是指開發(fā)一個單個小型的但有業(yè)務功能的服務麸折,每個服務都有自己的處理和輕量通訊機制锡凝,可以部署在單個或多個服務器上。微服務也指一種松耦合的垢啼、有一定的有界上下文的面向服務架構窜锯。也就是說,如果每個服務都要同時修改芭析,那么它們就不是微服務锚扎,因為它們緊耦合在一起;如果你需要掌握一個服務太多的上下文場景使用條件馁启,那么它就是一個有上下文邊界的服務驾孔,這個定義來自 DDD 領域驅動設計芍秆。

相對于單體架構和 SOA,它的主要特點是組件化翠勉、松耦合妖啥、自治、去中心化对碌,體現(xiàn)在以下幾個方面:

  1. 一組小的服務:服務粒度要小荆虱,而每個服務是針對一個單一職責的業(yè)務能力的封裝,專注做好一件事情朽们;

  2. 獨立部署運行和擴展:每個服務能夠獨立被部署并運行在一個進程內怀读。這種運行和部署方式能夠賦予系統(tǒng)靈活的代碼組織方式和發(fā)布節(jié)奏,使得快速交付和應對變化成為可能华坦。

  3. 獨立開發(fā)和演化:技術選型靈活愿吹,不受遺留系統(tǒng)技術約束。合適的業(yè)務問題選擇合適的技術可以獨立演化惜姐。服務與服務之間采取與語言無關的 API 進行集成犁跪。相對單體架構,微服務架構是更面向業(yè)務創(chuàng)新的一種架構模式歹袁。

  4. 獨立團隊和自治:團隊對服務的整個生命周期負責坷衍,工作在獨立的上下文中,自己決策自己治理条舔,而不需要統(tǒng)一的指揮中心枫耳。團隊和團隊之間通過松散的社區(qū)部落進行銜接。

由此孟抗,我們可以看到整個微服務的思想迁杨,與我們現(xiàn)在面對信息爆炸、知識爆炸做事情的思路是相通的:通過解耦我們所做的事情凄硼,分而治之以減少不必要的損耗铅协,使得整個復雜的系統(tǒng)和組織能夠快速地應對變化。

我們?yōu)槭裁床捎梦⒎漳兀?/p>

“讓我們的系統(tǒng)盡可能快地響應變化”

——Rebecca Parson

下面是一個簡單的微服務模型架構設計:

enter image description here

模型的持久化與加載方式

開發(fā)過 J2EE 應用的人應該對持久化的概念很清楚摊沉。通俗得講狐史,就是臨時數(shù)據(比如內存中的數(shù)據,是不能永久保存的)持久化為持久數(shù)據(比如持久化至數(shù)據庫中说墨,能夠長久保存)骏全。

那我們訓練好的模型一般都是存儲在內存中,這個時候就需要用到持久化方式尼斧,在 Python 中姜贡,常用的模型持久化方式有三種,并且都是以文件的方式持久化棺棵。

1.JSON(JavaScript Object Notation)格式鲁豪。

JSON 是一種輕量級的數(shù)據交換格式潘悼,易于人們閱讀和編寫。使用 JSON 函數(shù)需要導入 JSON 庫:

import json

它擁有兩個格式處理函數(shù):

  • json.dumps:將 Python 對象編碼成 JSON 字符串爬橡;
  • json.loads:將已編碼的 JSON 字符串解碼為 Python 對象。

下面看一個例子棒动。

首先我們創(chuàng)建一個 List 對象 data糙申,然后把 data 編碼成 JSON 字符串保存在 data.json 文件中,之后再讀取 data.json 文件中的字符串解碼成 Python 對象船惨,代碼如下:

enter image description here

2. pickle 模塊

pickle 提供了一個簡單的持久化功能柜裸。可以將對象以文件的形式存放在磁盤上粱锐。pickle 模塊只能在 Python 中使用疙挺,Python 中幾乎所有的數(shù)據類型(列表、字典怜浅、集合铐然、類等)都可以用 pickle 來序列化。pickle 序列化后的數(shù)據恶座,可讀性差搀暑,人一般無法識別。

使用的時候需要引入庫:

import pickle

它有以下兩個方法:

  • pickle.dump(obj, file[, protocol]):序列化對象跨琳,并將結果數(shù)據流寫入到文件對象中自点。參數(shù) protocol 是序列化模式,默認值為0脉让,表示以文本的形式序列化桂敛。protocol 的值還可以是1或2,表示以二進制的形式序列化溅潜。

  • pickle.load(file):反序列化對象术唬。將文件中的數(shù)據解析為一個 Python 對象。

我們繼續(xù)延用上面的例子伟恶。實現(xiàn)的不同點在于碴开,這次文件打開時用了 with...as... 語法,使用 pickle 保存結果博秫,文件保存為 data.pkl潦牛,代碼如下。

enter image description here

3. sklearn 中的 joblib 模塊挡育。

使用 joblib巴碗,首先需要引入包:

from sklearn.externals import joblib

使用方法如下,基本和 JSON即寒、pickle一樣橡淆,這里不再詳細講解召噩。第17課中,進行模型保存時使用的就是這種方式逸爵,可以看代碼具滴,回顧一下。

joblib.dump(model, model_path)  #模型保存
joblib.load(model_path)  #模型加載

Flask 和 Bottle 微服務框架

通過上面师倔,我們對微服務和 Python 中三種模型持久化和加載方式有了基本了解构韵。下面我們看看,Python 中如何把模型發(fā)布成一個微服務的趋艘。

這里給出兩個微服務框架 BottleFlask疲恢。

Bottle 是一個非常小巧但高效的微型 Python Web 框架,它被設計為僅僅只有一個文件的 Python 模塊瓷胧,并且除 Python 標準庫外显拳,它不依賴于任何第三方模塊。

Bottle 本身主要包含以下四個模塊搓萧,依靠它們便可快速開發(fā)微 Web 服務:

  • 路由(Routing):將請求映射到函數(shù)杂数,可以創(chuàng)建十分優(yōu)雅的 URL;
  • 模板(Templates):可以快速構建 Python 內置模板引擎矛绘,同時還支持 Mako耍休、Jinja2、Cheetah 等第三方模板引擎货矮;
  • 工具集(Utilites):用于快速讀取 form 數(shù)據羊精,上傳文件,訪問 Cookies囚玫,Headers 或者其它 HTTP 相關的 metadata喧锦;
  • 服務器(Server):內置 HTTP 開發(fā)服務器,并且支持 paste抓督、fapws3燃少、 bjoern、Google App Engine铃在、Cherrypy 或者其它任何 WSGI HTTP 服務器阵具。

Flask 也是一個 Python 編寫的 Web 微框架,可以讓我們使用 Python 語言快速實現(xiàn)一個網站或 Web 服務定铜。并使用方式和 Bottle 相似阳液,F(xiàn)lask 依賴 Jinja2 模板和 Werkzeug WSGI 服務。Werkzeug 本質是 Socket 服務端揣炕,其用于接收 HTTP 請求并對請求進行預處理帘皿,然后觸發(fā) Flask 框架,開發(fā)人員基于 Flask 框架提供的功能對請求進行相應的處理畸陡,并返回給用戶鹰溜,如果返回給用戶的內容比較復雜時虽填,需要借助 Jinja2 模板來實現(xiàn)對模板的處理,即將模板和數(shù)據進行渲染曹动,將渲染后的字符串返回給用戶瀏覽器斋日。

Bottle 和 Flask 在使用上相似,而且 Flask 的文檔資料更全仁期,發(fā)布的服務更穩(wěn)定桑驱,因此下面重點以 Flask 為例,來說明模型的微服務發(fā)布過程跛蛋。

如果大家想進一步了解這兩個框架,可以參考說明文檔痊硕。

1.安裝赊级。

對 Bottle 和 Flask 進行安裝,分別執(zhí)行如下命令即可安裝成功:

pip install bottle
pip install Flask

安裝好之后岔绸,分別進入需要的包就可以寫微服務程序了理逊。這兩個框架在使用時,用法盒揉、語法結構都差不多晋被,網上 Flask 的中文資料相對多一些,所以這里用 Flask 來舉例刚盈。

2. 第一個最小的 Flask 應用羡洛。

第一個最小的 Flask 應用看起來會是這樣:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

把它保存為 hello.py(或是類似的),然后用 Python 解釋器來運行:

python hello.py

或者直接在 Jupyter Notebook 里面執(zhí)行藕漱,都沒有問題欲侮。服務啟動將在控制臺打印如下消息:

Running on http://127.0.0.1:5000/

意思就是,可以通過 localhost 和 5000 端口肋联,在瀏覽器訪問:

enter image description here

這時我們就得到了服務在瀏覽器上的返回結果威蕉,于是也成功構建了與瀏覽器交互的服務。

如果要修改服務對應的 IP 地址和端口怎么辦橄仍?只需要修改這行代碼韧涨,即可修改 IP 地址和端口:

app.run(host='192.168.31.19',port=8088)

3. Flask 發(fā)布一個預測模型。

首先侮繁,我們這里使用第17課保存的模型“model.pkl”虑粥。如果不使用瀏覽器,常規(guī)的控制臺交互鼎天,我們這樣就可以實現(xiàn):

    from sklearn.externals import joblib
    model_path = "D://達人課//中文自然語言處理入門實戰(zhàn)課程//ch18//model.pkl"
    model = joblib.load(model_path)
    sen =[[['堅決', 'a', 'ad', '1_v'],
               ['懲治', 'v', 'v', '0_Root'],
               ['貪污', 'v', 'v', '1_v'],
               ['賄賂', 'n', 'n', '-1_v'],
               ['等', 'u', 'udeng', '-1_v'],
               ['經濟', 'n', 'n', '1_v'],
               ['犯罪', 'v', 'vn', '-2_v']]]
    print(model.predict(sen))

如果你現(xiàn)在有個需求舀奶,要求你的模型和瀏覽器進行交互,那 Flask 就可以實現(xiàn)斋射。

在第一個最小的 Flask 應用基礎上育勺,我們增加模型預測接口但荤,這里注意:啟動之前把 IP 地址修改為自己本機的地址或者服務器工作站所在的 IP 地址。

完整的代碼如下涧至,首先在啟動之前先把模型預加載到內存中腹躁,然后重新定義 predict 函數(shù),接受一個參數(shù) sen:

    from sklearn.externals import joblib
    from flask import Flask,request
    app = Flask(__name__)

    @app.route('/')
    def hello_world():
        return 'Hello World!'

    @app.route('/predict/<sen>')
    def predict(sen):
        result = model.predict(sen)
        return str(result)

    if __name__ == '__main__':
        model_path = "D://ch18//model.pkl"
        model = joblib.load(model_path)
        app.run(host='192.168.31.19')

啟動 Flask 服務之后南蓬,在瀏覽器地址中輸入:

http://192.168.31.19:5000/predict/[[['堅決', 'a', 'ad', '1_v'], ['懲治', 'v', 'v', '0_Root'], ['貪污', 'v', 'v', '1_v'], ['賄賂', 'n', 'n', '-1_v'], ['等', 'u', 'udeng', '-1_v'], ['經濟', 'n', 'n', '1_v'], ['犯罪', 'v', 'vn', '-2_v']]]

得到預測結果纺非,這樣就完成了微服務的發(fā)布,并實現(xiàn)了模型和前端瀏覽器的交互赘方。

enter image description here

Tensorflow Serving 模型部署和服務

TensorFlow Serving 是一個用于機器學習模型 Serving 的高性能開源庫烧颖。它可以將訓練好的機器學習模型部署到線上,使用 gRPC 作為接口接受外部調用窄陡。更加讓人眼前一亮的是炕淮,它支持模型熱更新與自動模型版本管理。這意味著一旦部署 TensorFlow Serving 后跳夭,你再也不需要為線上服務操心涂圆,只需要關心你的線下模型訓練。

同樣币叹,TensorFlow Serving 可以將模型部署在移動端润歉,如安卓或者 iOS 系統(tǒng)的 App 應用上。關于 Tensorflow Serving 模型部署和服務颈抚,這里不在列舉示例踩衩,直接參考文末的推薦閱讀。

總結

本節(jié)對微服務架構做了簡單介紹邪意,并介紹了三種機器學習模型持久化和加載的方式九妈,接著介紹了 Python 的兩個輕量級微服務框架 Bottle 和 Flask。隨后雾鬼,我們通過 Flask 制作了一個簡單的微服務預測接口萌朱,實現(xiàn)模型的預測和瀏覽器交互功能,最后簡單介紹了 TensorFlow Servin 模型的部署和服務功能策菜。

學完上述內容晶疼,讀者可輕易實現(xiàn)自己訓練的模型和 Web 應用的結合,提供微服務接口又憨,實現(xiàn)模型上線應用翠霍。

參考文獻以及推薦閱讀

  1. Bottle 文檔
  2. Flask 文檔
  3. 面向機器智能的 TensorFlow 實踐:產品環(huán)境中模型的部署
  4. Tensorflow Serving 服務部署與訪問(Python + Java)

如有侵權請聯(lián)系QQ:758230255刪除

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蠢莺,隨后出現(xiàn)的幾起案子寒匙,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锄弱,死亡現(xiàn)場離奇詭異考蕾,居然都是意外死亡,警方通過查閱死者的電腦和手機会宪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進店門肖卧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掸鹅,你說我怎么就攤上這事塞帐。” “怎么了巍沙?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵葵姥,是天一觀的道長。 經常有香客問我句携,道長牌里,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任务甥,我火速辦了婚禮,結果婚禮上喳篇,老公的妹妹穿的比我還像新娘敞临。我一直安慰自己,他們只是感情好麸澜,可當我...
    茶點故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布挺尿。 她就那樣靜靜地躺著,像睡著了一般炊邦。 火紅的嫁衣襯著肌膚如雪编矾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天馁害,我揣著相機與錄音窄俏,去河邊找鬼。 笑死碘菜,一個胖子當著我的面吹牛凹蜈,可吹牛的內容都是我干的。 我是一名探鬼主播忍啸,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼仰坦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了计雌?” 一聲冷哼從身側響起悄晃,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凿滤,沒想到半個月后妈橄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庶近,經...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年眷细,在試婚紗的時候發(fā)現(xiàn)自己被綠了拦盹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,694評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡溪椎,死狀恐怖普舆,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情校读,我是刑警寧澤沼侣,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站歉秫,受9級特大地震影響蛾洛,放射性物質發(fā)生泄漏。R本人自食惡果不足惜雁芙,卻給世界環(huán)境...
    茶點故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一轧膘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兔甘,春花似錦谎碍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至澡匪,卻和暖如春熔任,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唁情。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工疑苔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荠瘪。 一個月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓夯巷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哀墓。 傳聞我的和親對象是個殘疾皇子趁餐,可洞房花燭夜當晚...
    茶點故事閱讀 43,580評論 2 349

推薦閱讀更多精彩內容

  • 在前面所有的模型訓練和預測中,我們訓練好的模型都是直接通過控制臺或者 Jupyter Notebook 來進行預測...
    米飯超人閱讀 11,336評論 0 11
  • # Python 資源大全中文版 我想很多程序員應該記得 GitHub 上有一個 Awesome - XXX 系列...
    小邁克閱讀 2,965評論 1 3
  • 隨著機器學習的廣泛應用篮绰,如何高效的把訓練好的機器學習的模型部署到生產環(huán)境后雷,正在被越來越多的工具所支持。我們今天就來...
    小牛學堂閱讀 29,085評論 0 30
  • 如果雄鷹接受了一項工作勉抓,那么這項工作可以視為已完成。雄鷹遵循的基本原則是:“就算我沒有能力完成候学,我也必須完成”藕筋。 ...
    生如夏花2018閱讀 1,733評論 1 7
  • 又一個舉國歡慶的日子,又一個鞭炮齊鳴的夜晚梳码,又一個除舊迎新隐圾、闔家團圓、盼歸祭祖的節(jié)日掰茶。 因為身體的原因暇藏,體驗了半月...
    若依喜舍閱讀 189評論 0 0