关于作者:肖涵博士,bert-as-service 作者。现为腾讯 AI Lab 高级科学家、德中人工智能协会主席。肖涵的 Fashion-MNIST 数据集已成为机器学习基准集,在 Github 上超过 4.4K 星,一年来其学术引用数超过 300 篇。

肖涵在德国慕尼黑工业大学计算机系取得了计算机博士(2014)和硕士学位(2011),在北邮取得了信息通信学士学位(2009)。他曾于 2014-2018 年初就职于位于德国柏林的 Zalando 电商,先后在其推荐组、搜索组和 Research 组担任高级数据科学家。肖涵所创办的德中人工智能协会(GCAAI)如今拥有 400 余名会员,致力于德中两国 AI 领域的合作与交流,是德国最具影响力的新型团体之一。

WeChat: hxiao1987

Blog: https://hanxiao.github.io

德中人工智能协会: https://gcaai.org

Google AI 几周前发布的 BERT (Bidirectional Encoder Representations from Transformers) 模型在 NLP 圈掀起了轩然大波,其使用超多层 Transformer + 双任务预训练 + 后期微调的训练策略,在 11 个不同类型的 NLP 任务上刷新了纪录。

Google 随后在 Github 上开源了 BERT 的代码,并提供了在维基百科语料上使用 TPU 预训练好的模型供大家下载。这其中也包括了基于字符级别的中文 BERT 预训练模型。

BERT开源代码:

https://github.com/google-research/bert

bert-as-service 能让你简单通过两行代码,即可使用预训练好的模型生成句向量和 ELMo 风格的词向量:

你可以将 bert-as-service 作为公共基础设施的一部分,部署在一台 GPU 服务器上,使用多台机器从远程同时连接实时获取向量,当做特征信息输入到下游模型。


回顾:BERT的训练机制

BERT 模型的训练分为预训练(Pre-training)和微调(Pre-training)两步。预训练和下游任务无关,却是一个非常耗时耗钱的过程。Google 坦言,对 BERT 的预训练一般需要 4 到 16 块 TPU 和一周的时间,才可以训练完成。

庆幸的是,大部分 NLP 研究者只需使用 Google 发布的预训练模型,而不需要重复这一过程。你可以把预训练模型想象成一个 Prior,是对语言的先验知识,一旦拥有就不需要重复构造。

微调取决于下游的具体任务。不同的下游任务意味着不同的网络扩展结构:比如一个对句子进行情感分类的任务,只需要在 BERT 的输出层句向量上接入几个 Dense 层,走个 softmax。而对于 SQuAD 上的阅读理解任务,需要对 BERT 输出的词向量增加 match 层和 softmax。

总体来说,对 BERT 的微调是一个轻量级任务,微调主要调整的是扩展网络而非 BERT 本身。 换句话说,我们完全可以固定住 BERT 的参数,把 BERT 输出的向量编码当做一个特征(feature)信息,用于各种下游任务。

无论下游是什么任务,对于 NLP 研究者来说,最重要的就是获取一段文字或一个句子的定长向量表示,而将变长的句子编码成定长向量的这一过程叫做 sentence encoding/embedding。

bert-as-service 正是出于此设计理念,将预训练好的 BERT 模型作为一个服务独立运行,客户端仅需通过简单的 API 即可调用服务获取句子、词级别上的向量。在实现下游任务时,无需将整个 BERT 加载到 tf.graph 中,甚至不需要 TensorFlow 也不需要 GPU,就可以在 scikit-learn, PyTorch, Numpy 中直接使用 BERT。

bert-as-service

bert-as-service 将 BERT模型作为一个独立的句子编码(sequence encoding/embedding)服务,在客户端仅用两行代码就可以对句子进行高效编码。其主要特色如下:

  • state-of-the-art:基于 Google 最新发布的 BERT 模型;

  • 易用:客户端仅需简单两行代码即可调用;

  • 快速:每秒 780 个句子(见详细评测);

  • 并发性:自动扩展到多块 GPU,多客户端,高效任务调度,无延迟(见针对多客户端并发的评测)。

速度评测:

https://github.com/hanxiao/bert-as-service#Benchmark

并发评测:

https://github.com/hanxiao/bert-as-service#speed-wrt-num_client

使用方法

1. 下载 Google 发布的预训练 BERT 模型

从下方链接下载 Google 发布的预训练模型,解压到某个路径下,比如:/tmp/english_L-12_H-768_A-12/

预训练模型下载:

https://github.com/google-research/bert#pre-trained-models

