学习

使用 RedisGears 构建自然语言处理管道

Alex Mikhalev
作者
Alex Mikhalev, Nationwide Building Society 的 AI/ML 架构师
Ajeet Raina
作者
Ajeet Raina, Redis 前开发人员增长经理

目标#

在本教程中,您将学习如何使用 RedisGears 构建自然语言处理 (NLP) 管道。在本演示中,我们将利用 Kaggle CORD19 数据集。该实现旨在避免内存不足,利用 Redis 集群和 RedisGears,其中使用 RedisGears 允许在存储上处理数据,而无需将数据移入移出 Redis 集群——使用 Redis 集群作为数据结构。Redis 集群允许横向扩展到 1000 个节点,并且与 RedisGears 结合使用,提供了一个分布式系统,让数据科学/ML 工程师可以专注于处理步骤,而无需担心为分布式计算编写大量脚手架。

该项目旨在使其他人员更容易做出贡献并构建更好的信息和知识管理产品。

为什么数据科学家使用 RedisGears?#

RedisGears 具有巨大的潜力,尤其是在文本处理方面——您可以在“数据上”处理数据,而无需将它们移入移出内存。重要事项的摘要

  • 内存存储(如果它是 Redis 集群,则可以横向扩展)
  • 无需移入移出即可处理数据(在数据上)
  • Gears - 类似于 Hadoop 上的 Spark,可以智能地处理存储(内存中)上的数据,无需将数据移入移出
  • 处于集群模式的 Redis 与 RedisGears 和启用的 python 一起使用仅占用 20 MB RAM。想想您可以将多少数据转移到您的笔记本电脑或服务器中。

什么是知识图?#

如今,我们生活在一个新的系统世界中,这些系统不仅运行文件、文件夹或网页,而且运行具有属性和彼此之间关系的实体,这些实体被组织成类和类别的层次结构。这些系统在从军工复合体到我们日常生活中的各个领域都有使用。Palantir、Primer 和其他数据公司在军事和安全部队中支持大规模情报和反情报项目,Quid 和 RecordedFuture 支持竞争分析,Bottlenose 和类似的企业支持在线声誉分析。Microsoft Graph 为企业支持新型生产力应用程序,Google Knowledge Graph 和 Microsoft 的 Satori 支持日常搜索查询,以及亚马逊信息图一起,通过使它们能够回答有关世界事实的问题来为相应的 AI 助手提供支持

所有这些(以及许多其他更专业的)系统都在不同的领域使用,但它们都使用知识图作为基础。

知识图是连接和理解来自不同数据源的信息的最佳方法之一,遵循其中一个供应商的座右铭—— “它是关于事物,而不是字符串”.

知识图由词库、分类法和本体组成。在这个管道中,我假设知识是在医学词库中捕获的 UMLS 以及文本中的概念,如果它们是同一个句子的部分,则相关联,因此概念成为节点,它们的关系成为边

概念具有 CUI(概念唯一标识符),这些标识符将成为节点中的主键,链接到 UMLS 词库。例如,如果您在演示网站上搜索“温度和湿度如何影响 2019-nCoV 的传播”? https://thepattern.digital/ 并移动滑块到 1996 年,有一条连接传播 (C5190195) 和出生 (C5195639) 的边,以及与句子匹配的部分,“婴儿出生的传播率”,来自题为“婴儿无热肺炎”的报告。

RedisGears 用于 NLP 预处理#

总体架构概述(组件图)#

摄取步骤 - 很简单,将所有 JSON 记录放入 RedisCluster 中,然后 NLP 管道开始处理所有记录,代码在这里 这里.

NLP 管道步骤如何适应 RedisGears?#

  1. 1.对于每条记录 - 检测语言(丢弃非英语),它是 过滤
  2. 2.将段落映射到句子 - flatmap
  3. 3.句子拼写检查器 - 它是 映射
  4. 4.将句子保存到哈希中 - 处理器

步骤 1. 先决条件#

确保在您的系统中安装 virtualenv

步骤 2. 克隆存储库#

 git clone --recurse-submodules https://github.com/applied-knowledge-systems/the-pattern.git
 cd the-pattern

步骤 3. 启动应用程序#

 docker-compose -f docker-compose.dev.yml up --build -d

步骤 4. 应用集群配置设置#

您可以在 RedisGears 上部署 PyTorch 和 spacy 以运行。

 bash post_start_dev.sh
提示

对于以数据科学为中心的部署,RedisCluster 应该处于 HA 模式,每个主节点至少有一个从节点。需要更改一些 rgcluster 的默认参数来适应 PyTorch 和 spacy 库的大小(每个库压缩后超过 1GB),带设置的 gist。

步骤 5. 创建或激活 Python 虚拟环境#

 cd ./the-pattern-platform/

步骤 6. 创建新环境#

您可以通过以下方式创建它

 conda create -n pattern_env python=3.8

或者

或者,您可以使用以下 CLI 激活它

 source ~/venv_cord19/bin/activate #or create new venv
 pip install -r requirements.txt

步骤 7. 运行管道#

 bash cluster_pipeline.sh

步骤 8. 验证 NLP 管道的功能#

等待片刻,然后检查

