gnes是一个基于深层神经网络的云原生语义搜索系统。

gnes的Python项目详细描述


gnes generic neural elastic search,logo made by han xiao

pypi文档状态pypi-license

突出显示•。 概述• 安装. 入门•。 集线器•。 文档教程贡献•。 发行说明博客

它是什么

gnes[jee-nes]是一个基于深层神经网络的云原生语义搜索系统,是一个通用的神经弹性搜索系统。

gnes支持对文本到文本、图像到图像、视频到视频和内容表单进行大规模索引和语义搜索。

亮点

要了解GNES的关键原则,请阅读此博客文章

<;居中>; <表>

云本机和弹性

易于使用 最先进的技术 GNES全部在微服务中!编码器、索引器、预处理器和路由器都在各自的容器中运行。他们通过版本化的API进行通信,并在Docker Swarm/Kubernetes等的协调下进行协作。可扩展性、负载平衡、自动恢复使他们脱离SHE地面低频。部署一个只需在vgg中切换一个层的更改需要多长时间?在gnes中,这只是yaml文件中的一行更改。我们将编码和索引逻辑抽象到一个yaml配置中,这样您就可以在不接触代码基的情况下更改或堆栈编码器和索引器。利用快速发展的ai/ml/nlp/cv社区,我们从同类最佳的深度学习模型中学习,并将其插入到gnes中,确保您始终享受最先进的性能。

通用

作为插件的模型 最佳实践 搜索文本、图像甚至短视频?使用Python/C/Java/GO/HTTP作为客户端?不管你有哪种内容形式或者使用哪种语言,gnes都可以处理它们。< /Td>当内置模型不符合您的要求时,只需使用gnes hub构建自己的模型。将您的模型打包为Docker容器并将其用作插件。我们喜欢从社区学习最佳实践,帮助我们的GNE实现更高级别的可用性、弹性、性能和耐用性。如果您有任何想法或建议,请随时发表意见。<表> <;/居中>;

概述

组件概述

GNES集线器

<;居中>; <表>组件概述

gnes hub将ai/ml模型作为docker容器发送,并使用docker容器作为插件。它提供了一种将外部算法(带有依赖项)移植到gnes框架中的干净和可持续的方法。

GNES集线器位于Docker集线器上。

<表> <;/居中>;

安装GNES

获取gnes有两种方法,要么作为docker映像,要么作为pypi包。对于云用户,我们强烈建议通过Docker使用GNES

将gnes作为docker容器运行

docker run gnes/gnes:latest-alpine

