在文章NLP(十五)让模型来告诉你文本中的时间中,我们已经学会了如何利用kashgari模块来完成序列标注模型的训练与预测,在本文中,我们将会了解如何tensorflow-serving来部署模型。

  在kashgari的官方文档中,已经有如何利用tensorflow-serving来部署模型的说明了,网址为:https://kashgari.bmio.net/advance-use/tensorflow-serving/

  下面,本文将介绍tensorflow-serving以及如何利用tensorflow-serving来部署kashgari的模型。

tensorflow-serving

   TensorFlow Serving 是一个用于机器学习模型 serving 的高性能开源库。它可以将训练好的机器学习模型部署到线上,使用 gRPC 作为接口接受外部调用。更加让人眼前一亮的是,它支持模型热更新与自动模型版本管理。这意味着一旦部署 TensorFlow Serving 后,你再也不需要为线上服务操心,只需要关心你的线下模型训练。

  TensorFlow Serving可以方便我们部署TensorFlow模型,本文将使用TensorFlow Serving的Docker镜像来使用TensorFlow Serving,安装的命令如下:

  1. docker pull tensorflow/serving

工程实践

  本项目将演示如何利用tensorflow/serving来部署kashgari中的模型,项目结构如下:

  本项目的data来自之前笔者标注的时间数据集,即标注出文本中的时间,采用BIO标注系统。chinese_wwm_ext文件夹为哈工大的预训练模型文件。

  model_train.py为模型训练的代码,主要功能是完成时间序列标注模型的训练,完整的代码如下:

  1. # -*- coding: utf-8 -*-
  2. # time: 2019-09-12
  3. # place: Huangcun Beijing
  4. import kashgari
  5. from kashgari import utils
  6. from kashgari.corpus import DataReader
  7. from kashgari.embeddings import BERTEmbedding
  8. from kashgari.tasks.labeling import BiLSTM_CRF_Model
  9. # 模型训练
  10. train_x, train_y = DataReader().read_conll_format_file('./data/time.train')
  11. valid_x, valid_y = DataReader().read_conll_format_file('./data/time.dev')
  12. test_x, test_y = DataReader().read_conll_format_file('./data/time.test')
  13. bert_embedding = BERTEmbedding('chinese_wwm_ext_L-12_H-768_A-12',
  14. task=kashgari.LABELING,
  15. sequence_length=128)
  16. model = BiLSTM_CRF_Model(bert_embedding)
  17. model.fit(train_x, train_y, valid_x, valid_y, batch_size=16, epochs=1)
  18. # Save model
  19. utils.convert_to_saved_model(model,
  20. model_path='saved_model/time_entity',
  21. version=1)

  运行该代码,模型训练完后会生成saved_model文件夹,里面含有模型训练好后的文件,方便我们利用tensorflow/serving进行部署。接着我们利用tensorflow/serving来完成模型的部署,命令如下:

  1. docker run -t --rm -p 8501:8501 -v "/Users/jclian/PycharmProjects/kashgari_tf_serving/saved_model:/models/" -e MODEL_NAME=time_entity tensorflow/serving