你可以使用包括BERT-Base, MultilingualBERT-Base, Chinese在内的任意模型。

2. 开启 BERT 服务

python app.py -model_dir /tmp/english_L-12_H-768_A-12/ -num_worker=4

这个代码将开启一个 4 进程的 BERT 服务,意味着它可以最高处理来自 4 个客户端的并发请求。虽然同一时刻连接服务的客户端数量没有限制,但在某时刻多余 4 个的并发请求将被暂时放到一个负载均衡中,等待执行。有关 bert-as-service 背后的架构可以参考 FAQ 和并发客户端性能评测。

3. 使用客户端获取句子向量编码

对于客户端来说,你唯一需要的文件就是 service/client.py ,因为我们需要从中导入 BertClient

from service.client import BertClientbc = BertClient()bc.encode(['First do it', 'then do it right', 'then do it better'])

这会返回一个 3 x 768 的ndarray 结构,每一行代表了一句话的向量编码。你也可以通过设置,让其返回 Python 类型的 List[List[float]]

在另一台机器上使用 BERT 服务

客户端也可以从另一台机器上连接 BERT 服务,只需要一个 IP 地址和端口号:

# on another CPU machinefrom service.client import BertClientbc = BertClient(ip='xx.xx.xx.xx', port=5555)  # ip address of the GPU machinebc.encode(['First do it', 'then do it right', 'then do it better'])

你还可以把服务架设在 docker container 中使用,详情可以参考项目的 README.md。bert-as-service 所支持的 C/S 模式可以用下图总结:

性能评测

作为一个基础服务,速度和伸缩性(scalability)非常关键。只有当下游的模型能够通过其快速流畅地获取数据时,该服务的意义才能得到最大体现。BERT 的网络复杂度众所周知,那么 bert-as-service 能否达到工程级别的速度?为了验证这一点,我们做了如下方面的评测。

max_seq_len对速度的影响

max_seq_len 是服务端的一个参数,用来控制 BERT 模型所接受的最大序列长度。当输入的序列长度长于 max_seq_len 时,右侧多余字符将被直接截断。所以如果你想处理很长的句子,服务器端正确设置 max_seq_len 是其中一个关键指标。而从性能上来讲,过大的 max_seq_len 会拖慢计算速度,并很有可能造成内存 OOM。

client_batch_size 对速度的影响

client_batch_size 是指每一次客户端调用 encode() 时所传给服务器 List 的大小。出于性能考虑,请尽可能每次传入较多的句子而非一次只传一个。比如,使用下列方法调用:

# prepare your sent in advancebc = BertClient()my_sentences = [s for s in my_corpus.iter()]# doing encoding in one-shotvec = bc.encode(my_sentences)

而不要使用:

bc = BertClient()vec = []for s in my_corpus.iter():    vec.append(bc.encode(s))

如果你把 bc = BertClient() 放在了循环之内,则性能会更差。当然在一些时候,一次仅传入一个句子无法避免,尤其是在小流量在线环境中。

num_client 对并发性和速度的影响

num_client 指同时连接服务的客户端数量。当把 bert-as-service 作为公共基础设施时,可能会同时有多个客户端连接到服务获取向量。

可以看到一个客户端、一块 GPU 的处理速度是每秒 381 个句子(句子的长度为 40),两个客户端、两个 GPU 是每秒 402 个,四个客户端、四个 GPU 的速度是每秒 413 个。这体现了 bert-as-service 良好的伸缩性:当 GPU 的数量增多时,服务对每个客户端请求的处理速度保持稳定甚至略有增高(因为空隙时刻被更有效地利用)。

其它常见问题列表和详细指南

参见:

https://github.com/hanxiao/bert-as-service

点击以下标题查看更多论文解读:

#投 稿 通 道#

让你的论文被更多人看到

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢? 答案就是:你不认识的人。


总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得技术干货。我们的目的只有一个,让知识真正流动起来。

来稿标准:

• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)

• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接

• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志


? 投稿邮箱:

• 投稿邮箱:hr@paperweekly.site

• 所有文章配图,请单独在附件中发送

• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通

?

现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧

关于PaperWeekly

PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。

▽ 点击 |阅读原文 | 获取最新论文推荐

