【Milvus的安装和使用】

2023-11-16

0. 介绍

milvus是一个用于存储、index索引和管理巨量由深度学习网络或者其他模型生成embedding vectors的工具。不同于常见的关系型数据库用来处理结构化数据,Milvus被设计用来处理由非结构化数据,如图像、音频等,生成的embedding vectors信息。embedding vector本质指的是float类型的数组,常通过深度学习网络提取非结构化数据的特征得到。其中Milvus最主要的功能是vector similarity search,即向量相似性搜索,常见的评价指标有欧式距离等,平台采用ANN搜索算法来加速搜索过程。

使用Miluvs的常见场景如下:

  • 以图搜图
  • 人脸检索
  • 视频去重

即大部分非结构化数据的一对多搜索,都可以使用Milvus来完成。

1. Milvus安装

Milvus的官方文档中提供了详细的安装过程,具体可以参考官方文档链接。这里主要简述一下安装流程,主要参考如下页面内容。

 Milvus使用Docker Compose工具来启动和停止服务,过程如下:

  • 新建一个工作目录,下载YAML文件
wget https://github.com/milvus-io/milvus/releases/download/v2.1.4/milvus-standalone-docker-compose.yml -O docker-compose.yml
  • 启动Milvus容器
sudo docker-compose up -d

这个命令开始执行之后会自动下载Milvus对应的镜像文件,需要等待一段时间。 当镜像下载完成后,相应的容器也会启动,可以通过如下命令查看

sudo docker-compose ps

 可以看到除了milvus standalone服务之外还有两个依赖容器。

  • 停止Milvus容器
sudo docker-compose down

2. Milvus的工作流程

下面将以常见的以图搜图例子介绍Milvus的具体工作流程, 如下图(图像来自Milvus官方的examples)所示:

 整个流程分为两个阶段:

  • 构建图像向量库

 首先需要准备一个图像数据集(库),这个就是我们待检索数据库内容,将非结构化图像数据,通过深度学习算法,常见的就是图像分类算法,Resnet之类的,在图中官方使用towhee深度学习库来提取图像特征,然后会得到每张图像的特征向量,这个特征向量的维度是固定的,可能是1000、2048维之类的,最后将这个特征向量存储到Milvus数据库中。

  • 在以构建的向量库中执行搜索

当将所有的图像数据的特征向量都插入到Milvus中之后,此时就可以进行图像检索。检索具体就是输入一张待检索的图像,经过towhee得到图像对应的特征向量,然后将这个目标特征向量与Milvus中所有图像的特征向量进行相似度对比,然后TopK个距离最近的图像结果。

3. Milvus的初步使用

milvus支持不同变成语言接口来访问、操作数据库,具体支持如下图所示:

 3.1 安装PyMilvus库

在本文中,主要讲解如何使用PyMilvus来操作Milvus,首先需要安装该库,命令如下:

pip3 install protobuf==3.20.0
pip3 install grpcio-tools
pip install pymilvus

可以通过下面的命令判断是否安装成功

python3 -c "from pymilvus import Collection"

3.2 下载hello_milvus文件

下面将以官方文档的python例子进行讲解如何使用Milvus,详情可以参考链接

  • 在上述YAML文件的同级目录下,使用docker-compose ps -a命令,确保milvus容器处在开启状态
  • 下载hello_milvus.py文件
wget https://raw.githubusercontent.com/milvus-io/pymilvus/v2.1.3/examples/hello_milvus.py

3.3 解析hello_milvus文件内容

导入相关python库

from pymilvus import (
    connections,
    utility,
    FieldSchema,
    CollectionSchema,
    DataType,
    Collection,
)

连接Milvus服务

connections.connect("default", host="localhost", port="19530")

创建collection

Milvus的collection类似MySQL中的tabel,因此以MySQL中的表来类比Milvus的Collectio含义。

fields = [
    FieldSchema(name="pk", dtype=DataType.INT64, is_primary=True, auto_id=False),
    FieldSchema(name="random", dtype=DataType.DOUBLE),
    FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=8)
]
schema = CollectionSchema(fields, "hello_milvus is the simplest demo to introduce the APIs")
hello_milvus = Collection("hello_milvus", schema)

上面代码是创建一个collection的过程,其中包含3个属性:pk、random和embedding,下图为MySQL的表与Milvus的collection的对比。 

 其中fields指的是包含哪些属性,属性需要指定数据类型,是否为主键之类的,不同之处在于embedding属性,该属性数据结构是数组,数组元素个数为8,在Milvus中用来保存vector embedding内容。

构建数据并插入到collection中

