Jina 开箱即用的云原生多模态系统解决方案

news2024/11/25 20:53:44

9f3c0382ef41abc64ba7da4b72bb472b.png

Jina 是一个基于云原生的多模态应用框架,开发者使用 Jina 可以轻松构建、部署和维护高性能的云原生应用。你可能认为这些都只是空泛的营销口号,甚至产生疑问,到底什么是云原生?对构建多模态应用有什么帮助?它是否只是 Jina 为了获得投资而许下的空洞承诺呢?

在本文里,我们将跟随一家电商公司的机器学习工程师小博,一起回顾他最近所负责的项目:搭建一个 以图搜图服务。通过这项服务,用户只需上传一张图片,便可以使用机器学习技术精准地搜索出相似的商品。我们将深入探究小博是如何完成这一挑战的,并解答文章开头提到的云原生相关问题。

小博的开发之旅

2be6217d5b70442c05b5bf984b2c0e1d.png

01

原型设计

以图搜图系统通常有两种模式:

  • 索引,创建库存中所有商品的可视化表示。

  • 检索,接收用户上传的照片,并搜索库存中相似的商品。

索引就是创建所有商品的可视化表示,首先利用卷积神经网络提取商品图像的特征,再将提取到的特征存储到数据库中。

检索则是根据用户上传的图片搜索外观相似的商品,因此,需要提取用户上传图像的特征,然后就可以根据向量间的相似度度量(如余弦相似度),搜索得到相似的商品。

为了完成以上任务,小博需要像 PyTorch 这样的深度学习框架,类似 MongoDB 的键值数据库,可能还需要像 Faiss 或 Elasticsearch 这样的向量搜索引擎。作为一名机器学习工程师,小博很熟悉 PyTorch 和原型设计,并且他聪明过人,精力充沛,所以很轻松就将它们连接在一起,完成了第一个原型设计。

82bd3b0401d2b892c22252307f337dad.gif

原型 —— 工程界最性感的工具

02

将原型升级为服务

这样就完成了吗?当然没有,一切才刚刚开始。小博的目标可不只是写一堆 Python 函数,为了建立 Web 服务,并且方便其它服务调用,小博还需要利用带有 API 的 Web 框架重构应用。

建立 Web 服务的方法很多,例如:利用 Django 框架。小博创建了一个接收用户上传图片的终端,根据相似度度量,从库存中检索相似的商品。最后,检索的结果会以 JSON 对象的格式返回给用户。

在建立 Web 服务的过程中,小博学习了很多新知识,例如 REST API、Web 服务和 Web 框架,但这些似乎已经超出“机器学习工程师”的能力范围。所以他内心开始产生疑问,是否值得花费这么多时间来学习,但学习新知识总归是好的。

但在内心深处,小博其实觉得他的技能可能还不足以让 Web 服务投入生产。但无论如何,经过一段时间的努力,终于把它们粘合在一起了。

1ea9cab160c1ce42ba5b602a5047a7a5.gif

SaaS,Soft-as-Service ——商业中最性感的东西

03

在云端部署

小博的进展成功地吸引了产品团队的注意,他们要求小博将服务部署在 AWS 上,并且提供一些真实的流量进行 A/B 测试。这意味着这个 PoC 将面向公众并拥有第一批用户。在将 Web 服务迁移到云端的过程中,小博遇到了很多问题,主要是依赖问题、CUDA 驱动以及 GPU 的麻烦。最终,他通过将所有内容打包在一个 30 GB的 Docker 镜像中解决了这些问题。虽然这是一个很大的单实例容器,但它易于部署和管理。

ca0bff95829a9d62a933d3f673ee7226.gif

04

提高可拓展性和性能

现在以图搜图构建完成了吗?还没有。产品团队要求在实际应用的过程中保证服务的可扩展性,这意味着特征提取必须并行进行,并且无延迟地处理并发的用户请求。除此之外,产品团队还要求一定的 QPS,每秒查询次数。

小博尝试使用多线程和多进程编程,提高服务的可扩展性和性能,但在他的深度学习技术栈中,没有开箱即用的工具。于是他决定学习高性能计算框架,如 Dask 或 Ray。经过一些试验和错误,终于将所有东西连接在一起,并使它们正常工作。但这个过程让小博非常疲惫,因为这些和他的专业知识相差太远了。