验证 Redis Graph 是否已填充:#

 redis-cli -p 9001 -h 127.0.0.1 GRAPH.QUERY cord19medical "MATCH (n:entity) RETURN count(n) as entity_count"
 redis-cli -p 9001 -h 127.0.0.1 GRAPH.QUERY cord19medical "MATCH (e:entity)-[r]->(t:entity) RETURN count(r) as edge_count"

检查 API 是否响应:#

 curl -i -H "Content-Type: application/json" -X POST -d '{"search":"How does temperature and humidity affect the transmission of 2019-nCoV"}'
 https://localhost:8080/gsearch

演练#

虽然 RedisGears 允许部署和运行像 spacy 和 BERT transformers这样的机器学习库,但上面的解决方案使用了更简单的方法:

 gb = GB('KeysReader')
 gb.filter(filter_language)
 gb.flatmap(parse_paragraphs)
 gb.map(spellcheck_sentences)
 gb.foreach(save_sentences)
 gb.count()
 gb.register('paragraphs:*',keyTypes=['string','hash'], mode="async_local")

这是整个管道:这 7 行代码允许您在分布式集群或使用所有可用 CPU 的单台机器上运行逻辑 - 除非您需要扩展到超过 1000 个节点,否则无需进行任何更改。我使用为命名空间段落注册的 KeysReader 来处理所有字符串或哈希值。我的管道需要以异步模式运行。对于数据科学家,我建议使用 gb.run 来确保齿轮功能正常工作,并且它将在批处理模式下运行,然后更改为注册 - 以捕获新数据。默认情况下,函数将返回输出,因此需要 count() - 以防止将整个数据集获取回发出命令的机器(对于 Cord19 来说是 90 GB)。

总体预处理非常简单 - 完整代码 在此。

需要注意的事项

  1. 1.节点进程只能本地保存 - 我们不移动数据,您想要保存的任何内容都应该带有哈希标签,例如添加到 processed_docs 集合中:
 execute('SADD','processed_docs_{%s}' % hashtag(),article_id)

2. 将外部库加载到计算线程中,例如,symspell 需要额外的字典并且需要两个步骤才能加载

 """
 load symspell and relevant dictionaries
 """
 sym_spell=None

 def load_symspell():
  import pkg_resources
  from symspellpy import SymSpell, Verbosity
  sym_spell = SymSpell(max_dictionary_edit_distance=1, prefix_length=7)
  dictionary_path = pkg_resources.resource_filename(
      "symspellpy", "frequency_dictionary_en_82_765.txt")
  bigram_path = pkg_resources.resource_filename(
      "symspellpy", "frequency_bigramdictionary_en_243_342.txt")
  # term_index is the column of the term and count_index is the
  # column of the term frequency
  sym_spell.load_dictionary(dictionary_path, term_index=0, count_index=1)
  sym_spell.load_bigram_dictionary(bigram_path, term_index=0, count_index=2)
  return sym_spell

3. Scispacy 是一个很棒的库和数据科学工具,但在几次部署迭代后,我最终阅读了 UMLS Methathesaurus 的数据模型文档,并决定直接从 UMLS 数据构建 Aho-Corasick 自动机。(MRXW_ENG.RRF 包含映射到 CUI 的所有英语术语)。Aho-Corasick 允许我将传入的句子匹配到节点对(来自医学词典的概念)并以图中的边形式呈现句子,Gears 相关的代码很简单

 bg = GearsBuilder('KeysReader')
 bg.foreach(process_item)
 bg.count()
 bg.register('sentence:*',  mode="async_local",onRegistered=OnRegisteredAutomata)

OnRegisteredAutomata 的执行方式类似于上面的 symspell 示例,只是它会下载预构建的 Aho-Corasick 自动机(30Mb)。Aho-Corasick 是一个非常快的匹配器,即使在普通笔记本电脑上也能每秒处理超过 900 Mb 的文本,RedisGears 集群可以非常流畅地分配数据和 ML 模型,并使用可用的 CPU 和内存进行匹配。完整的匹配器 代码.

匹配器的输出:节点和边是使用另一个 RedisGears 模式 rgsync 的候选者,您可以在其中快速写入 Redis,而 RedisGears 将使用 RedisStreams 将数据复制到较慢的存储中。但我决定使用流并手工构建 RedisGraph 数据库的填充,这将是下一篇博文的重点。

匹配器的输出:节点和边是使用另一个 RedisGears 模式 rgsync 的候选者,您可以在其中快速写入 Redis,而 RedisGears 将使用 RedisStreams 将数据复制到较慢的存储中,而此演示使用流并使用节点和边填充 RedisGraph 数据库,计算每个节点的排名。

号召性用语#

我们采用了 JSON 格式的 OCR 扫描并将其转换为知识图,演示了如何使用基于统一医学语言系统的传统语义网络/OWL/Methathesaurus 技术。Redis 生态系统为数据科学界提供了许多优势,并且可以成为 Kaggle 笔记本、ML 框架的核心,并使数据部署和分发更加愉快。我们行业的成功取决于我们的工具如何协同工作 - 无论它们是工程、数据科学、机器学习、组织还是架构。

在 RedisLabs 和社区的协作下,完整的管道代码可通过 https://github.com/applied-knowledge-systems/the-pattern-platform获得。如果您想在本地尝试,那么您可以在存储库的根目录中找到一个 Docker 启动脚本以及简短的快速入门指南。PR 和建议都欢迎。该项目的总体目标是允许其他人在此基础上构建更有趣的管道。

参考文献#