在文章NLP(十七)利用tensorflow-serving部署kashgari模型中,筆者介紹瞭如何利用tensorflow-serving部署來部署深度模型模型,在那篇文章中,筆者利用kashgari模塊實現了經典的BERT+Bi-LSTM+CRF模型結構,在標註了時間的文本語料(大約2000多個訓練句子)中也達到了很好的識別效果,可是也存在着不足之處,那就是模型的預測時間過長,平均預測一個句子中的時間耗時約400毫秒,這種預測速度在生產環境或實際應用中是不能忍受的。
查看該模型的耗時緣由,很大一部分緣由在於BERT的調用。BERT是當下最火,知名度最高的預訓練模型,雖然會使得模型的訓練、預測耗時增長,但也是小樣本語料下的最佳模型工具之一,所以,BERT在模型的架構上是不可缺乏的。那麼,該如何避免使用預訓練模型帶來的模型預測耗時過長的問題呢?
本文決定嘗試使用ALBERT,來驗證ALBERT在提高模型預測速度方面的應用,同時,也算是本人對於使用ALBERT的一次實戰吧~html
咱們不妨花一些時間來簡單地瞭解一下ALBERT。ALBERT是最近一週纔開源的預訓練模型,其Github的網址爲:https://github.com/brightmart... ,其論文能夠參考網址:https://arxiv.org/pdf/1909.11... 。
根據ALBERT的Github介紹,ALBERT在海量中文語料上進行了預訓練,模型的參數更少,效果更好。以albert_tiny_zh爲例,其文件大小16M、參數爲1.8M,模型大小僅爲BERT的1/25,效果僅比BERT略差或者在某些NLP任務上更好。在本文的預訓練模型中,將採用albert_tiny_zh。python
咱們以Github中的bertNER爲本次項目的代碼模板,在該項目中,實現的模型爲BERT+Bi-LSTM+CRF,咱們將BERT替換爲ALBERT,也就是說筆者的項目中模型爲ALBERT+Bi-LSTM+CRF,同時替換bert文件夾的代碼爲alert_zh,替換預訓練模型文件夾chinese_L-12_H-768_A-12(BERT中文預訓練模型文件)爲albert_tiny。固然,也須要修改一部分的項目源代碼,來適應ALBERT的模型訓練。
數據集採用筆者本身標註的時間語料,即標註了時間的句子,大概2000+句子,其中75%做爲訓練集(time.train文件),10%做爲驗證集(time.dev文件),15%做爲測試集(time.test文件)。在這裏筆者不打算給出具體的Python代碼,由於工程比較複雜,有興趣的額讀者能夠去查看該項目的Github地址:。
一些模型的參數能夠以下:git
ALBERT的模型訓練時間也會顯著提升,咱們耐心地等待模型訓練完畢。在time.dev和time.test數據集上的表現以下表:github
數據集 | precision | recall | f1 |
---|---|---|---|
time.dev | 81.41% | 84.95% | 83.14% |
time.test | 83.03% | 86.38% | 84.67% |
接着筆者利用訓練好的模型,用tornado封裝了一個模型預測的HTTP服務,具體的代碼以下:web
# -*- coding: utf-8 -*- import os import json import time import pickle import traceback import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web from tornado.options import define, options import tensorflow as tf from utils import create_model, get_logger from model import Model from loader import input_from_line from train import FLAGS, load_config, train # 定義端口爲12306 define("port", default=12306, help="run on the given port", type=int) # 導入模型 config = load_config(FLAGS.config_file) logger = get_logger(FLAGS.log_file) # limit GPU memory tf_config = tf.ConfigProto() tf_config.gpu_options.allow_growth = False with open(FLAGS.map_file, "rb") as f: tag_to_id, id_to_tag = pickle.load(f) sess = tf.Session(config=tf_config) model = create_model(sess, Model, FLAGS.ckpt_path, config, logger) # 模型預測的HTTP接口 class ResultHandler(tornado.web.RequestHandler): # post函數 def post(self): event = self.get_argument('event') result = model.evaluate_line(sess, input_from_line(event, FLAGS.max_seq_len, tag_to_id), id_to_tag) self.write(json.dumps(result, ensure_ascii=False)) # 主函數 def main(): # 開啓tornado服務 tornado.options.parse_command_line() # 定義app app = tornado.web.Application( handlers=[ (r'/subj_extract', ResultHandler) ], #網頁路徑控制 ) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(options.port) tornado.ioloop.IOLoop.instance().start() main()
將模型預測封裝成HTTP服務後,咱們利用Postman來測試模型預測的效果和時間,以下圖所示:json
能夠看到,模型預測的結果正確,且耗時僅爲38ms。
接着咱們嘗試多測試幾個句子的測試,測試代碼以下:網絡
# Daxing, Beijing import requests import json import time url = 'http://localhost:12306/subj_extract' texts = ['據《新聞聯播》報道,9月9日至11日,中央紀委書記趙樂際到河北調研。', '記者從國家發展改革委、商務部相關方面獲悉,日前美方已決定對擬於10月1日實施的中國輸美商品加徵關稅措施作出調整,中方支持相關企業從即日起按照市場化原則和WTO規則,自美採購必定數量大豆、豬肉等農產品,國務院關稅稅則委員會將對上述採購予以加徵關稅排除。', '據印度Zee新聞網站12日報道,亞洲新聞國際通信社援引印度軍方消息人士的話說,9月11日的對峙事件發生在靠近班公錯北岸的實際控制線一帶。', '儋州市決定,從9月開始,對城市低保、農村低保、特困供養人員、優撫對象、領取失業保險金人員、建檔立卡未脫貧人口等低收入羣體共3萬多人,發放豬肉價格補貼,每人每個月發放不低於100元補貼,之後發放標準,將根據豬肉價波動狀況進行動態調整。', '9月11日,華爲心聲社區發佈美國經濟學家托馬斯.弗裏德曼在《紐約時報》上的專欄內容,弗裏德曼透露,在與華爲創始人任正非最近一次採訪中,任正非表示華爲願意與美國司法部展開話題不設限的討論。', '造血幹細胞移植治療白血病技術已日益成熟,然而,經過該方法同時治癒艾滋病目前仍是一道全球尚在攻克的難題。', '英國航空事故調查局(AAIB)近日披露,今年2月6日一趟由德國法蘭克福飛往墨西哥坎昆的航班上,因飛行員打翻咖啡使操做面板冒煙,致使飛機折返迫降愛爾蘭。', '當地時間週四(9月12日),印度尼西亞財政部長英卓華(Sri Mulyani Indrawati)明確表示:特朗普的推特是風險之一。', '華中科技大學9月12日經過其官方網站發佈通報稱,9月2日,我校一碩士研究生不幸墜樓身亡。', '微博用戶@ooooviki 9月12日下午公佈發生在本身身上的驚悚遭遇:一個自稱網警、名叫鄭洋的人利用職務之便,查到她的完備的我的信息,包括但不限於身份證號、家庭地址、電話號碼、戶籍變更狀況等,要求她作他女友。', '今天,貴陽取消了汽車限購,成爲目前全國實行限購政策的9個省市中,首個取消限購的城市。', '據悉,與全球同步,中國區這次將於9月13日於iPhone官方渠道和京東正式開啓預售,京東成Apple中國區惟一官方受權預售渠道。', '根據央行公佈的數據,截至2019年6月末,存款類金融機構住戶部門短時間消費貸款規模爲9.11萬億元,2019年上半年該項淨增3293.19億元,上半年增量看起來並不樂觀。', '9月11日,一段拍攝浙江萬里學院學生食堂的視頻走紅網絡,視頻顯示該學校食堂不只在用餐區域設置了能夠看電影、比賽的大屏幕,還推出了「一人食」餐位。', '當日,在北京舉行的2019年國際籃聯籃球世界盃半決賽中,西班牙隊對陣澳大利亞隊。', ] t1 = time.time() for text in texts: data = {'event': text.replace(' ', '')} req = requests.post(url, data) if req.status_code == 200: print('原文:%s' % text) res = json.loads(req.content)['entities'] print('抽取結果:%s' % str([_['word'] for _ in res])) t2 = time.time() print('一共耗時:%ss.' % str(round(t2-t1, 4)))
輸出結果以下:架構
原文:據《新聞聯播》報道,9月9日至11日,中央紀委書記趙樂際到河北調研。 抽取結果:['9月9日至11日'] 原文:記者從國家發展改革委、商務部相關方面獲悉,日前美方已決定對擬於10月1日實施的中國輸美商品加徵關稅措施作出調整,中方支持相關企業從即日起按照市場化原則和WTO規則,自美採購必定數量大豆、豬肉等農產品,國務院關稅稅則委員會將對上述採購予以加徵關稅排除。 抽取結果:['日前', '10月1日'] 原文:據印度Zee新聞網站12日報道,亞洲新聞國際通信社援引印度軍方消息人士的話說,9月11日的對峙事件發生在靠近班公錯北岸的實際控制線一帶。 抽取結果:['12日', '9月11日'] 原文:儋州市決定,從9月開始,對城市低保、農村低保、特困供養人員、優撫對象、領取失業保險金人員、建檔立卡未脫貧人口等低收入羣體共3萬多人,發放豬肉價格補貼,每人每個月發放不低於100元補貼,之後發放標準,將根據豬肉價波動狀況進行動態調整。 抽取結果:['9月'] 原文:9月11日,華爲心聲社區發佈美國經濟學家托馬斯.弗裏德曼在《紐約時報》上的專欄內容,弗裏德曼透露,在與華爲創始人任正非最近一次採訪中,任正非表示華爲願意與美國司法部展開話題不設限的討論。 抽取結果:['9月11日'] 原文:造血幹細胞移植治療白血病技術已日益成熟,然而,經過該方法同時治癒艾滋病目前仍是一道全球尚在攻克的難題。 抽取結果:[] 原文:英國航空事故調查局(AAIB)近日披露,今年2月6日一趟由德國法蘭克福飛往墨西哥坎昆的航班上,因飛行員打翻咖啡使操做面板冒煙,致使飛機折返迫降愛爾蘭。 抽取結果:['近日', '今年2月6日'] 原文:當地時間週四(9月12日),印度尼西亞財政部長英卓華(Sri Mulyani Indrawati)明確表示:特朗普的推特是風險之一。 抽取結果:['當地時間週四(9月12日)'] 原文:華中科技大學9月12日經過其官方網站發佈通報稱,9月2日,我校一碩士研究生不幸墜樓身亡。 抽取結果:['9月12日', '9月2日'] 原文:微博用戶@ooooviki 9月12日下午公佈發生在本身身上的驚悚遭遇:一個自稱網警、名叫鄭洋的人利用職務之便,查到她的完備的我的信息,包括但不限於身份證號、家庭地址、電話號碼、戶籍變更狀況等,要求她作他女友。 抽取結果:['9月12日下午'] 原文:今天,貴陽取消了汽車限購,成爲目前全國實行限購政策的9個省市中,首個取消限購的城市。 抽取結果:['今天', '目前'] 原文:據悉,與全球同步,中國區這次將於9月13日於iPhone官方渠道和京東正式開啓預售,京東成Apple中國區惟一官方受權預售渠道。 抽取結果:['9月13日'] 原文:根據央行公佈的數據,截至2019年6月末,存款類金融機構住戶部門短時間消費貸款規模爲9.11萬億元,2019年上半年該項淨增3293.19億元,上半年增量看起來並不樂觀。 抽取結果:['2019年6月末', '2019年上半年', '上半年'] 原文:9月11日,一段拍攝浙江萬里學院學生食堂的視頻走紅網絡,視頻顯示該學校食堂不只在用餐區域設置了能夠看電影、比賽的大屏幕,還推出了「一人食」餐位。 抽取結果:['9月11日'] 原文:當日,在北京舉行的2019年國際籃聯籃球世界盃半決賽中,西班牙隊對陣澳大利亞隊。 抽取結果:['當日', '2019年'] 一共耗時:0.5314s.
能夠看到,對於測試的15個句子,識別的準確率很高,且預測耗時爲531ms,平均每一個話的預測時間不超過40ms。相比較而言,文章NLP(十七)利用tensorflow-serving部署kashgari模型中的模型,該模型的預測時間爲每句話1秒多,模型預測的速度爲帶ALBERT模型的25倍多。
所以,ALBERT模型確實提高了模型預測的時間,並且效&果很是顯著。app
因爲ALBERT開源不到一週,並且筆者的學識、纔能有限,所以,在代碼方面可能會存在不足。可是,做爲一次使用ALBERT的歷經,但願可以與你們分享。
本文毫不是上述項目代碼的抄襲和堆砌,該項目融入了筆者本身的思考,但願不要被誤解爲是抄襲。筆者使用上述的bertNER和ALBERT,只是爲了驗證ALBERT在模型預測耗時方面的提速效果,而事實是,ALBERT確實給我帶來了很大驚喜,感覺源代碼做者們~
最後,附上本文中筆者項目的Github地址:https://github.com/percent4/A... 。
衆裏尋他千百度。驀然回首,那人卻在,燈火闌珊處。函數