8c5638db9a4512796dd0c808730306e1.gif

可扩展性是如此重要,以至于小博情愿放弃其他两条腿。

05

确保可用性并尽量减少停机时间

产品经理:"如果我们的数据库由于更新,导致短期内出现故障怎么办?

于是,小博设计了一些原生的故障安全机制,这些都是他刚刚翻博客学到的,同时,配置了一些 AWS 服务来确保 Web 服务的可用性,希望它能做到 fire-and-forget,即用即走。

06

获得可观测性

产品经理:“我怎样才能看到流入的流量?“

小博将所有的 print 换成了 logger.info,并且不耐烦地启动了 dashboard。

07

解决安全问题

产品经理:“我们可以添加一些身份验证头吗?

产品经理:“这个服务容易受到攻击吗?

此时,小博已经精疲力尽。这与他的专业知识相去甚远,所以,他决定将项目移交给团队一位高级后端工程师,她在软件基础设施和云服务方面有着丰富的经验,并且她很乐意提供帮助。

于是小博和她一起坐下来,滚动浏览胶水代码,证明他使用的技巧和决策都是合理的,同时还向她解释了所有的警告。这位前辈不断地点头,最后她慢慢地喝了一口咖啡,然后说:

“我们为什么不重写呢?“

启发和教训

上面的例子很真实,因为小博可以是你、我或者任何机器学习工程师。最重要的是,它揭示了在生产中开发多模态 AI 系统面临一些阻碍:

首先是缺乏多模态 AI 系统的设计模式。开发者并不清楚怎么表示、计算、存储和传输多模态数据,以及如何在不同的工具之间切换并避免胶水代码。

其次是概念验证和生产系统之间的巨大鸿沟。 产品系统通常需要云原生技术来确保系统的专业性和可扩展性。微服务、协调、容器化和可观察性是产品系统的四大支柱。然而,对于许多机器学习工程师来说,这个学习曲线实在是太陡峭了。如此复杂的技术栈使得开发者难以构建生产就绪系统。

最后是进入市场的时间很长。如果公司选择了错误的技术栈,就会需要更长的时间将产品推向市场。因为公司需要花费很长的时间以及资源开发产品、重构产品,并反复进行。而且,错误的技术栈会导致产品本身出现问题,增加失败的风险。

云原生拯救世界

云原生是一种通过云计算来构建和运行应用的方式,它是一种基于微服务架构开发的方法,开发者可以把应用拆分成许多独立服务,以便更轻松地开发、部署和维护。它由以下概念组成:

  • 微服务:云原生系统的“积木块”

  • 编排:管理微服务的过程

  • 容器化:将微服务打包成容器

  • 可观察性:监控系统运行的过程

  • DevOps 和 CI/CD:自动化集成系统

听起来也许很酷但好像无关,但我们真的需要所有这些东西吗?

答案是肯定的,下面的表格总结了具体的原因:

多模态系统的特性

云原生如何解决

多模态系统是一个完整的流水线,要保证不同的模块能在不同的环境里面,独立并且分布式地运行。微服务对应每个任务模块,可以保证每一个模块独立的分布式的运行,再利用编排将它们协调成流水线。
多模态系统涉及的软件依赖十分复杂。容器化确保服务的可复用性和隔离性。
多模态系统通常需要后端或者软件基础设施服务提供额外的稳定性。DevOps 和 CI/CD 促进了系统的整合, 可观察性则提供了监测与诊断系统状态的一体化方案。

浅尝 Jina

接下来,让我们一起看看 Jina 的承诺吧。Jina 提供了一个统一的、云原生的全链路解决方案,用于帮助开发者构建多模态系统。Jina 给每一位开发人员提供了从 PoC 到生产就绪产品的最佳体验,不再有技术债,不再需要重构,不再需要在不同的系统间来回切换。

现在一切都开始有意义了,对吧?让我们一起看看 Jina 项目的运行和工作情况吧。

