当前位置: 首页 > 后端技术 > Python

NLP(十七)使用tensorflow-serving部署kashgari模型

时间:2023-03-25 21:12:54 Python

在文章NLP(十五)让模型告诉你文中的时间,我们学习了如何使用kashgari模块完成训练和预测序列标记模型,在本文中,我们将学习如何使用tensorflow-serving部署模型。在kashgari的官方文档中,已经有使用tensorflow-serving部署模型的说明。网址是:https://kashgari.bmio.net/advance-use/tensorflow-serving/。接下来本文将介绍tensorflow-serving以及如何使用tensorflow-serving部署kashgari模型。tensorflow-servingTensorFlowServing是一个用于机器学习模型服务的高性能开源库。可以在线部署训练好的机器学习模型,并以gRPC为接口接受外部调用。更让人印象深刻的是,它支持模型热更新和自动模型版本管理。这意味着一旦部署了TensorFlowServing,您就不再需要担心在线服务,只需担心您的离线模型训练。TensorFlowServing可以促进TensorFlow模型的部署。本文将通过TensorFlowServing的Docker镜像来使用TensorFlowServing。安装命令如下:dockerpulltensorflow/serving工程实践本项目将演示如何使用tensorflow/serving在kashgari中部署模型,项目结构如下:本项目的数据来自于标记的时间数据集作者之前,也就是文中的时间都标注了,用的是BIO标注系统。chinese_wwm_ext文件夹是哈尔滨工业大学的预训练模型文件。model_train.py是模型训练的代码。其主要功能是完成时间序列标注模型的训练。完整代码如下:#-*-coding:utf-8-*-#time:2019-09-12#place:HuangcunBeijingimportkashgarifromkashgariimportutilsfromkashgari.corpusimportDataReaderfromkashgari.embeddingsimportBERTEmbeddingfromkashgari.tasks.labelingimportBiLSTM_CRF_Model#模型训练train_x,train_y=DataReader().read_conll_format_file('./data/time.trainval'valid_x,Data=).read_conll_format_file('./data/time.dev')test_x,test_y=DataReader().read_conll_format_file('./data/time.test')bert_embedding=BERTEmbedding('chinese_wwm_ext_L-12_H-768_A-12',task=kashgari.LABELING,sequence_length=128)model=BiLSTM_CRF_Model(bert_embedding)model.fit(train_x,train_y,valid_x,valid_y,batch_size=16,epochs=1)#保存modelutils.convert_to_saved_model(model,model_path='_saved_version=1)运行代码,模型训练完成后会生成saved_model文件夹,里面包含模型训练后的文件,方便我们使用tensorflow/serving进行部署。然后我们使用tensorflow/serving来完成模型的部署。命令如下:dockerrun-t--rm-p8501:8501-v"/Users/jclian/PycharmProjects/kashgari_tf_serving/saved_model:/models/"-eMODEL_NAME=time_entitytensorflow/serving需要注意的地方到模型所在的路径,路径需要写完整的路径,以及模型的名称(MODEL_NAME),在训练代码(train.py)中给出(saved_model/time_entity)。然后我们使用tornado搭建HTTP服务来帮助我们方便的进行模型预测。runServer.py完整代码如下:#-*-coding:utf-8-*-importrequestsfromkashgariimportutilsimportnumpyasnpfrommodel_predictimportget_predictimportjsonimporttornado.httpserverimporttornado.ioloopimporttornado.optionsimporttornado.webfromtornado.optionsimportdefine,optionsimporttraceback#tornadohighconcurrencyimporttornado.webimporttornado.genimporttornado.concurrentfromconcurrent.futuresimportThreadPoolExecutor#定义端口为123portdefine("3"16016,help="runonthegivenport",type=int)#模型预测类ModelPredictHandler(tornado.web.RequestHandler):executor=ThreadPoolExecutor(max_workers=5)#getfunction@tornado.gen.coroutinedefget(self):origin_text=self.get_argument('text')result=yieldself.function(origin_text)self.write(json.dumps(result,ensure_ascii=False))@tornado.concurrent.run_on_executordeffunction(self,text):尝试:text=text.replace('','')x=[_for_intext]#预处理器数据processor=utils.load_processor(model_path='saved_model/time_entity/1')tensor=processor.process_x_dataset([x])#onlyforbertEmbeddingtensor=[{"Input-Token:0":i.tolist(),"Input-Segment:0":np.zeros(i.shape).tolist()}foriintensor]#预测r=requests.post("http://localhost:8501/v1/models/time_entity:predict",json={"instances":tensor})preds=r.json()['predictions']#将结果转换回labelslabels=processor.reverse_numerize_label_sequences(np.array(preds).argmax(-1))entities=get_predict('TIME',text,labels[0])返回实体,异常除外:self.write(traceback.format_exc().replace('\n','
'))#get请求classHelloHandler(tornado.web.RequestHandler):defget(self):self.write('HellofromlmjfromDaxingBeijing!')#Mainfunctiondefmain():#开启tornado服务tornado.options.parse_command_line()#Defineappapp=tornado.web.Application(handlers=[(r'/model_predict',ModelPredictHandler),(r'/hello',HelloHandler),],#web路径控制)http_server=tornado.httpserver.HTTPServer(app)http_server.listen(options.port)tornado.ioloop.IOLoop.instance().start()main()我们定义tornado来封装模型预测的HTTP服务,运行脚本,启动模型预测的HTTP服务,然后使用Python脚本测试预测效果模型的以及预测时间,预测代码脚本完整代码如下:importtimeimportjsonimportrequestst1=time.time()texts=['据《新闻联播》,9月9日至11日,赵乐际中纪委书记赴河北调研','记者从国家发改委、商务部获悉,美方决定对10月1日起实施的对中国输美商品加征关税的措施进行调整。根据全球化原则和WTO规则,如果从美国采购一定数量的大豆、猪肉等农产品,国务院关税税则委员会将对上述采购品加征关税。','据印度Zee新闻网12日报道,亚洲新闻国际通讯社援引印度军方消息称,9月11日的对峙发生在班公错北岸实控线附近。','儋州市决定,自9月起,对城镇低保、农村低保、特困供养人员、优抚对象、失业保险对象、已登记人员等低收入群体共计3万余人对建档立卡贫困户每人发放猪肉价格补贴,每人每月补贴不少于100元。今后,缴费标准将根据猪肉价格波动动态调整。','9月11日,华为心声社区发布了美国经济学家ThomasFriedman在《纽约时报》的专栏内容。弗里德曼透露,近日在接受华为创始人任正非采访时,任正非表示华为愿意与美国司法部进行开放式讨论。','造血干细胞移植治疗白血病的技术日趋成熟。但是,通过这种方法治愈艾滋病,仍然是一个需要全球范围内同时解决的难题。','英国航空事故调查局(AAIB)近日披露,今年2月6日,在从德国法兰克福飞往墨西哥坎昆的航班上,飞行员翻倒了控制面板上的咖啡和烟雾,导致飞机返回并在爱尔兰紧急降落。','周四(9月12日),印尼财政部长SriMulyaniIndrawati明确表示:特朗普的推特是风险之一。','华中科技大学9月12日通过官网发布公告称,9月2日,我校一名研究生不幸坠楼身亡。','微博用户@ooooviki公布了9月12日下午发生在自己身上的惊悚遭遇:自称网警郑阳利用职务之便,查出她完整的个人信息,包括但不限于身份证号码、家庭住址、电话号码、户籍变更等,他要求她做他的女朋友。','今天,贵阳取消汽车限购,成为目前全国实施限购政策的9个省市中第一个取消限购的城市。','据悉,与全球同步,中国区将于9月13日在iPhone官方渠道和京东商城正式开启预售,京东成为iPhone官方唯一授权预售渠道苹果在中国。','央行公布的数据显示,截至2019年6月末,存款性金融机构居民部门短期消费贷款规模9.11万亿元。2019年上半年,该项目净增加3293.19亿元。不乐观。','9月11日,一段浙江万里学院学生食堂的视频在网上走红。视频显示,学校食堂不仅在就餐区设置了大屏幕供看电影和比赛,还推出了“一人餐”餐桌。','那天,在北京举行的2019年国际篮联篮球世界杯半决赛中,西班牙队对阵澳大利亚队。',]print(len(texts))fortextintexts:url='http://localhost:16016/model_predict?text=%s'%textreq=requests.get(url)print(json.loads(req.content))t2=time.time()print(round(t2-t1,4))运行这段代码,输出结果如下:(预测文本中的时间)一共预测了15个句子。['9月9日至11日']['几天前','10月1日','今天']['12日','9月11日']['9月']['9月11日'][]['最近','今年2月6日']['当地时间星期四(9月12日)']['9月12日','9月2日']['9月12日下午']['今天','当前']['September13']['EndofJune2019','Firsthalfof2019','Firsthalf']['September11']['Today','2019']预测耗时:15.1085s。模型预测的效果还是不错的,但是每句话的平均预测时间在1秒以上,模型预测时间还是有点长。后续作者将研究如何缩短模型预测的时间。总结本项目主要介绍如何使用tensorflow-serving部署kashgari模型。项目已经上传到github,地址:https://github.com/percent4/tensorflow-serving_4_kashgari。至于如何缩短模型预测的时间,笔者还有待继续研究,欢迎大家关注~