译者: 辰石, 阿里巴巴计算平台事业部 EMR 团队技术专家, 目前从事大数据存储以及 Spark 相关方面的工作.
AI 在企业中的应用
关于 AI 在企业中应用的年度 O'Reilly 报告已经在 2019 年 2 月发布, 该报告针对多个垂直行业的 1300 多从业人员进行调查, 该调查包含受访者所在企业中生产环境的 AI 项目, 这些 AI 项目是如何在企业中应用, 以及 AI 如何快速的扩展到深度学习, 人机互助系统, 知识图谱, 强化学习中.
该调查包含了受访者企业主要使用 ML 以及 AI 的框架以及工具情况, 下图为使用情况总结的展示图:
其中 Spark NLP 在所有的框架以及工具排在第 7 位, 是迄今为止最受欢迎 NLP 库, 其受欢迎程度是 spaCy 的两倍, 事实上, 除了其他开源工具以及其他云服务外提供工具或者框架之外, Spark NLP 是继 scikit-learn, TensorFlow, keras, 和 PyTorch 之后最受欢迎的 AI 工具.
高准确度, 高性能以及扩展性
该调查与近年来 Spark NLP 在医疗保健, 金融, 生命科学和招聘中应用越来越广泛保持一致, 根本原因在 NLP 技术在近年来发生重大转变.
高准确度
在过去的 3-5 年中深度学习在自然语言领域的兴起使得算法的精度越来越高, 而传统的例如 spaCy, Stanford CoreNLP, ntlp 以及 OpenNLP 在精度上显然比不上这些最新的研究成果.
为了追求更高的准确度以及性能, 工业界不断将最新的研究成果产品化, 下图是迄今为止的总结(基于 en_core_web_lg 标准测试的 F1 值):
高性能
由于 Apache Spark 的优化使得无论在单机或者在集群的性能都已经非常接近 bare metal 的性能, Spark NLP 的性能可以比传统的 AI 库快一个数量级, 这些传统的库受限于他们的设计.
一年前 O'Reily 发布了迄今为止最全面的产品级别的 NLP 库性能对比测试, 下图中左侧为在 spaCy 和 Spark NLP 训练简单流水的性能对比图, 该测试基于单机配置 (Intel I5, 4 核, 16GB 内存) 进行:
利用 GPU 来进行训练以及推理编程深度学习的领域的一大趋势, 使用 TensorFlow 进行深度学习使得 Spark NLP 能够充分利用现代计算机平台 - 从 nVida 的 DGX-1 到 Intel 的 Cascade Lake 处理器, 传统的库, 不管有没有使用深度学习的技术, 需要重写代码才能够充分利用这些新硬件的特性, 而正是这些新硬件的特性使得 NLP 性能提高了一个数量级.
可扩展性
在深度学习领域能够将模型训练, 推理, 整个 AI 流水无缝从单机迁移到集群变得越来越关键, Spark NPL 得益于原生的构建 Apache Spark ML 之上, 能够在 spark 集群做任意扩展, 而 Spark 的分布式执行计划以及 Cache 的优化也能助力提升 Spark NLP 性能.
产品化的其他工作
产品级别的代码
不同于 AllenNLP 以及 NLP Architect 这样面向研究的 NLP 库, 我们致力于向企业提供我们的 Spark NLP 库.
开源许可协议
Spark NLP 使用 Apache 2.0 的许可协议, 不同于 Stanford CoreNLP(商业化需要付费)以及 SpaCy 模型使用的 ShareAlike CC 许可协议, 该协议是完全免费应用于商品化.
Python, Java, Scala 支持
支持多语言编程不仅提高了 Spark NLP 的受众面, 而且可以避免在使用过程数据的交换, 例如, SpaCy 只支持 Python, 用户在使用过程需要将数据在 JVM 进程和 Python 进程进行交换, 这样会导致架构变得复杂以及性能下降.
快速的版本发布
除了社区贡献, Spark NLP 还有一个专门的开发团队, Spark NLP 基本上每个月发布两次, 在 2018 年总共发布了 26 个版本, Spark NLP 社区非常欢迎贡献代码, 文档, 模型以及问题.
入门
Python
Spark NLP 2.0 一大设计目标就是使用者不要了解 Spark 或者 TensorFlow 就可以使用 Spark 和 TensorFlow 平台带来的好处. 用户不必要了解什么是 Spark ML 的 estimator 和 transformer, 或者什么是 tensorFlow graph 或者 session, 用户也可以使用 Spark NLP 构建自己的模型, 但是能够以最少时间和学习曲线完成, Spark NLP 内置的 15 种训练流水和模型可以覆盖大部分的用户场景.
用户可以通过 pip 或者 conda 安装 Spark NLP 的 python 版本, Jupyter 以及 Databricks 的安装以及配置细节可以参考 安装页面, Spark NLP 被广泛应用在各种组件当中, 包括 Zepplin, SageMaker, Azure,GCP, Cloudera 以及 Vanilla spark, 支持 K8S 和非 K8S 环境.
下图是展示的是情绪分析的简单例子:
下图是利用 Bert 模型训练命名实体识别的例子:
上述例子代码能够在 spark 集群上处理大量文本, 其中有两个关键的方法 - annotate(), 该方法以 string 类型作为输入, transform(), 该方法的数据输入是 spark 的 data frame.
Scala
Spark NLP 是用 Scala 语言编写的, 可以直接操作 Spark Data Frame, 在这过程中数据零拷贝, 可以充分利用 Spark 执行计划以及其他优化, 因此对于 Scala 和 Java 开发者, 使用 Spark NLP 非常方便.
Spark NLP 可以 Maven 库中找到, 用户只要加上 Spark NLP 的依赖就可以使用它, 如果用户希望是有 Spark NLP's OCR 能力, 需要安装额外的依赖. 下图是个拼写检查的例子:
深入了解 Spark NLP
Spark NLP 为用户屏蔽许多复杂的细节, 因此上面的代码片段都非常简单, 此外 Spark NLP 也提供了灵活性, 用户可以根据自己的需求进行定制. Spark NLP 针对训练领域的 NLP 模型做过深度优化. 下面详细介绍 Bert 模型训练命名实体识别的 Python 代码:
sparknlp.start() 创建 spark session.
PretrainedPipeline() 加载 explain_document_dl 流水的英文版本, 预训练模型以及他们的依赖.
启动 TensorFlow, TensorFlow 的进程跟 spark 的处于同一个 JVM 进程, 加载预先训练的 Embeddings 和深度学习的模型(例如 NER), 模型可以自动在集群上分发以及共享.
annotate() 启动 NLP 的推理流程, 并且分发各个阶段的算法流程.
NER 阶段运行在 tensorflow 上, 分别采用双向 LSTM 的神经网络以及 CNN
Embeddings 在推理过程用来将 contextual tokens 转换为 vectors
最后结果以 python 字典的形式输出
GIVE IT A GO
Spark NLP 主页包含大量的样例, 文档以及安装说明文档, 此外 Spark NLP 还提供了 docker 镜像, 用户可以很方便的在本地构建自己的环境. 用户如果遇到任何问题, 用户可以登录 Slack 寻求帮助.
来源: https://yq.aliyun.com/articles/706952