NLP(十八)利用ALBERT提升模型预测速度的一次尝试

前沿

??在文章NLP(十七)利用tensorflow-serving部署kashgari模型中,笔者介绍了如何利用tensorflow-serving部署来部署深度模型模型,在那篇文章中,笔者利用kashgari模块实现了经典的BERT+Bi-LSTM+CRF模型结构,在标注了时间的文本语料(大约2000多个训练句子)中也达到了很好的识别效果,但是也存在着不足之处,那就是模型的预测时间过长,平均预测一个句子中的时间耗时约400毫秒,这种预测速度在生产环境或实际应用中是不能忍受的。
??查看该模型的耗时原因,很大一部分原因在于BERT的调用。BERT是当下最火,知名度最高的预训练模型,虽然会使得模型的训练、预测耗时增加,但也是小样本语料下的最佳模型工具之一,因此,BERT在模型的架构上是不可缺少的。那么,该如何避免使用预训练模型带来的模型预测耗时过长的问题呢?
??本文决定尝试使用ALBERT,来验证ALBERT在提升模型预测速度方面的应用,同时,也算是本人对于使用ALBERT的一次实战吧~

ALBERT简介

??我们不妨花一些时间来简单地了解一下ALBERT。ALBERT是最近一周才开源的预训练模型,其Github的网址为:https://github.com/brightmart/albert_zh ,其论文可以参考网址:https://arxiv.org/pdf/1909.11942.pdf 。
??根据ALBERT的Github介绍,ALBERT在海量中文语料上进行了预训练,模型的参数更少,效果更好。以albert_tiny_zh为例,其文件大小16M、参数为1.8M,模型大小仅为BERT的1/25,效果仅比BERT略差或者在某些NLP任务上更好。在本文的预训练模型中,将采用albert_tiny_zh。

利用ALBERT训练时间识别模型

??我们以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地址:。
??一些模型的参数可以如下:

  • 预训练模型:ALBERT(tiny)
  • 训练样本的最大字符长度: 128
  • batch_size: 8
  • epoch: 100
  • 双向LSTM的个数:100

??ALBERT的模型训练时间也会显著提高,我们耐心地等待模型训练完毕。在time.dev和time.test数据集上的表现如下表:

数据集 precision recall f1
time.dev 81.41% 84.95% 83.14%
time.test 83.03% 86.38% 84.67%

??接着笔者利用训练好的模型,用tornado封装了一个模型预测的HTTP服务,具体的代码如下:

# -*- 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来测试模型预测的效果和时间,如下图所示:

可以看到,模型预测的结果正确,且耗时仅为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模型确实提升了模型预测的时间,而且效&果非常显著。

总结

??由于ALBERT开源不到一周,而且笔者的学识、才能有限,因此,在代码方面可能会存在不足。但是,作为一次使用ALBERT的历经,希望能够与大家分享。
??本文绝不是上述项目代码的抄袭和堆砌,该项目融入了笔者自己的思考,希望不要被误解为是抄袭。笔者使用上述的bertNER和ALBERT,只是为了验证ALBERT在模型预测耗时方面的提速效果,而事实是,ALBERT确实给我带来了很大惊喜,感受源代码作者们~
??最后,附上本文中笔者项目的Github地址:https://github.com/percent4/ALBERT_4_Time_Recognition 。
??众里寻他千百度。蓦然回首,那人却在,灯火阑珊处。

参考文献

  1. 超小型BERT中文版横空出世!模型只有16M,训练速度提升10倍:https://mp.weixin.qq.com/s/eVlNpejrxdE4ctDTBM-fiA
  2. ALBERT的Github地址:https://github.com/brightmart/albert_zh
  3. bertNER项目的Github地址:https://github.com/yumath/bertNER
  4. NLP(十七)利用tensorflow-serving部署kashgari模型: https://www.cnblogs.com/jclian91/p/11526547.html

原文地址:https://www.cnblogs.com/jclian91/p/11701400.html

时间: 2024-08-29 17:50:41

NLP(十八)利用ALBERT提升模型预测速度的一次尝试的相关文章

第五十八课、自定义模型类(上)------------------狄泰软件学院

 一.自定义模型类 1.QStandardItemModel是一个通用的模型类 (1).能够以任意的方式组织数据(线程.非线性) (2).数据组织的基本单位为数据项(QStandardItem) (3).每一个数据项能够存储多个具体数据(附加数据角色) (4).每一个数据项能够对数据状态进行控制(可编辑.可选...) 2.Qt中的通用模型类QStandardItemModel (1).QStandardItemModel继承自抽象的模型类QAbstractItemModel (2).QStand

菜鸟学SSH(十八)——Hibernate动态模型+JRebel实现动态创建表

