关于深度学习:Jina-AI-x-矩池云-神经搜索引擎一键构建

8次阅读

共计 5756 个字符,预计需要花费 15 分钟才能阅读完成。

近 5 年以来,图片、视频、语音等非结构化数据的数量,呈现了爆发式增长。 随着深度学习技术的一直降级,深度表征学习、迁徙学习、比照学习等技术日益成熟, 非结构化数据的搜寻也逐步造成可能。

在此背景下,专一于神经搜寻技术的商业开源软件公司 Jina AI,提出了神经搜寻 (Neural Search): 借助深度学习技术,实现多模态及跨模态的搜寻。

当初,Jina 框架曾经上线专一 AI 畛域的 GPU 云服务商矩池云 Matpool,学习者和研究者只需在租用机器时抉择 Jina 镜像,即可体验高效的、大规模非结构化数据搜寻。同时矩池云团队版用户还可实现基于镜像、材料、算力、存储等共享,实现高效合作。

神经搜寻 = 深度学习模型 + 向量搜寻

神经搜寻 (Neural Search) 是指用深度学习技术,对非结构化数据进行搜寻。

与传统搜寻不同的点在于,传统搜寻次要基于文本标签, 而神经搜寻则能够解决文本、图像、视频、音频甚至 3D Mesh 之间的多模态和跨模态搜寻问题。

神经搜寻零碎的利用,包含以图搜图、以文字搜图、问答机器人、照片去重、海量标签分类等

借助深度学习模型,神经搜寻将非结构化数据表示为向量。 向量空间中,类似数据汇聚合在一起,不同数据则会扩散在空间的不同地位。依据用户查问的数据, 在向量空间中寻找最近邻, 就能够实现非结构化数据的搜寻。

尽管多模态和跨模态搜寻是神经搜寻的重要利用场景,然而搭建神经搜寻解决方案却非常复杂, 往往波及到工程化、AI 建模和以及 DevOps。 简化这种复杂性,正是 Jina AI 在做的事件。

Jina AI 神经搜寻生态:端到端的开源技术栈

Jina AI 提供了一个涵盖整个开发过程的端到端开源技术栈,即神经搜寻生态。

Jina 全家桶产品一览

DocArray: The data structure for unstructured data

在神经搜寻生态中的第一个产品是 DocArray,这也是创立神经搜寻我的项目的第一步。

DocArray 将非结构化数据,对立成同一种数据结构。 利用 Python API,研发人员能够高效地解决、向量化、搜寻、举荐、存储及传输数据。

它实用于大型项目的构建,并且针对数据科学家和 AI 工程师进行了大量优化。

Jina: Cloud-native neural search framework for any kind of data

Jina 是生态中最早的产品,诞生于 2020 年。Jina 是一个云原生神经搜寻框架, 简略来讲,它能够把本地 DocArray 程序降级为一个高度可扩大的云服务。

开发者如果本人设计神经搜寻零碎,往往须要自行保护一套工具链,包含构建模型预测服务、保护向量索引等,Jina 通过将整个流程封装成一个残缺零碎,提供对立的接口, 极大升高了神经搜寻零碎的开发成本。

Finetuner: Fintune any DNN for better embedding on neural search tasks

优良的神经搜寻解决方案,往往须要一个绝佳的向量模型,公开的预训练模型个别就能解决这个问题,Finetuner 能够借助特定畛域的数据,进一步微调模型, 以取得更高的准确率,更好地利用于搜寻工作。

为此,Finetuner 能够被视作神经搜寻的最初一步。

CLIP-as-service: Embed images and sentences into fixed-length vectors with CLIP

CLIP-as-service 利用 CLIP 模型, 能够将图像和句子嵌入固定长度的向量中, 开发者能够在构建新的搜寻解决方案时,将其作为向量化服务,或者在用 Jina 在生产中构建服务时,简略地将其作为最佳实际。

Hub: Share and discover building blocks for neural search applications

理论利用中,一个搜寻解决方案通常包含许多组件,其中一些组件能够在不同工作中重复使用, 利用通用组件,能够极大简化开发过程。 为此 Hub 应运而生。

通过 Hub,开发者能够分享和发现来自官网和社区的组件,只需几分钟就能够从零开始,疾速搭建全新的搜寻解决方案。

JCloud: Simplify deploying and managing Jina project on Jina Cloud

将 Jina 我的项目部署到云端,你能够应用 JCloud。它是一个命令行界面,用于治理 Jina Cloud 上 Jina 我的项目的生命周期。

Jina Cloud 是一个云主机平台,它承载着 Jina 我的项目,并提供收费的计算和存储资源。

NOW: One line to host them all. Bootstrap your image search case in minutes

Jina NOW 通过一行代码解决文本到图像的搜寻问题。 对于首次应用 Jina 的用户,它提供了更精简的用户体验。