其中需要注意该模型所在的路径,路径需要写完整路径,以及模型的名称(MODEL_NAME),这在训练代码(train.py)中已经给出(saved_model/time_entity)。

  接着我们使用tornado来搭建HTTP服务,帮助我们方便地进行模型预测,runServer.py的完整代码如下:

  1. # -*- coding: utf-8 -*-
  2. import requests
  3. from kashgari import utils
  4. import numpy as np
  5. from model_predict import get_predict
  6. import json
  7. import tornado.httpserver
  8. import tornado.ioloop
  9. import tornado.options
  10. import tornado.web
  11. from tornado.options import define, options
  12. import traceback
  13. # tornado高并发
  14. import tornado.web
  15. import tornado.gen
  16. import tornado.concurrent
  17. from concurrent.futures import ThreadPoolExecutor
  18. # 定义端口为12333
  19. define("port", default=16016, help="run on the given port", type=int)
  20. # 模型预测
  21. class ModelPredictHandler(tornado.web.RequestHandler):
  22. executor = ThreadPoolExecutor(max_workers=5)
  23. # get 函数
  24. @tornado.gen.coroutine
  25. def get(self):
  26. origin_text = self.get_argument('text')
  27. result = yield self.function(origin_text)
  28. self.write(json.dumps(result, ensure_ascii=False))
  29. @tornado.concurrent.run_on_executor
  30. def function(self, text):
  31. try:
  32. text = text.replace(' ', '')
  33. x = [_ for _ in text]
  34. # Pre-processor data
  35. processor = utils.load_processor(model_path='saved_model/time_entity/1')
  36. tensor = processor.process_x_dataset([x])
  37. # only for bert Embedding
  38. tensor = [{
  39. "Input-Token:0": i.tolist(),
  40. "Input-Segment:0": np.zeros(i.shape).tolist()
  41. } for i in tensor]
  42. # predict
  43. r = requests.post("http://localhost:8501/v1/models/time_entity:predict", json={"instances": tensor})
  44. preds = r.json()['predictions']
  45. # Convert result back to labels
  46. labels = processor.reverse_numerize_label_sequences(np.array(preds).argmax(-1))
  47. entities = get_predict('TIME', text, labels[0])
  48. return entities
  49. except Exception:
  50. self.write(traceback.format_exc().replace('\n', '<br>'))
  51. # get请求
  52. class HelloHandler(tornado.web.RequestHandler):
  53. def get(self):
  54. self.write('Hello from lmj from Daxing Beijing!')
  55. # 主函数
  56. def main():
  57. # 开启tornado服务
  58. tornado.options.parse_command_line()
  59. # 定义app
  60. app = tornado.web.Application(
  61. handlers=[(r'/model_predict', ModelPredictHandler),
  62. (r'/hello', HelloHandler),
  63. ], #网页路径控制
  64. )
  65. http_server = tornado.httpserver.HTTPServer(app)
  66. http_server.listen(options.port)
  67. tornado.ioloop.IOLoop.instance().start()
  68. main()

  我们定义了tornado封装HTTP服务来进行模型预测,运行该脚本,启动模型预测的HTTP服务。接着我们再使用Python脚本才测试下模型的预测效果以及预测时间,预测的代码脚本的完整代码如下:

  1. import time
  2. import json
  3. import requests
  4. t1 = time.time()
  5. texts = ['据《新闻联播》报道,9月9日至11日,中央纪委书记赵乐际到河北调研。',
  6. '记者从国家发展改革委、商务部相关方面获悉,日前美方已决定对拟于10月1日实施的中国输美商品加征关税措施做出调整,中方支持相关企业从即日起按照市场化原则和WTO规则,自美采购一定数量大豆、猪肉等农产品,国务院关税税则委员会将对上述采购予以加征关税排除。',
  7. '据印度Zee新闻网站12日报道,亚洲新闻国际通讯社援引印度军方消息人士的话说,9月11日的对峙事件发生在靠近班公错北岸的实际控制线一带。',
  8. '儋州市决定,从9月开始,对城市低保、农村低保、特困供养人员、优抚对象、领取失业保险金人员、建档立卡未脱贫人口等低收入群体共3万多人,发放猪肉价格补贴,每人每月发放不低于100元补贴,以后发放标准,将根据猪肉价波动情况进行动态调整。',
  9. '9月11日,华为心声社区发布美国经济学家托马斯.弗里德曼在《纽约时报》上的专栏内容,弗里德曼透露,在与华为创始人任正非最近一次采访中,任正非表示华为愿意与美国司法部展开话题不设限的讨论。',
  10. '造血干细胞移植治疗白血病技术已日益成熟,然而,通过该方法同时治愈艾滋病目前还是一道全球尚在攻克的难题。',
  11. '英国航空事故调查局(AAIB)近日披露,今年2月6日一趟由德国法兰克福飞往墨西哥坎昆的航班上,因飞行员打翻咖啡使操作面板冒烟,导致飞机折返迫降爱尔兰。',
  12. '当地时间周四(9月12日),印度尼西亚财政部长英卓华(Sri Mulyani Indrawati)明确表示:特朗普的推特是风险之一。',
  13. '华中科技大学9月12日通过其官方网站发布通报称,9月2日,我校一硕士研究生不幸坠楼身亡。',
  14. '微博用户@ooooviki 9月12日下午公布发生在自己身上的惊悚遭遇:一个自称网警、名叫郑洋的人利用职务之便,查到她的完备的个人信息,包括但不限于身份证号、家庭地址、电话号码、户籍变动情况等,要求她做他女朋友。',
  15. '今天,贵阳取消了汽车限购,成为目前全国实行限购政策的9个省市中,首个取消限购的城市。',
  16. '据悉,与全球同步,中国区此次将于9月13日于iPhone官方渠道和京东正式开启预售,京东成Apple中国区唯一官方授权预售渠道。',
  17. '根据央行公布的数据,截至2019年6月末,存款类金融机构住户部门短期消费贷款规模为9.11万亿元,2019年上半年该项净增3293.19亿元,上半年增量看起来并不乐观。',
  18. '9月11日,一段拍摄浙江万里学院学生食堂的视频走红网络,视频显示该学校食堂不仅在用餐区域设置了可以看电影、比赛的大屏幕,还推出了“一人食”餐位。',
  19. '当日,在北京举行的2019年国际篮联篮球世界杯半决赛中,西班牙队对阵澳大利亚队。',
  20. ]
  21. print(len(texts))
  22. for text in texts:
  23. url = 'http://localhost:16016/model_predict?text=%s' % text
  24. req = requests.get(url)
  25. print(json.loads(req.content))
  26. t2 = time.time()
  27. print(round(t2-t1, 4))

  运行该代码,输出的结果如下:(预测文本中的时间)

  1. 一共预测15个句子。
  2. ['9月9日至11日']
  3. ['日前', '10月1日', '即日']
  4. ['12日', '9月11日']
  5. ['9月']
  6. ['9月11日']
  7. []
  8. ['近日', '今年2月6日']
  9. ['当地时间周四(9月12日)']
  10. ['9月12日', '9月2日']
  11. ['9月12日下午']
  12. ['今天', '目前']
  13. ['9月13日']
  14. ['2019年6月末', '2019年上半年', '上半年']
  15. ['9月11日']
  16. ['当日', '2019年']
  17. 预测耗时: 15.1085s.