import random
entities = [
    [i for i in range(3000)],  # field pk
    [float(random.randrange(-20, -10)) for _ in range(3000)],  # field random
    [[random.random() for _ in range(8)] for _ in range(3000)],  # field embeddings
]
insert_result = hello_milvus.insert(entities)

为实例创建索引

index = {
    "index_type": "IVF_FLAT",
    "metric_type": "L2",
    "params": {"nlist": 128},
}
hello_milvus.create_index("embeddings", index)
  • 向量之间相似度的评价公式

 索引的类型

 使用多少维数据来描述索引

将collection中的数据加载到内存中执行向量相似度检索

hello_milvus.load()
vectors_to_search = entities[-1][-2:]
search_params = {
    "metric_type": "L2",
    "params": {"nprobe": 10},
}
result = hello_milvus.search(vectors_to_search, "embeddings", search_params, limit=3, output_fields=["random"])

 普通搜索

result = hello_milvus.query(expr="random > -14", output_fields=["random", "embeddings"])

复合搜索 

result = hello_milvus.search(vectors_to_search, "embeddings", search_params, limit=3, expr="random > -12", output_fields=["random"])

 删除collection

utility.drop_collection("hello_milvus")

4. 总结

这篇文章主要介绍了Milvus是什么,有什么用,以及使用Milvus来进行非结构化数据检索的工作流程等等,后续将介绍如何运行Milvus提供的以图搜图例子。 

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

【Milvus的安装和使用】 的相关文章

  • 2023数学建模思路 - 案例

    更多数学建模案例 https mianbaoduo com o bread YpyXmZhs 一 背景 二 高斯分布的指数族形式 三 对数配分函数与充分统计量的关系 三 极大似然估计与充分统计量 lt
  • ppt转换成pdf免费软件

    为什么80 的码农都做不了架构师 gt gt gt ppt转换成pdf免费软件 导读 使用 ppt转换成pdf转换器当然是转换ppt文件的一个方法 但毕竟好的转换工具并不多 对于从事大量文案处理的工作人员来讲 没有一款专业好用的ppt转换成
  • Linux下使用鼠标滚轮

    Linux下使用鼠标滚轮 让acrobat pdfreader支持滚轮鼠标 这些天用acroread看pdf文件 发现不支持鼠标滚轮 很不爽 最终在水母上搜到了解决方法 将如下内容加到 Xresources文件中 AcroRead XmSc
  • 方差、标准差、协方差、协方差矩阵、散度矩阵

    方差 统计中的方差 样本方差 是每个样本值与全体样本值的平均数之差的平方值的平均数 概率论中方差用来度量随机变量和其数学期望 即均值 之间的偏离程度 1 统计 方差用来计算每一个变量 观察值 与总体均数之间的差异 为避免出现离均差总和为零