此命令下载最新的gnes映像(基于alpine linux.org/" rel="nofollow">alpin linux)并在容器中运行。当容器运行时,它会打印一条信息性消息并退出。

选择正确的GNES图像

除了为空间优化的阿尔卑斯图像之外,我们还提供buster(debian 10.0)、ubuntu 18.04和ubuntu 16.04图像。下表总结了所有可用的gnes标签。可以用最新的稳定的v0..xx来填写{ver}最新的是指此存储库的最新主存储库,它可能不稳定。我们建议您使用官方版本,将最新的更改为一个版本号,例如v0.0.24,或者只在最后一个版本中使用稳定的,例如gnes:stable ubuntu

<表><标签>< 大小和层 说明 {ver}-阿尔卑斯山基于Alpine Linux;
无深度学习库;
极为轻巧和便携,可在边缘设备上快速扩展。{ver}-buster基于Debian 10.0;
没有深度学习库;
建议用于构建或扩展GNES中心图像。{ver}-ubuntu18基于ubuntu 18.04;
没有深度学习库。{ver}-已满基于ubuntu 16.04;
python-3.6.8、cuda-10.0、tf1.14、pytorch1.1、faiss、多个预训练模型;
重而独立,可用于端到端测试gnes。<表>

我们还提供了腾讯云上的公共镜像,中国大陆用户可以更快地从中提取图像。

docker login --username=xxx ccr.ccs.tencentyun.com  # login to Tencent Cloud so that we can pull from it
docker run ccr.ccs.tencentyun.com/gnes/gnes:latest-alpine

下表显示生成管道的状态。

<表>注册表生成状态码头枢纽
gnes/gnes:[标签]腾讯云
ccr.ccs.tencentyun.com/gnes/gnes:[标签]<表>

通过pip安装gnes

您还可以通过:

pip install gnes

请注意,这将只安装一个"赤裸裸"版本的gnes,由运行gnes的最小依赖项组成。不会安装第三方预培训模型、深入学习/nlp/cv包。我们将此设置作为默认安装行为,因为nlp工程师感兴趣的模型可能对cv工程师不感兴趣。在GNE中,模型充当Docker插件。

< Buff行情>

Tensorflow、Pythorch和TorchVision不属于GNES安装的一部分。根据您的型号,可能需要提前安装。

虽然不推荐,但您可以通过:

pip install gnes[all]
<细节>或根据表选择依赖项下面:(单击展开…)<表>aaaaaaaaaa 5bert-服务-服务器>;=1.8.6,bert-服务-客户端>;=1.8.6aaaaaaaaaa 6flair>;=0.4.1aaaaaaaa 7烦恼==1.15.2aaaaaaaaaa 8jiebaaaaaaaaaaa 9opencv-python>;=4.0.0,imagehash>;=4.0a10plyvel>;=1.0.5a11pylint,内存探查器>;=0.55.0,psutil>;=5.6.1,gputil>;=1.4.0aaaaaaaaaa 12pytorch-变压器 aaaaaaaaaa 13onnxruntimeaaaaaaaaaa 14librosa>;=0.7.0a15scipyaaaaaaaaaa 16bert-服务-服务器>;=1.8.6,pytorch-变压器,flair>;=0.4.1,bert-服务-客户>;=1.8.6a17pytorch-transformers,bert-serving-client>;=1.8.6,bert-serving-server>;=1.8.6,jieba,flair>;=0.4.1<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<0.4.1, librosa >=0.7.0, scipy, plywell >=1.0.5,opencv-python>;=4.0.0<详细内容>

选择依赖项的一个好方法是按照gnes hub中的示例创建自己的gnes映像。

不管怎样,如果您在$gnes$docker run gnes/gnes之后阅读以下消息,那么您就可以开始了!

GNES成功安装

开始

128035;准备工作

在开始之前,让我先介绍两个作为gnes主干的重要概念:微服务运行时

微服务

对于不熟悉"云计算原生"和"微服务"概念的机器学习工程师和数据科学家,可以将微服务想象为P P(在智能手机上)。每个应用程序独立运行,一个应用程序可以与其他应用程序协作完成一项任务。在gnes中,我们有四个基本的应用,aka。微服务,它们是:

  • 预处理器:将现实世界中的对象转换为可使用的语义单元列表;
  • 编码器:用向量表示表示语义单元;
  • 索引器:将向量存储到允许快速访问的内存/磁盘中;
  • 路由器:转发微服务之间的消息:例如批处理、映射、缩减。

在gnes中,我们实现了几十个预处理器、编码器、索引器来处理图像、文本、视频等不同的内容形式。插入您自己的实现也非常容易,我们将在续集中看到一个示例。

运行时

好吧,现在我们有了一堆应用程序,我们希望它们做什么?在典型的搜索系统中,有两项基本任务:索引和查询。索引是存储文档,查询是搜索文档,非常简单。在神经搜索系统中,还可能面临另一个任务:训练,根据数据分布对编码器/预处理器进行微调,以获得更好的搜索相关性。这三个任务:索引、查询和训练,我们称之为gnes中的三个运行时。

了解GNES的关键是了解哪个运行时需要哪些微服务,每个微服务都做什么

在本地计算机上构建您的第一个GNES应用程序

让我们从一个典型的索引过程开始,编写一个yaml配置(请参见表的左列):

<表>yaml configgnes工作流(由gnes board生成)
docker run gnes/gnes:latest-alpine
9 示例1的GNES工作流<表>

现在让我们看看yaml配置说明了什么。第一印象,很直观。它定义了一个由预处理、编码和索引组成的流水线工作流,其中前一个组件的输出是下一个组件的输入。此管道是索引查询运行时的典型工作流。在每个组件下,我们还将其与指定其工作方式的yaml配置相关联。现在它们对于理解全局并不重要,但是好奇的读者可以通过展开下面的条目来查看每个yaml的外观。

<细节>预处理器配置:text-prep.yml(单击展开…)
docker login --username=xxx ccr.ccs.tencentyun.com  # login to Tencent Cloud so that we can pull from it
docker run ccr.ccs.tencentyun.com/gnes/gnes:latest-alpine
0 <详细内容><细节>编码器配置:gpt2.yml(单击展开…)
docker login --username=xxx ccr.ccs.tencentyun.com  # login to Tencent Cloud so that we can pull from it
docker run ccr.ccs.tencentyun.com/gnes/gnes:latest-alpine
1 <详细内容><细节>索引器配置:b-indexer.yml(单击展开…)
docker login --username=xxx ccr.ccs.tencentyun.com  # login to Tencent Cloud so that we can pull from it
docker run ccr.ccs.tencentyun.com/gnes/gnes:latest-alpine
2 <详细内容>

在上表的右侧,您可以看到实际数据流的样子。工作流中自动添加了一个附加组件grpcfrontend,它允许您通过端口5566

现在是时候逃跑了!gnes board可以根据您提供的yaml配置自动生成启动脚本/配置,省去了自己编写脚本的麻烦。

gnes board

< Buff行情>

您也可以在本地启动GNES板。只需运行docker run-d-p 0.0.0:80:8080/tcp gnes/gnes compose--serve

作为云本机应用程序,gnes需要一个编排引擎来协调所有微服务。我们支持kubernetes、docker swarm和基于shell的多进程。让我们看看在这种情况下生成的脚本是什么样子的。

<细节>基于shell的启动脚本(单击展开…)
docker login --username=xxx ccr.ccs.tencentyun.com  # login to Tencent Cloud so that we can pull from it
docker run ccr.ccs.tencentyun.com/gnes/gnes:latest-alpine
3 <详细内容><细节>DockersWarm撰写文件(单击展开…)
docker login --username=xxx ccr.ccs.tencentyun.com  # login to Tencent Cloud so that we can pull from it
docker run ccr.ccs.tencentyun.com/gnes/gnes:latest-alpine
4 <详细内容>

为了简单起见,我们将只使用生成的shell sc启动GNES。创建一个新文件,比如run.sh,将内容复制到其中并通过$bash./run.sh运行它。您应该看到如下输出:

在shell中成功运行gnes

这表明gnes应用程序已经准备就绪,正在等待输入的数据。现在您可以通过grpcfrontend将数据馈送给它。根据您的语言(Python、C、Java、GO、HTTP、Shell等)和内容窗体(图像、视频、文本等),数据馈送部分可能略有不同。

要停止运行gnes,只需执行控制+c

将您的GNES应用程序扩展到云端

现在让我们把它加点汁。老实说,建立一个基于单机器流程的管道并不令人印象深刻。gnes的真正威力在于,您可以随时缩放任何组件。编码速度慢?增加更多的机器。预处理时间太长?更多的机器。索引文件太大?添加碎片,又名。更多的机器!

在这个例子中,我们为图像组成了一个更复杂的gnes工作流。此工作流由多个预处理器、编码器和两种类型的索引器组成。特别地,我们介绍了两种类型的索引器:一种用于存储编码的二进制向量,另一种用于存储原始图像,即全文索引。这两种索引器并行工作。查看表左侧的yaml文件了解更多详细信息,请注意如何为每个组件定义副本

<表>yaml configgnes工作流(由gnes board生成)
docker login --username=xxx ccr.ccs.tencentyun.com  # login to Tencent Cloud so that we can pull from it
docker run ccr.ccs.tencentyun.com/gnes/gnes:latest-alpine
5 示例2的GNES工作流=xxx ccr.ccs.tencentyun.com # login to Tencent Cloud so that we can pull from it docker run ccr.ccs.tencentyun.com/gnes/gnes:latest-alpine 6

请注意gnes-531是您的gnes堆栈名称,请记住该名称。如果你忘记了这个名字,你可以一直使用docker stack ls来查找。要判断整个堆栈是否成功运行,可以使用docker服务ls-f name=gnes-531。副本的数量1/14/4表明一切正常。

一般来说,一个完整而成功的Docker Swarm启动过程应该如下所示:

在shell中成功运行gnes

当gnes堆栈准备好并等待i编码数据,现在可以通过grpcfrontend将数据馈送给它。根据您的语言(Python、C、Java、GO、HTTP、Shell等)和内容窗体(图像、视频、文本等),数据馈送部分可能略有不同。

要停止正在运行的GNES堆栈,可以使用Docker Stack RM GNES-531

根据您的需要定制GNE

借助于gnes board,您可以轻松地编写一个用于不同目的的gnes应用程序。下表总结了一些常见的组合以及相应的工作流可视化。注意,为了清楚起见,我们隐藏了组件级yaml配置(即yaml路径)。

<表>yaml configgnes工作流(由gnes board生成) 仅并行预处理
docker login --username=xxx ccr.ccs.tencentyun.com  # login to Tencent Cloud so that we can pull from it
docker run ccr.ccs.tencentyun.com/gnes/gnes:latest-alpine
7 示例3的GNES工作流 训练编码器
docker login --username=xxx ccr.ccs.tencentyun.com  # login to Tencent Cloud so that we can pull from it
docker run ccr.ccs.tencentyun.com/gnes/gnes:latest-alpine
8 示例4的GNES工作流 带3个向量索引碎片的索引时间
docker login --username=xxx ccr.ccs.tencentyun.com  # login to Tencent Cloud so that we can pull from it
docker run ccr.ccs.tencentyun.com/gnes/gnes:latest-alpine
9 示例5的GNES工作流 包含2个矢量索引碎片和3个全文索引碎片的查询时间
pip install gnes
0 示例5的GNES工作流<表>

带回家信息

既然您已经知道如何编写和运行gnes应用程序,让我们简要回顾一下我们所学到的知识。

接下来是什么?

下一步是将数据馈送给gnes进行训练、索引和查询。有关更多详细信息,请查看教程文档

文档

readthedoc

gnes的官方文档位于doc.gnes.ai上。. 它在每一个新版本中都会自动生成、更新和存档。

教程

< Buff行情>

教程仍在建设中。敬请期待!同时,我们真诚地欢迎您为我们提供您自己的学习经验/案例学习!

贡献

感谢您对贡献的兴趣!gnes始终欢迎开源社区、个人提交者和其他合作伙伴的贡献。没有你,gnes就不会成功。

目前有三大贡献方向:

确保在第一次提交之前阅读参与者指南。

对于希望深入了解api的贡献者,我们建议克隆存储库并查看单元测试,以获取如何调用方法的示例。

引用gnes

如果你在学术论文中使用gnes,那么你非常欢迎引用。以下是引用gnes的两种方法:

  1. pip install gnes
    
    1
  2. pip install gnes
    
    2

许可证

如果您下载了GNES二进制文件或源代码的副本,请注意,GNES二进制文件和源代码都是根据2.0版的Apache许可证获得许可的。 腾讯很高兴通过提供GNE来支持开源社区。
版权所有(c)2019 THL A29有限公司,腾讯公司。保留所有权利。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java筛选hibernate中引用的属性   java如何在Bluej中创建以long(integer)为参数的对象   java如何通过JDBC在access中创建新字段   java如何获取格式化日期?   用模板方法模式设计过滤器接口   java编译错误:缺少返回语句   java从JOOQ中的代码生成中排除特定的模式   java小程序生命周期:init()和start()与destroy()和stop()之间的实际区别是什么?   如何在Java中获取类的所有公共静态方法?   匿名onClick方法内的java活动结果   java如何从数千个具有良好性能的寄存器构建excel工作表?   标记Java中多级中断的适当使用   网络化基于Java的Telnet代理服务器,支持TLS。但为什么是java。网SocketException:连接被拒绝   java将magnolia升级到5.6.1,vaadin资源   springcloudnetflixhystrix中的java重写HystrixCommandSpect bean