• 【Milvus的安装和使用】


    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,首先需要安装该库,命令如下:

    1. pip3 install protobuf==3.20.0
    2. pip3 install grpcio-tools
    3. 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库

    1. from pymilvus import (
    2. connections,
    3. utility,
    4. FieldSchema,
    5. CollectionSchema,
    6. DataType,
    7. Collection,
    8. )

    连接Milvus服务

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

    创建collection

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

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

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

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

    构建数据并插入到collection中

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

    为实例创建索引

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

     索引的类型

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

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

    1. hello_milvus.load()
    2. vectors_to_search = entities[-1][-2:]
    3. search_params = {
    4. "metric_type": "L2",
    5. "params": {"nprobe": 10},
    6. }
    7. 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提供的以图搜图例子。 

  • 相关阅读:
    MySQL高级查询操作
    Git - 入门到熟悉_远程仓库管理
    论文笔记:YOLOv8-QSD 自动驾驶场景小目标检测算法
    常见的Web安全漏洞(2021年9月的OWASP TOP 10)
    C++ fstream类移动读写指针和字节数形式获取该指针位置(seekp、seekg、tellg、tellp)
    词云简单生成
    《前端》html总结
    iOS开发-4位或者6位验证码按顺序输入实现
    1373. 二叉搜索子树的最大键值和
    STM32CubeMX SDRAM的使用(一)
  • 原文地址:https://blog.csdn.net/hello_dear_you/article/details/127841589