Jina AI x 矩池云

2023-11-10

近 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)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jina AI x 矩池云 的相关文章

随机推荐

  • LVS负载均衡之--Keepalived模式(具详细)

    前言 前面和拐友们一起掌握了NAT和DR模式 这章来看一下负载均衡里的最后一种Keepalived模式 在生产中这个模式用的是还是比较广泛的 目录 一 Keepalived概述 1 2Keepalived的工作原理 1 3Keepalive
  • 登录时发起的请求是Get还是Post?Get和Post的区别

    为了保证信息的安全性 注册 登录等操作通常都会使用POST请求 GET请求一般用来获取信息 1 根据HTTP规范 GET用于信息获取 GET请求的数据会附在URL之后 就是把数据放置在HTTP协议头中 以 分割URL和传输数据 参数之间以
  • CSS总结第七天

    day09 前端基础CSS第七天 学习目标 能够使用精灵图 能够使用字体图标 能够写出 CSS 三角 能够写出常见的 CSS 用户界面样式 能够说出常见的布局技巧 1 精灵图 重点 1 1 为什么需要精灵图 一个网页中往往会应用很多小的背景
  • IDEA 类名及方法名为红色,但是能正常启动-处理办法

    今天在切换分支过后 idea里面很多类名 方法名报红 提示类等找不到 但是不影响功能 解决办法 点击 idae 的 File gt Invalideate Caches Restart 清除缓存并重启即可 UG7O9VKKH6 eyJsaW
  • Spark:常用算子总结大全

    目录 park的算子的分类 从大方向来说 Spark 算子大致可以分为以下两类 1 Transformation 变换 转换算子 这种变换并不触发提交作业 完成作业中间过程处理 2 Action 行动算子 这类算子会触发 SparkCont
  • 小白的高德地图初体验(二)——聚合点

    小白的高德地图初体验 二 聚合点 说到高德地图 肯定要推荐官方文档 传送门 走你 小白的高德地图初体验 一 打点 小白的高德地图初体验 二 点聚合 小白的高德地图初体验 三 轨迹 小白的高德地图初体验 四 矢量图形 小白的高德地图初体验 五
  • Handler processing failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize

    最近把项目中es 从1 7 3 升级 到 2 2 2 遇到如下异常 exception org springframework web util NestedServletException Handler processing faile
  • Android Studio 2.4 Preview(译文)

    原文地址 http tools android com tech docs android profiler Android的探查Android Studio中预览2 4 新的Android探查器在Android 2 4工作室预览窗口代替了
  • Palindrome Partitioning

    Given a string s partition s such that every substring of the partition is a palindrome Return all possible palindrome p
  • pip 和conda

    区别 pip是Python包的通用管理器 conda是一个与语言无关的跨平台环境管理器 pip在任何环境中安装python包 conda需要安装在conda环境中装任何包 Pip代表Pip Installs Packages 是Python
  • seaborn palette参数各配色方案及显示效果

    使用方法 以采用Paired r配色方法为例 通过调用barplot palette Spectral r 来使用配色 Paired r Accent Accent r Blues Blues r BrBG BrBG r BuGn BuGn
  • STM32 基础系列教程 5 – 系统定时器

    前言 学习stm32 systime的使用 用基本定时器产生定时1ms定时中断 用于参生1ms系统时钟节拍 并实现将1ms 节拍改成500us 或其它时间功能 并实产生的时间节拍为机基准实现控制LED闪烁 示例详解 基于硬件平台 STM32
  • Centos7.5 防火墙关闭但是除22端口其他端口无法访问问题

    centos7系统 关闭 firewalld防火墙 但是除了22端口 其余端口无法被外界访问 本地访问正常 我这里是服务器缓存问题 将服务器防火墙重启刷新一下就可以正常使用了 根据下面命令 操作 firewalld 防火墙 启动 syste
  • 关于前后台日期格式化问题 ,@JsonFormat、@JSONField、@DateTimeFormat

    大家都知道可能前台表单提交后台 或者后台 实体类json 序列化到前台可能格式不是我们想要的情况 这时候可能就需要上面三个注解来帮忙 但是 本人在项目使用过程中 使用 JsonField 一直失效 百思不得其解 难道是 在springboo
  • 爬虫之添加代理(五)

    验证代理是否可用 try telnetlib Telnet 221 15 192 96 port 1080 timeout 3 except print ip无效 else print ip有效 添加代理 添加proxy属性 import
  • 【机器学习】GRU 讲解

    有任何的书写错误 排版错误 概念错误等 希望大家包含指正 在阅读本篇之前建议先学习 RNN 讲解 LSTM 讲解 3 GRU 3 1 网络结构 GRU 是循环神经网络的一种 和 LSTM 一样 是为了解决长期依赖问题 GRU 单元结构如下
  • Overleaf使用tips(自己随手记)

    使用中文输入 导入包 usepackage UTF8 ctex 切换编译器为XeLatex 另起一段 直接空几个行就行 比如 注释 选中后ctrl 标题的使用 section 这是一级标题 subsection 这是二级标题 subsubs
  • TVM编译安装

    本文是在已大致了解tvm功能和架构的基础上 根据官方文档 在x86 64 Ubuntu 18 04 GPU Pytorch1 8 0上安装TVM的流程 参考文档 TVM安装官方文档 llvm下载链接 1 下载源代码 从tvm官网下载源代码
  • 基于粒子群算法优化支持向量机(PSO-SVM)的时间序列预测。模型评价指标包括:R2、MAE、MSE、RMSE和MAPE等,代码质量极高,方便学习和替换数据。

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 tic 导入数据 f xlsread windspeed xls Sheet1 B2 B1001 x y da
  • Jina AI x 矩池云

    近 5 年以来 图片 视频 语音等非结构化数据的数量 出现了爆发式增长 随着深度学习技术的不断升级 深度表征学习 迁移学习 对比学习等技术日益成熟 非结构化数据的搜索也逐渐形成可能 在此背景下 专注于神经搜索技术的商业开源软件公司 Jina