我们从 Hello, World 开始:我们写一个函数,将hello, world添加至一个 Document,在两个 Document 应用两次函数,然后返回并打印结果。

from jina import DocumentArray, Executor, Flow, requests


class MyExec(Executor):
    @requests
    async def foo(self, docs: DocumentArray, **kwargs):
        for d in docs:
            d.text += 'hello, world!'


f = Flow().add(uses=MyExec).add(uses=MyExec)

with f:
    r = f.post('/', DocumentArray.empty(2))
    print(r.texts
────────────────────────── 🎉 Flow is ready to serve! ──────────────────────────
╭────────────── 🔗 Endpoint ───────────────╮
│  ⛓     Protocol                    GRPC  │
│  🏠       Local           0.0.0.0:52570  │
│  🔒     Private     192.168.1.126:52570  │
│  🌍      Public    87.191.159.105:52570  │
╰──────────────────────────────────────────╯

['hello, world!hello, world!', 'hello, world!hello, world!']

虽然这是一个非常简单的程序,但是它抽象出了多模态系统的复杂性,并留下了一个基本逻辑:创建一个数据结构,对其进行操作,并返回结果。

当然,你也可以 14 行纯 Python 代码完成相同的功能。

class Document:
    text: str = ''


def foo(docs, **kwargs):
    for d in docs:
        d.text += 'hello, world!'


docs = [Document(), Document()]
foo(docs)
foo(docs)
for d in docs:
    print(d.text)

那么既然使用 Python 也可以完成同样的功能,为什么还需要 Jina 呢?Jina 的优势究竟是什么呢?

以下是 Jina 为你提供的开箱即用的功能

  • 只需一行代码就能实现复制、分片和可扩展性。

  • 具有双工流(duplex streams)的 C/S 架构。

  • 异步非阻塞式的数据工作流。

  • 支持 gRPC、WebSockets、HTTP、GraphQL 网关。

  • 从系统构建之初就采用微服务,无缝 Docker 容器化。

  • 清晰的版本和依赖控制。

  • 来自 Executor Hub 的可复用模块。

  • 利用 Prometheus 和 Grafana 获得实时可观察性。

  • Kubernetes 无缝集成。

你可能会认为以上的功能只是浮夸的营销,其实并不是,这些仅仅只触及了 Jina 能力的表面。

设计原则

拥有如此强大的功能,你可能会认为 Jina 的学习曲线一定非常陡峭。但其实只需要掌握 3 个概念,你就能上手 Jina:Document、Executor 和 Flow,这三个元素在 基本概念中有介绍。尤其是:

  • Document 是 Jina 生态的通用数据结构,用于表示非结构化多模态数据,对应数据层

  • Executor 是 Jina 的算法单元,对应逻辑层

  • Flow 将多个 Executor 连接起来,协调成流水线,对应编排层

ff86d165f588624d493d75c8c355cf47.png

Jina 一直追求极致的易用性,也在一直致力于平缓云原生技术的学习曲线,让开发者能够基于 Jina 轻松利用云原生技术搭建和部署自己的服务。

Jina 与 MLOps 的关系

MLOps 也就是用于机器学习的 DevOps,是将 DevOps 和机器学习工具结合起来的实践。与 MLOps 类似,Jina 也致力于提高机器学习的自动化程度,改进 AI 模型的构建、训练和部署过程。

使用 Jina 的好处包括:

  • 更高的开发效率、更可靠的交付性能:自动化的机器学习工作流(Jina 中的 Flow)加快了模型的开发速度,同时保证进程的可靠性。

  • 更高效的 ML 科学家和工程师的协作:Jina 有助于改善 ML 科学家和工程师之间的沟通与协作,因为 Jina 使得工程师更多地参与到机器学习模型的开发进程中。

  • 更好的模型性能(Jina 中的 Executor):自动化机器学习工作流确保了模型的质量,并提升了模型测试、验证的表现。

  • 基础设施即代码(Jina 中的 Flow):基础设施是另一个关键的用于机器学习的DevOps实践。它就是指用代码配置和管理基础架构,使其更加灵活并且可扩展。

  • 更强大的可观测性:监控和日志记录对于确保机器学习模型的质量至关重要。它们有助于及时发现错误和问题,以便快速修复。

  • 更灵活的模型管理:模型管理通过跟踪不同版本的机器学习模型,确保为每个任务都能使用正确的模型。

f8ec087ca1312668724425c3c1bc4c96.png

小博对 Jina 很满意,再也不用玩胶水代码了。

总结

以往在云上构建多模态系统既繁琐又耗时,并且需要用大量的胶水代码,反复的重构。经过好几个月的努力,最终得到的可能也只是一个脆弱且不可维护的系统。我们了解开发过程中的痛苦,并从中汲取经验教训,这就是我们建立 Jina 的原因。

Jina 的创立初衷就是极大地简化 AI 基础设施的复杂性,帮助开发者和企业快速将 AI 模型落地。使用 Jina,你从第一天起就会做得很专业,因为从 PoC 到生产,从部署到扩展,从监控到分析 —— 每一个环节都由 Jina 把关。你将拥有一个更方便、更高效、更愉快的开发多模态 AI 应用体验。

更多资料

💻 GitHub: get.jina.ai

📖 文档docs.jina.ai

🔗 原文链https://jina.ai/news/cloud-native-helps-you-build-multimodal-ai-in-production-here-is-how/

更多技术文章

📖 Jina AI创始人肖涵博士解读多模态AI的范式变革

🎨 语音生成图像任务|🚀 模型微调神器Finetuner

💨 DocArray + Redis:快到飞起来的推荐系统

😎 Jina AI正式将DocArray捐赠给Linux基金会

🧬 搜索是过拟合的生成;生成是欠拟合的搜索

b2046992cd2c44d50343f723bd86bd47.png

点击“阅读原文”,即刻了解 Jina

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux CentoOs7中用命令打开并修改文本文件

概述:VI/VIM VI 是 Unix 操作系统和类 Unix 操作系统中最通用的**文本编辑器**。 VIM 编辑器是从 VI 发展出来的一个性能更强大的**文本编辑器**。可以主动的以字体颜色辨别语法的正确性,方便程序设计。VIM 与 VI 编辑器完全兼容。 我们常常用vim命令…

C#语言实例源码系列-实现热键屏幕和设置热键

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中…

C++ 初阶 文件操作和io流

作者:小萌新 专栏:C初阶 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:简单介绍C中的文件操作和io流 文件操作和io流C语言中的输入和输出流是什么?Cio流C标准io流C中流的特性C文件io流以二进制形…

Jenkins全局安全配置

文章目录一、进入全局安全设置页面二、各选项功能Disable remember me(禁用记住我)Security Realm(安全域)Delegate to servlet container(servlet 容器代理)Jenkins’ own user database(Jenkins 专有用户数据库&…

Pr:导出页面之预览与摘要窗口

使用“预览”窗口,可在导出前预览媒体,设置自定义的持续时间,如果导出为不同的帧大小,还可以控制源视频适应输出帧的方式。使用“摘要”窗口,可以快速查看源及输出的音视频信息。◆ ◆ ◆预览窗口范围Range可自定义导…

居家办公如何避免数据泄露?

随着疫情管控政策的调整,越来越多的“小阳人”出现,企业不得不面对员工在家远程办公。 面对突如其来的远程办公,很多企业都没有做好准备,甚至采取微信、QQ、互联网邮箱、远程会议等方式传递秘密信息。但是,这样的居家…

ChatGpt详细注册流程

ChatGpt详细注册流程ChatGpt的网址:直接点击我 点击链接后向下滑动看到TRY CHATGPT如下图所示: 点击TRY CHATGPT后会跳转如下图界面: 点击Log in(登录)如下图: 因为首次登录你肯定是没有账号的所以需要先点击红框框出的Sign up…

QQ注册界面仿写(HTML+CSS+JS)

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:前端案例分…

整合当地商圈资源,异业联盟打出促消费花式组合拳

如今的市场竞争白热化,大商家逐渐形成垄断的格局。许多行业的第一品牌跟第二品牌主宰着市场,为了打破这种局面,小商家联合起来对抗大商家,所以异业联盟因此诞生。那么建立异业联盟对大家有什么好处呢? 异业联盟针对于商…

RK3568平台开发系列讲解(工具命令篇)Android Debug Bridge常用命令

🚀返回专栏总目录 文章目录 一、工作常用的adb命令二、ADB的原理沉淀、分享、成长,让自己和他人都能有所收获!😄 📢ADB-Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。安卓调试桥 (Android Debug Bridge, adb)…

uniapp 之 扫普通二维码进入小程序

前言 因项目的需求,需要我完成 在微信的扫一扫中,扫后端定义的二维码进入小程序中 这个需求说简单也很简单,说难也不难,就是花费了我几天的时间 需要在 开发 ---> 开发管理 下的开发设置 中的 一直往下滑 直到出现 扫普通…

11、Redis_事务_秒杀案例

文章目录11、Redis_事务_秒杀案例11.1 解决计数器和人员记录的事务操作11.2 Redis事务--秒杀并发模拟11.2.1 联网11.2.2 无网络11.2.3 测试及结果11.2.3.1 通过ab测试11.2.3.2 超卖11.3 超卖问题11.4 利用乐观锁淘汰用户,解决超卖问题。11.5 继续增加并发测试11.5.1…

发布一个简单的npm包简单流程(图文并茂,你必懂)

目录 前言: 1.发布前的代码基本配置 A.创建文件夹 B.npm init/npm init -y初始化项目 C.配置package.json文件 D.创建index.js文件 E.创建README.md文件 F.最基本的目录结构 2.账号注册 3.登录npm账号 A.使用cmd进行登录 B.使用nrm工具 C.成功登录 4.发…

1、浮动(float)

提示:我们一般网页上下用标准流,左右用浮动来写 1.1传统网页布局三种方式 网页布局本质——用css来摆放盒子,把盒子摆放到相应位置。css提供了三种传统布局简单方式,说就是盒子如何进行排列顺序: 普通流(或…

面试蚂蚁(P7)竟被MySQL难倒,奋发图强后二次面试入职蚂蚁金服

爱因斯坦说过“耐心和恒心总会得到报酬的”,我也一直把这句话当做自己的座右铭,这句箴言在今年也彻底在“我”身上实现了。 每一个程序员都拥有一座大厂梦,我也不例外,去年面试蚂蚁金服,竟然被MySQL问倒了&#xff0c…

【Flask框架】——16 Jinja2模板

文章目录Jinja2模板一、Jinja2模板介绍1.模板传参2.语法二、表达式三、控制语句1.条件判断语句2.for循环语句:四、过滤器1.什么是过滤器2.字符串的过滤器3.数值过滤器4.列表相关过滤器5.字典相关过滤器6.自定义过滤器五、测试器1.Jinja2中内置的测试器2.自定义测试器…

配置NTP时间同步之Linux

一:NTP是网络时间同步协议,就是用来同步网络中各个计算机的时间的协议。 二:NTP服务端配置 1.检查系统是否安装了NTP包(Linux一般自带NTP4.2),没有安装我们直接使用yum命令在线安装: yum inst…

Spring Boot整合Swagger3.0及Knife4j

一、什么是 Swagger Swagger是一组围绕 OpenAPI 规范构建的开源工具,可帮助您设计、构建、记录和使用 REST API。主要的 Swagger 工具包括: Swagger Editor – 基于浏览器的编辑器,您可以在其中编写 OpenAPI 规范。 Swagger UI – 将 OpenA…

非零基础自学Golang 第7章 函数 7.8 知识拓展

非零基础自学Golang 文章目录非零基础自学Golang第7章 函数7.8 知识拓展7.8.1 函数参数传递的本质7.8.2 Go内置函数第7章 函数 7.8 知识拓展 7.8.1 函数参数传递的本质 在讲述参数传递前,我们首先要了解两个基本概念:值传递和引用传递。 值传递&…

API接口DTO测试数据构造的一个方式

自动化测试中,经常需要构造请求参数,例如JSON格式的参数,简单的好说,可以手工修改或是用 Postman、Jmeter 等工具结合简单的代码进行处理, 但当数据传输对象(DTO)很复杂,部分字段依赖…