亮点 • 概述 • 安装 • 入门 • 中心 • 文档 • 教程 • 贡献 • 发行说明 • 博客
GNES [ jee-nes ] 是Generic Neural Elastic Search ,一个基于深度神经网络的云原生语义搜索系统。
GNES 支持文本到文本、图像到图像、视频到视频以及任意到任意内容形式的大规模索引和语义搜索。
?要了解有关 GNES 关键原则的更多信息,请阅读这篇博文
☁️云原生和弹性 | ?便于使用 | ?最先进的 |
---|---|---|
GNES 是全微服务!编码器、索引器、预处理器和路由器都在自己的容器中运行。它们通过版本化 API 进行通信,并在 Docker Swarm/Kubernetes 等编排下进行协作。扩展、负载平衡、自动恢复,它们在 GNES 中是现成的。 | 部署仅涉及切换 VGG 层的更改需要多长时间?在 GNES 中,这只是 YAML 文件中的一行更改。我们将编码和索引逻辑抽象为 YAML 配置,以便您可以更改或堆栈编码器和索引器,甚至无需触及代码库。 | 利用快速发展的 AI/ML/NLP/CV 社区,我们从最佳深度学习模型中学习并将其插入 GNES,确保您始终享受最先进的性能。 |
?通用和通用 | ?模型作为插件 | ?最佳实践 |
搜索文本、图像甚至短视频?使用Python/C/Java/Go/HTTP作为客户端?无论您拥有哪种内容形式或使用哪种语言,GNES 都可以处理它们。 | 当内置模型不能满足您的要求时,只需使用 GNES Hub 构建您自己的模型即可。将您的模型打包为 docker 容器并将其用作插件。 | 我们喜欢从社区学习最佳实践,帮助我们的 GNES 实现更高水平的可用性、弹性、性能和耐用性。如果您有任何想法或建议,请随时贡献。 |
GNES Hub 将 AI/ML 模型作为 Docker 容器提供,并使用 Docker 容器作为插件。它提供了一种干净且可持续的方式将外部算法(带有依赖项)移植到 GNES 框架中。 GNES Hub 托管在 Docker Hub 上。 |
有两种方式获取 GNES,要么是 Docker 镜像,要么是 PyPi 包。对于云用户,我们强烈建议通过 Docker 使用 GNES 。
docker run gnes/gnes:latest-alpine
此命令下载最新的 GNES 映像(基于 Alpine Linux)并在容器中运行它。当容器运行时,它会打印一条信息性消息并退出。
除了针对该空间优化的alpine
镜像之外,我们还提供基于 Buster (Debian 10.0)、Ubuntu 18.04 和 Ubuntu 16.04 的镜像。下表总结了所有可用的 GNES 标签。可以用latest
、 stable
或v0..xx
填写{ver}
。 latest
指的是该存储库的最新 master ,它可能不稳定。我们建议您通过将latest
版本更改为版本号(例如v0.0.24
来使用官方版本,或者简单地使用stable
作为最后一个版本,例如gnes:stable-ubuntu
标签 | 尺寸和层数 | 描述 |
---|---|---|
{ver}-alpine | 基于Alpine Linux; 没有深度学习库; 极其轻巧便携,甚至可以在边缘设备上快速扩展。 | |
{ver}-buster | 基于Debian 10.0; 没有深度学习库; 推荐用于构建或扩展 GNES-Hub 映像。 | |
{ver}-ubuntu18 | 基于Ubuntu 18.04; 没有深度学习库。 | |
{ver}-full | 基于Ubuntu 16.04; python-3.6.8、cuda-10.0、tf1.14、pytorch1.1、faiss、多个预训练模型; 沉重但独立,可用于端到端测试 GNES。 |
️ 自2019年10月21日起,我们已停止托管腾讯云公共镜像。旧的 Docker 镜像仍然存在,但腾讯云上不会再有新的镜像可用。
我们还提供公共镜像Github包。选择最适合您的镜子。
docker login --username=xxx docker.pkg.github.com/gnes-ai/gnes # login to github package so that we can pull from it
docker run docker.pkg.github.com/gnes-ai/gnes/gnes:latest-alpine
下表显示了构建管道的状态。
登记处 | 构建状态 |
---|---|
码头工人中心gnes/gnes:[tag] | |
Github 包docker.pkg.github.com/gnes-ai/gnes/gnes:[tag] |
pip
安装 GNES您还可以通过以下方式将 GNES 安装为Python3包:
pip install gnes
请注意,这只会安装 GNES 的“准系统”版本,包含运行 GNES 的最小依赖项。不会安装第三方预训练模型、深度学习/NLP/CV包。我们将此设置作为默认安装行为,因为 NLP 工程师感兴趣的模型可能对 CV 工程师不感兴趣。在 GNES 中,模型充当 Docker 插件。
? Tensorflow、Pytorch 和 torchvision 不属于 GNES 安装的一部分。根据您的型号,您可能需要提前安装它们。
尽管不推荐,您可以通过以下方式安装具有完整依赖项的 GNES:
pip install gnes[all]
pip 安装 gnes[bert] | bert-serving-server>=1.8.6,bert-serving-client>=1.8.6 |
pip install gnes[风格] | 天赋>=0.4.1 |
pip install gnes[烦人] | 惹恼==1.15.2 |
pip install gnes[中文] | 结坝 |
pip install gnes[愿景] | opencv-python>=4.0.0,imagehash>=4.0 |
pip install gnes[leveldb] | plyvel>=1.0.5 |
pip install gnes[测试] | pylint、memory_profiler>=0.55.0、psutil>=5.6.1、gputil>=1.4.0 |
pip install gnes[变形金刚] | pytorch-变形金刚 |
pip 安装 gnes[onnx] | 运行时 |
pip 安装 gnes[音频] | 图书馆>=0.7.0 |
pip 安装 gnes[scipy] | scipy |
pip 安装 gnes[nlp] | bert-serving-server>=1.8.6、pytorch-transformers、flair>=0.4.1、bert-serving-client>=1.8.6 |
pip 安装 gnes[cn_nlp] | pytorch-transformers、bert-serving-client>=1.8.6、bert-serving-server>=1.8.6、jieba、flair>=0.4.1 |
pip 安装 gnes[全部] | pylint、psutil>=5.6.1、pytorch-transformers、annoy==1.15.2、bert-serving-client>=1.8.6、gputil>=1.4.0、bert-serving-server>=1.8.6、imagehash >=4.0、onnxruntime、memory_profiler>=0.55.0、jieba、 flair>=0.4.1、librosa>=0.7.0、scipy、plyvel>=1.0.5、opencv-python>=4.0.0 |
挑选依赖项的一个好方法是遵循 GNES Hub 中的示例并构建您自己的 GNES 映像。
无论哪种方式,如果您最终在$ gnes
或$ docker run gnes/gnes
之后阅读以下消息,那么您就可以开始了!
在开始之前,我先介绍一下GNES中两个重要的概念:微服务和工作流。
对于不熟悉云原生和微服务概念的机器学习工程师和数据科学家来说,可以将微服务想象成智能手机上的应用程序。每个应用程序独立运行,并且一个应用程序可以与其他应用程序协作来完成任务。在 GNES 中,我们有四个基本应用程序。微服务,它们是:
在GNES中,我们实现了数十个预处理器、编码器、索引器来处理不同的内容形式,例如图像、文本、视频。插入您自己的实现也非常容易,我们将在续集中看到一个示例。
现在我们有了一堆应用程序,我们期望它们做什么?典型的搜索系统有两个基本任务:索引和查询。索引是存储文档,查询是搜索文档。在神经搜索系统中,人们可能面临另一项任务:训练,其中根据数据分布微调编码器/预处理器,以实现更好的搜索相关性。
这三个任务对应 GNES 中的三个不同工作流程。
自
v0.0.46
起,GNES Flow 已成为 GNES 的主界面。 GNES Flow 提供了一种Pythonic且直观的方法来实现工作流程,使用户能够在本地计算机上运行或调试 GNES。默认情况下,GNES Flow 使用多线程或多进程后端编排所有微服务,它还可以导出到 Docker Swarm/Kubernetes YAML 配置,从而允许将 GNES 交付到云。
?完整的示例和相应的 Jupyter Notebook 可以在此处找到。
在此示例中,我们将使用新的gnes.flow
API(需要gnes >= 0.0.46
)构建一个玩具图像搜索系统,用于根据花朵的相似性进行索引和检索。
让我们首先定义索引工作流程:
from gnes . flow import Flow
flow = ( Flow ( check_version = False )
. add_preprocessor ( name = 'prep' , yaml_path = 'yaml/prep.yml' )
. add_encoder ( yaml_path = 'yaml/incep.yml' )
. add_indexer ( name = 'vec_idx' , yaml_path = 'yaml/vec.yml' )
. add_indexer ( name = 'doc_idx' , yaml_path = 'yaml/doc.yml' , recv_from = 'prep' )
. add_router ( name = 'sync' , yaml_path = 'BaseReduceRouter' , num_part = 2 , recv_from = [ 'vec_idx' , 'doc_idx' ]))
在这里,我们使用 inceptionV4 预训练模型作为编码器和内置索引器来存储向量和文档。该流程应该是非常不言自明的,如果不是,您可以随时将其转换为 SVG 图像并查看其可视化效果:
flow . build ( backend = None ). to_url ()
为了索引我们的花数据,我们需要一个迭代器来生成bytes
字符串并将这些bytes
字符串输入到定义的流中。
def read_flowers ( sample_rate = 1.0 ):
with tarfile . open ( '17flowers.tgz' ) as fp :
for m in fp . getmembers ():
if m . name . endswith ( '.jpg' ) and random . random () <= sample_rate :
yield fp . extractfile ( m ). read ()
我们现在可以通过多进程后端进行索引:
with flow ( backend = 'process' ) as fl :
fl . index ( bytes_gen = read_flowers (), batch_size = 64 )
这将需要几分钟的时间,具体取决于您的机器。
我们简单地采样 20 个花卉图像作为查询,并搜索它们的前 10 个相似图像:
num_q = 20
topk = 10
sample_rate = 0.05
# do the query
results = []
with flow . build ( backend = 'process' ) as fl :
for q , r in fl . query ( bytes_gen = read_flowers ( sample_rate )):
q_img = q . search . query . raw_bytes
r_imgs = [ k . doc . raw_bytes for k in r . search . topk_results ]
r_scores = [ k . score . value for k in r . search . topk_results ]
results . append (( q_img , r_imgs , r_scores ))
if len ( results ) > num_q :
break
这是结果,其中查询位于第一行。
人们可以通过以下方式轻松地将Flow
对象转换为 Docker Swarm/Kubernetes YAML 撰写文件:
flow . build ( backend = None ). to_swarm_yaml ()
version : ' 3.4 '
services :
Frontend0 :
image : gnes/gnes:latest-alpine
command : frontend --port_in 56086 --port_out 52674 --port_ctrl 49225 --check_version
False --ctrl_with_ipc True
prep :
image : gnes/gnes:latest-alpine
command : preprocess --port_in 52674 --port_out 65461 --host_in Frontend0 --socket_in
PULL_CONNECT --socket_out PUB_BIND --port_ctrl 49281 --check_version False --ctrl_with_ipc
True --yaml_path yaml/prep.yml
Encoder0 :
image : gnes/gnes:latest-alpine
command : encode --port_in 65461 --port_out 50488 --host_in prep --socket_in SUB_CONNECT
--port_ctrl 62298 --check_version False --ctrl_with_ipc True --yaml_path yaml/incep.yml
vec_idx :
image : gnes/gnes:latest-alpine
command : index --port_in 50488 --port_out 57791 --host_in Encoder0 --host_out
sync --socket_in PULL_CONNECT --socket_out PUSH_CONNECT --port_ctrl 58367 --check_version
False --ctrl_with_ipc True --yaml_path yaml/vec.yml
doc_idx :
image : gnes/gnes:latest-alpine
command : index --port_in 65461 --port_out 57791 --host_in prep --host_out sync
--socket_in SUB_CONNECT --socket_out PUSH_CONNECT --port_ctrl 50333 --check_version
False --ctrl_with_ipc True --yaml_path yaml/doc.yml
sync :
image : gnes/gnes:latest-alpine
command : route --port_in 57791 --port_out 56086 --host_out Frontend0 --socket_out
PUSH_CONNECT --port_ctrl 51285 --check_version False --ctrl_with_ipc True --yaml_path
BaseReduceRouter --num_part 2
要部署它,只需将生成的 YAML 配置复制到文件my-gnes.yml
中,然后执行
docker stack deploy --compose-file my-gnes.yml gnes-531
在此示例中,我们将使用 GNES 构建语义诗歌搜索引擎。与之前的花搜索示例不同,这里我们将每个服务作为独立的 Docker 容器运行,然后通过 Docker Swarm 编排它们。它代表了云设置中的常见场景。您将学习如何使用 GNES 中心中强大且定制的 GNES 图像。
?请查看此存储库以了解详细信息并按照说明进行复制。
让我们简短回顾一下我们所学到的知识。
GNES 的官方文档托管在 doc.gnes.ai 上。它会在每个新版本中自动构建、更新和存档。
?教程仍在建设中。敬请关注!同时,我们真诚欢迎您贡献自己的GNES学习经验/案例!
PyTorch-Transformers
移植到 GNES 中bert-as-service
迁移我们设置此存储库来跟踪不同 GNES 版本的网络延迟。作为 CICD 管道的一部分,当 GNES 主版本更新或发布新的 GNES 版本时,此存储库会自动更新。
❤️开始总是最难的。但不用担心,即使您发现拼写错误、缺少文档字符串或单元测试,您也可以通过提交 GNES 来简单地纠正它们。步骤如下:
fix-gnes-typo-1
fix(readme): improve the readability and move sections
fix(readme): improve the readability and move sections
干得好! PR 合并后,接下来会发生以下事情:
-latest
标签的 Docker 镜像将在一小时内自动更新。您可以在这里查看其建筑状态-stable
标签的 Docker 镜像都会相应更新。更多详细信息可以在贡献者指南中找到。
如果您在学术论文中使用 GNES,我们非常欢迎您进行引用。以下是引用 GNES 的两种方式:
footnote{https://github.com/gnes-ai/gnes}
@misc{tencent2019GNES,
title={GNES: Generic Neural Elastic Search},
author={Xiao, Han and Yan, Jianfeng and Wang, Feng and Fu, Jie and Liu, Kai},
howpublished={ url {https://github.com/gnes-ai}},
year={2019}
}
如果您已下载 GNES 二进制文件或源代码的副本,请注意,GNES 二进制文件和源代码均根据 Apache 许可证版本 2.0 获得许可。
腾讯很高兴通过提供 GNES 来支持开源社区。