模型预测的效果还是不错的,但平均每句话的预测时间为1秒多,模型预测时间还是稍微偏长,后续笔者将会研究如何缩短模型预测的时间。

总结

   本项目主要是介绍了如何利用tensorflow-serving部署kashgari模型,该项目已经上传至github,地址为:https://github.com/percent4/tensorflow-serving_4_kashgari

  至于如何缩短模型预测的时间,笔者还需要再继续研究,欢迎大家关注~

NLP(十七)利用tensorflow-serving部署kashgari模型的更多相关文章

  1. TensorFlow Serving实现多模型部署以及不同版本模型的调用

    前提:要实现多模型部署,首先要了解并且熟练实现单模型部署,可以借助官网文档,使用Docker实现部署. 1. 首先准备两个你需要部署的模型,统一的放在multiModel/文件夹下(文件夹名字可以任意 ...

  2. 如何用 tensorflow serving 部署服务

    第一步,读一读这篇博客 https://www.jb51.net/article/138932.htm (浅谈Tensorflow模型的保存与恢复加载) 第二步: 参考博客: https://blog ...

  3. 利用Tensorflow实现逻辑回归模型

    官方mnist代码: #下载Mnist数据集 import tensorflow.examples.tutorials.mnist.input_data mnist = input_data.read ...

  4. 基于TensorFlow Serving的深度学习在线预估

    一.前言 随着深度学习在图像.语言.广告点击率预估等各个领域不断发展,很多团队开始探索深度学习技术在业务层面的实践与应用.而在广告CTR预估方面,新模型也是层出不穷: Wide and Deep[1] ...

  5. tensorflow 模型保存与加载 和TensorFlow serving + grpc + docker项目部署

    TensorFlow 模型保存与加载 TensorFlow中总共有两种保存和加载模型的方法.第一种是利用 tf.train.Saver() 来保存,第二种就是利用 SavedModel 来保存模型,接 ...

  6. Tensorflow Serving 模型部署和服务

    http://blog.csdn.net/wangjian1204/article/details/68928656 本文转载自:https://zhuanlan.zhihu.com/p/233614 ...

  7. 139、TensorFlow Serving 实现模型的部署(二) TextCnn文本分类模型

    昨晚终于实现了Tensorflow模型的部署 使用TensorFlow Serving 1.使用Docker 获取Tensorflow Serving的镜像,Docker在国内的需要将镜像的Repos ...

  8. docker部署tensorflow serving以及模型替换

    Using TensorFlow Serving with Docker 1.Ubuntu16.04下安装docker ce 1-1:卸载旧版本的docker sudo apt-get remove ...

  9. 利用Tensorflow进行自然语言处理(NLP)系列之一Word2Vec

    同步笔者CSDN博客(https://blog.csdn.net/qq_37608890/article/details/81513882). 一.概述 本文将要讨论NLP的一个重要话题:Word2V ...

随机推荐

  1. 前端模板引擎doT.js的用法

    简介 一款简单好用的前端模板引擎 用法 <script type="text/javascript" src="js/doT.min.js">< ...

  2. EFCore + MySql codeFirst 迁移 Migration出现的问题

    第二次使用Migration update-database的时候出现以下错误: System.NotImplementedException: The method or operation is ...

  3. temperatureConversion2

    Solution: #方法一:字符串与列表的相互转换和它们的基本函数操作 n = input() if n[0] in {"C","c"}: a= list(n ...

  4. java算法(4)---静态内部类实现雪花算法

    静态内部类单例模式实现雪花算法 在生成表主键ID时,我们可以考虑主键自增 或者 UUID,但它们都有很明显的缺点 主键自增:1.自增ID容易被爬虫遍历数据.2.分表分库会有ID冲突. UUID: 1. ...

  5. json操作与使用 小白

    json使用广可以和很多语言进行互换,把json序列化成字符串,可以反序列化回去 dumps(传入的类型,'ensure_ascii=False') loads网络传输 dump load文件写读 p ...

  6. Go---go-cache包学习

    github.com/patrickmn/go-cachego-cache是一款类似于memached 的key/value 缓存软件.它比较适用于单机执行的应用程序.go-cache实质上就是拥有过 ...

  7. 循环 与 分支语句 和 字符函数库cctype 文件简单处理

    循环 for循环 while循环 do  while循环 通常,入口条件循环比出口条件循环好,因为循环开始前对条件进行检查 c++11基于范围的for循环    对数组(或容器类,如:vector和a ...

  8. [程序人生]那些IT界“活久见”的奇葩现象

    常言道,人活久了什么稀奇古怪的事都会见到.本文盘点几件刚毕业工作时想当然,工作若干年后啪啪打脸的“奇葩”事. (1)去年推荐一朋友来我们公司面试时,朋友说起当年她去某游戏公司时,那公司HR说这家公司是 ...

  9. 使用Makefile构建Docker

    使用Makefile构建Docker 刚开始学习docker命令的时候,很喜欢一个字一个字敲,因为这样会记住命令.后来熟悉了之后,每次想要做一些操作的时候就不得不 重复的输入以前的命令.当切换一个项目 ...

  10. unity之中级工程师

    主要是实际操作. Destroy(游戏对象):会真正销毁游戏对象. 动态链接库 热更新:用户不需要更新整个项目,只需要更新需要更新的部分,使用AssetBundle.PC,Android可以使用逻辑热 ...