随机推荐

  • 小程序实现滚动加载(懒加载)

    前言 小程序是一项很受欢迎的技术 随着其能力的不断增强 越来越多的人开始使用小程序来完成各种任务 当我面面临一个页面有非常多的数据时 该如何处理呢 显然一次性全部加载完 会非常消耗性能的 为了解决这些问题从而出现了一种叫滚动加载的数据处理方
  • 数字时钟仿真电路设计

    课题设计要求 时间以24小时为一个周期 显示时 分 秒 具有校时功能 可以分别对时分秒进行单独校时 使其校正到标准时间 计时过程具有报时功能 当时间到达整点前十秒进行蜂鸣报时 为了保证计时的稳定及准确 须由晶体振荡器提供表针时间基准信号 准
  • 微信公众号开发config:fail,Error: invalid url domain总结自己遇到的几种原因

    1 JS接口安全域名配置错误 不要http 2 设置安全域名时 txt文件未在域名根目录下 3 appid错误 用了其他公众号的 4 ios手机 获取的当前url与实际不一致 详情见下一篇文章
  • Gradle版本7+ AAR包的引入应用

    ARR包的使用 作为一个安卓的初学者 因为某些个客户需要我们提供安卓SDK 我们压根没有移动端业务 为了赚钱 硬着头皮从0开始写一个SDK 终于我这个 百度战士 也靠百度打出了aar包 问题来了 当你搜索安卓如何引用aar 包的时候 是不是
  • Unity物体拖拽系统(一)

    在游戏制作的过程中 我们经常会遇到拖拽物体到某个位置并做其他操作的需求 比如我们会把装备拖动到装备栏来使用这个装备 为了方便的解决这个问题 我制作了一套耦合性比较低的拖拽系统 这套拖拽会适配我们之前制作的按键系统 很简单的就可以添加上手柄的
  • 哈希表查找失败的平均查找长度_哈希算法高大上?也不过如此

    01 知识框架 02 知识点详解 1 散列表的相关概念 什么是散列表和散列函数 是根据关键码值 Key value 而直接进行访问的数据结构 也就是说 它通过把关键码值映射到表中一个位置来访问记录 以加快查找的速度 这个映射函数叫做 散列函
  • VTK(0)---CMake工程

    VTK 0 CMake工程 目录 前言 一 指定cmake版本 二 设置工程 三 针对Qt 自动使用moc uic rcc程序预处理 h文件 ui文件等 四 平台移植问题 五 设置编译模式 六 找到包 七 包含头文件等 八 链接库文件 九
  • 自定义进度条,支持显示浮点数

    思路 QT原生的进度条默认只支持显示整型值 这里重新封装了进度条 支持显示浮点数 内部同时设置了进度条样式 支持显示提示信息 GitHub下载链接 https github com caochuanlin progressbar 头文件 c
  • 01.项目目录搭建以及styled-Components和Reser.css的结合使用

    首先 我们使用脚手架创建了一个新的项目 这里我们对项目的一些基本文件进行整理 首先将一些不需要的文件删除 删除之后留下一些需要的文件 如下 这里我们将原来的style css已经重命名为style js文件 下面安装styled Compo
  • NPM Magic

    NPM Magic package json package json 最起码要包含 name 和 version 快速初始化 package json npm init yes dependencies 生产环境依赖的包 devDepen
  • 安规电容,X电容,Y电容

    什么是安规电容 首先要说一下 安规 是安全规范的简称 安全规范对产品的装置与电子组件有明确的陈述及指导 以避免由于设计不良或使用不当而导致电击 能量 打火 拉弧 爆炸 火灾 辐射 机械与热 高温危险 化学危险等事故和灾害 要求生产厂商尽可能
  • Vue3训练营笔记

    vue3脚手架的详细使用说明 文档下载 https download csdn net download qq 42740465 87939368 spm 1001 2014 3001 5503
  • ROS学习(1)—Ubuntu20.04系统安装noetic学习日志

    1 前言 ROS知识自学 现有博文比较多 而且参差不齐 为了梳理自己的学习思路 形成自身的知识体系 撰写自己的学习日志文档 参考文章及链接均在文章末尾显示 2 主要安装步骤 2 1 更换源文件 添加软件源文件则是将国外服务器的下载地址更改为
  • 标识符和关键字的规则

    大家好 我是耀曜 这段事件没有怎么更新文章 主要是最近换工作 有一年的工作经验 说白了就是一个初级Java后端开发的新手 这段时间面了很多家 我也很纳闷问的都是基础差不多都忘掉了的 以后这段事间耀曜会发布一些关于面试的问题的总结 希望对看到
  • Android 数据的保存,检索,删除之Cursor

    今天遇到的一个问题是如何将数据删除后 将原来的id也相应的做改变呢 如果说对其id值进行逐个修改这也是可以的 但是当数据增多的时候 我们这么做就会很大程度上的降低程序的性能 所以我们想到的就是不要根据id的检索来获取数据库中的值 因为这样做
  • face-api.js中加入MTCNN:进一步支持使用JS实时进行人脸跟踪和识别

    如果你现在正在阅读这篇文章 那么你可能已经阅读了我的介绍文章 JS使用者福音 在浏览器中运行人脸识别 或者之前使用过face api js 如果你还没有听说过face api js 我建议你先阅读介绍文章再回来阅读本文 和往常一样 本文中为
  • C++实现顺序表与链表

    C 实现顺序表与链表 一 顺序表 之前已经对顺序表有了了解 需要注意的是读者如果疑惑以下代码没有实现头插与头删 是因为代码中任意插入与删除这两个函数可以实现此功能 下面有测试代码 读者也可以自行测试 代码如下 include
  • 手把手教你安装MINIGUI编程环境 (MINIGUI版本3.2.0)

    0 MINIGUI MiniGUI 是一款面向嵌入式系统的高级窗口系统 Windowing System 和图形用户界面 Graphical User Interface GUI 支持系统 由魏永明先生于 1998 年底开始开发 2002
  • Pycharm如何选择自动打开或不打开最近项目

    如下图
  • 【Milvus的安装和使用】

    0 介绍 milvus是一个用于存储 index索引和管理巨量由深度学习网络或者其他模型生成embedding vectors的工具 不同于常见的关系型数据库用来处理结构化数据 Milvus被设计用来处理由非结构化数据 如图像 音频等 生成