应用 Jina 全家桶的办法泛滥,通常研发人员会从 DocArray 开始设计原型,而后用 Jina 把它变成服务,再通过参考 Hub 上的组件减速开发进度,最初通过 JCloud 进行部署。

部署后,如果对准确率 (Accuracy)、准确率 (Precision) 和召回率 (Recall) 不称心,这时候就能够应用 Finetuner 进行调优。

如果此刻工作解决的是文本和图像,咱们也能够间接用 CLIP-as-service 作为向量服务。

代码实例:搭建图片搜索引擎

矩池云现已反对 Jina 镜像,开发者进入 matpool.com, 通过「 主机市场 - 租用 - 输出 Jina」即可间接运行。

在这个实例中,咱们应用 mini ImageNet 数据进行展现。

矩池云的公共数据集曾经为大家提供了相应的数据,咱们将数据复制到以后文件夹下

!cp /public/data/image/mini-imagenet/train.tar .
!tar -xf train.tar

应用 DocArray 库提供的 Document 对图片进行封装。多个 Document 形成一个 DocumentArray。

from docarray import Document, DocumentArray

DocumentArray 提供的 from_files 函数能够帮忙咱们疾速加载文件夹下的所有图片。图片文件的地位信息保留在 uri 属性中。plot_image_sprites 函数能够预览图片。

data_path = 'train/*/*.jpg'
docs = DocumentArray.from_files(data_path)
print(f"{len(docs)} Documents in DocumentArray")
docs[:16].plot_image_sprites() # Preview the images
38400 Documents in DocumentArray

定义 preproc 函数对图片进行预处理,应用 apply 函数对 DocumentArray 中的每个 Document 运行 preproc 函数。

def preproc(d: Document):
    return (d.load_uri_to_image_tensor()  # load
             .set_image_tensor_shape((80, 60))  # ensure all images right size (dataset image size _should_ be (80, 60))
             .set_image_tensor_normalization()  # normalize color 
             .set_image_tensor_channel_axis(-1, 0))  # switch color axis for the PyTorch model later

docs.apply(preproc)

通过 Document 的 uri 信息,咱们加载图片内容并以 ndarray 的格局保留在 tensor 属性中。​​​​​


╭─────────────────────── Documents Summary ───────────────────────╮│                                                                 ││   Length                 38400                                  ││   Homogenous Documents   True                                   ││   Common Attributes      ('id', 'tensor', 'mime_type', 'uri')   ││                                                                 │╰─────────────────────────────────────────────────────────────────╯╭────────────────────── Attributes Summary ───────────────────────╮│                                                                 ││   Attribute   Data type      #Unique values   Has empty value   ││  ─────────────────────────────────────────────────────────────  ││   id          ('str',)       38400            False             ││   mime_type   ('str',)       1                False             ││   tensor      ('ndarray',)   38400            False             ││   uri         ('str',)       38400            False             ││                                                                 │╰─────────────────────────────────────────────────────────────────╯

加载 ResNet50 模型,调用 embed 函数计算 DocumentArray 中的每个 Document 的向量示意。

这里咱们应用矩池云的预训练模型仓库中的 ResNet50 模型。​​​​​​​​​​​​​​​​​​​​

# Load ResNet50 from pytorch
import torch
if torch.cuda.is_available():
    device = "cuda"
else:
    device = "cpu"

from torchvision.models.resnet import resnet50

model_path = '/public/pytorch_models/resnet/resnet50-19c8e357.pth'

model = resnet50()
state_dict = torch.load(model_path)
model.load_state_dict(state_dict)

# Embed images
docs.embed(model, device=device)

每张图片的向量示意以 Tensor 格局保留在 embedding 属性中。

╭───────────────────────────── Documents Summary ──────────────────────────────╮│                                                                              ││   Length                 38400                                               ││   Homogenous Documents   True                                                ││   Common Attributes      ('id', 'tensor', 'mime_type', 'uri', 'embedding')   ││                                                                              │╰──────────────────────────────────────────────────────────────────────────────╯╭────────────────────── Attributes Summary ───────────────────────╮│                                                                 ││   Attribute   Data type      #Unique values   Has empty value   ││  ─────────────────────────────────────────────────────────────  ││   embedding   ('Tensor',)    38400            False             ││   id          ('str',)       38400            False             ││   mime_type   ('str',)       1                False             ││   tensor      ('ndarray',)   38400            False             ││   uri         ('str',)       38400            False             ││                                                                 │╰─────────────────────────────────────────────────────────────────╯

构建查问用的 DocumentArray,调用 match 函数在先前步骤中创立的 DocumentArray 中搜寻最类似的图片。搜寻后果保留在 matches 变量中,应用 plot_matches_sprites 函数进行可视化。​​​​​​​

# Match nearest neighbours
query_docs = (DocumentArray.from_files(index_data_path, size=10).apply(preproc).embed(model, device=device))

query_docs.match(docs,limit=10)

# Visualize the matches
query_docs[6].plot_matches_sprites(channel_axis=0, inv_normalize=True)

正文完
 0