项目用的是SSH基础框架,当中有一些信息非常相似,但又不尽同样.假设每个建一个实体的话,那样实体会太多.假设分组抽象,然后继承,又不是特别有规律.鉴于这样的情况.就打算让用户自己配置要加入的字段,然后生成相应的表. 须要动态配置的部分实例: 上图仅仅是一小部分,一个一个组合起来大概有三百多.每一项相应一个实体,显然不好,就算是依照规律归归类还是有不少.于是就想到了在执行期来确定这些东西.開始有尝试过动态编译生成实体类,后来发如今数据存取上都存在问题,由于是后来生成的,所以仅仅能用反射来获取.这样

java核心学习(十八) javaNIO框架---“块”模型的IO

一.java新IO概述 javaIO中的输入流和输出流都是通过字节的移动来处理的,面向流的输入输出系统一次只能处理一个字节,因此效率不高,而且传统的输入输出流是阻塞试的,也就是说当无法读到数据时,当前线程会被阻塞直到读取到有效数据才会继续运行. java1.4之后提供了一系列改进的输入输出类与方法,并且以NIO为基础改写了java.io包中的类,新增了满足NIO的功能. NIO采用内存映射文件的方式,java.nio中主要的包有: java.nio ,主要包含于Buffer相关的类: java.

NLP(二十二)利用ALBERT实现文本二分类

??在文章NLP(二十)利用BERT实现文本二分类中,笔者介绍了如何使用BERT来实现文本二分类功能,以判别是否属于出访类事件为例子.但是呢,利用BERT在做模型预测的时候存在预测时间较长的问题.因此,我们考虑用新出来的预训练模型来加快模型预测速度. ??本文将介绍如何利用ALBERT来实现文本二分类. 关于ALBERT ??ALBERT的提出时间大约是在2019年10月,其第一作者为谷歌科学家蓝振忠博士.ALBERT的论文地址为:https://openreview.net/pdf?id=H1

[WebGL入门]十八,利用索引缓存来绘图

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 本次的demo的运行结果 对应复杂的模型 上次,通过操作模型坐标变换矩阵,实现了多个模型的移动,旋转和放大缩小.但是,渲染的依然是简单的三角形,是个构造及其简单的模型.但是实际中,用WebGL来绘制一个简单的三角形的机会是很少见的.至少是个四角多边形吧,通常会是更复杂的模型.伴随着模型的复杂化

斯坦福第十八课:应用实例:图片文字识别(Application Example: Photo OCR)

18.1  问题描述和流程图 18.2  滑动窗口 18.3  获取大量数据和人工数据 18.4  上限分析:哪部分管道的接下去做 18.1  问题描述和流程图 图像文字识别应用所作的事是,从一张给定的图片中识别文字.这比从一份扫描文档中 识别文字要复杂的多. 为了完成这样的工作,需要采取如下步骤: 为了完成这样的工作,需要采取如下步骤: 1. 文字侦测(Text detection)——将图片上的文字与其他环境对象分离开来 2. 字符切分(Character segmentation)——将文

七月算法-12月机器学习在线班--第十八次课笔记-条件随机场CRF

七月算法-12月机器学习在线班--第十八次课笔记-条件随机场CRF 七月算法(julyedu.com)12月机器学习在线班学习笔记http://www.julyedu.com 1,对数线性模型 一个事件的几率odds,是指该事件发生的概率与该事件不发生的概率的比值. 1.1对数线性模型的一般形式 令x为某样本,y是x的可能标记,将Logistic/ Softmax回归的特征 记做 特征函数的选择:eg: 自然语言处理 1, 特征函数几乎可任意选择,甚至特征函数间重叠: 2, 每个特征之和当前的词

猪猪的机器学习笔记(十八)条件随机场

条件随机场 作者:樱花猪 摘要: 本文为七月算法(julyedu.com)12月机器学习第十八次课在线笔记.条件随机场是一种判别式概率模型,是随机场的一种,常用于标注或分析序列资料,如自然语言文字或是生物序列. 引言: “条件随机场”被用于中文分词和词性标注等词法分析工作,一般序列分类模型常常采用隐马尔科夫模型(HMM),像基于类的中文分词.但隐马尔可夫模型中存在两个假设:输出独立性假设和马尔可夫性假设.其中,输出独立性假设要求序列数据严格相互独立才能保证推导的正确性,而事实上大多数序列数据不能

COS访谈第十八期:陈天奇

COS访谈第十八期:陈天奇 [COS编辑部按] 受访者:陈天奇      采访者:何通   编辑:王小宁 简介:陈天奇,华盛顿大学计算机系博士生,研究方向为大规模机器学习.他曾获得KDD CUP 2012 Track 1第一名,并开发了SVDFeature,XGBoost,cxxnet等著名机器学习工具,是Distributed (Deep) Machine Learning Common的发起人之一. 何:你的本科在上海交大的ACM班就读,是怎么开始做机器学习研究的呢? 陈:我们当时的培养计划