两行代码玩转 Google BERT 句向量词向量相关推荐

  1. Google BERT应用之《红楼梦》对话人物提取

    作者丨庞龙刚 学校丨UC Berkeley博士后 研究方向丨高能核物理.人工智能 之前看到过一篇文章,通过提取文章中对话的人物,分析人物之间的关系,很好奇如何通过编程的方式知道一句话是谁说的.但是遍搜 ...

  2. 【NLP】Google BERT详解

    版权声明:博文千万条,版权第一条.转载不规范,博主两行泪 https://blog.csdn.net/qq_39521554/article/details/83062188 </div> ...

  3. 丰巢快递柜启动超时收费3元封顶;谷歌市值一夜暴涨5000亿;两行代码构成的npm包影响到了数百万项目 | EA周报...

    EA周报 2020年4月30日 每个星期7分钟,元宝带你喝一杯IT人的浓缩咖啡,了解天下事.掌握IT核心技术. 热点大事件 丰巢快递柜启动超时收费3元封顶,菜鸟驿站表态继续免费保管 从深圳市丰巢科技有 ...

  4. Google BERT 中文应用之《红楼梦》中对话人物提取

    ​点击上方"迈微AI研习社",选择"星标★"公众号 转载自:PaperWeekly 庞龙刚 之前看到过一篇文章,通过提取文章中对话的人物,分析人物之间的关系,很 ...

  5. 玩转Google开源C++单元测试框架

    玩转Google开源C++单元测试框架Google Test系列(gtest)(总) 前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错. 我 ...

  6. iOS网络缓存扫盲篇--使用两行代码就能完成80%的缓存需求

    原文地址:https://github.com/ChenYilong/ParseSourceCodeStudy/blob/master/02_Parse的网络缓存与离线存储/iOS网络缓存扫盲篇.md ...

  7. 只需两行代码,2080Ti 就能当 V100用,这个炼丹神器真牛!

    作者 | 陈大鑫.青暮 话说人工智能江湖门派众多且繁杂,好似那大脑中的神经网络一般,但繁杂中却仍然有着一统的迹象...... 许久之前,ML派坐落美利坚合众山中,百年来武学奇才辈出,隐然成江湖第一大名 ...

  8. 一训练就显存爆炸?Facebook 推出 8 比特优化器,两行代码拯救你的显存

    自从人们发现越大的模型性能越好后,神经网络模型的参数量就在越来越大的道路上一去不复返了.从XX-large到GPT3,再到5300亿参数的Megatron Turing-NLG,深度学习越来越像是只有 ...

  9. 一训练就显存爆炸?Facebook 推出 8 比特优化器,两行代码拯救你的显存!

    文 | jxyxiangyu 编 | 小轶 "小夕,小夕!又出来了个 SOTA 模型!赶紧 follow !" 小夕看了看新模型的参数量, 然后看了看实验室服务器的几张小破卡. 小 ...

最新文章

  1. 互联网人必读的30本书
  2. sharepoint 不同路径下 COOKIE找不到
  3. 关于QSerialPort的使用说明(Qt实现串口工具)
  4. 别了,Docker Swarm !你好,K8s !
  5. Win下更新pip出现OSError:[WinError17]与PerrmissionError:[WinError5]及解决
  6. 光耦驱动单向可控硅_光耦继电器在实际应用中的作用以及工作原理!!
  7. 大数据之-Hadoop完全分布式_集群群起_同时启动上万台集群机器---大数据之hadoop工作笔记0037
  8. 怎样才算优秀的xyz员
  9. 小功能大用处 ---- 一键检测各服务器是否存活
  10. 非 ROOT 安卓内录
  11. android textview得到文字的长度,Android TextView 文字长度控制
  12. 基于java的oa协同办公系统_基于java的OA系统设计 毕业论文.doc
  13. wamp介绍及crossbar.io服务搭建
  14. 凹凸技术揭秘·羚珑页面可视化·成长蜕变之路
  15. 赚钱的地方,除了工资,还有这些
  16. uva-1645-递推
  17. 泛函分析简列:度量空间之Banach空间与模等价
  18. 对比两个字符串A、B的连续子串
  19. mysql update 负数_解决并发情况下库存减为负数问题--update2016.04.24
  20. 汽车温度采集记录测量管理的重要性以及K-TC测量模块介绍 热管理

热门文章

  1. 一文让你完全弄懂Stegosaurus
  2. 应用负载均衡之LVS(三):ipvsadm命令
  3. luogu P1007 独木桥
  4. Uva 725 除法
  5. 转:android git开源项目列表
  6. JAVA版StarDict星际译王简单实现
  7. ms SQL Server表自增字段重置
  8. windows和linux多进程效率,Windows程序效率 (转)
  9. selenium 页面经常改变元素_selenium 总结篇,常见方法和页面元素的操作
  10. sql长整型_SQL性能优化,太太太太太太太有用了!