🚀 免费试用 Zilliz Cloud,完全托管的 Milvus,体验 10 倍的性能提升!立即试用>

milvus-logo
LFAI
  • Home
  • Blog
  • 利用 Milvus 2.0 Bootcamp 快速测试和部署向量搜索解决方案

利用 Milvus 2.0 Bootcamp 快速测试和部署向量搜索解决方案

  • Engineering
July 15, 2021
milvus

随着 Milvus 2.0 的发布,团队对 Milvus引导营进行了改造。经过改进的新版 Bootcamp 为各种用例和部署提供了更新的指南和更易于理解的代码示例。此外,新版本还针对Milvus 2.0 进行了更新,Milvus 2.0 是世界上最先进的向量数据库的重构版本。

根据 100 万和 1 亿数据集基准对系统进行压力测试

基准目录包含 100 万和 1 亿向量基准测试,可显示系统对不同大小数据集的反应。


解决方案目录包含最常用的向量相似性搜索用例。每个用例都包含一个笔记本解决方案和一个 docker 可部署解决方案。使用案例包括


在任何系统上快速部署完全构建的应用程序

快速部署解决方案是 docker 化的解决方案,允许用户在任何系统上部署完全构建的应用程序。这些解决方案是简短演示的理想选择,但与笔记本相比,需要额外的定制和理解工作。


使用特定场景笔记本轻松部署预配置应用程序

笔记本包含一个部署 Milvus 的简单示例,以解决给定用例中的问题。每个示例都可以从头到尾运行,无需管理文件或配置。每个笔记本还易于遵循和修改,使它们成为其他项目的理想基础文件。


图像相似性搜索笔记本示例

图像相似性搜索是许多不同技术(包括自动驾驶汽车识别物体)背后的核心理念之一。本示例介绍了如何使用 Milvus 轻松构建计算机视觉程序。

本笔记本围绕三个方面展开:

  • Milvus 服务器
  • Redis 服务器(用于元数据存储)
  • 预训练的 Resnet-18 模型。

第 1 步:下载所需软件包

首先下载本项目所需的所有软件包。本笔记本中的表格列出了要使用的软件包。

pip install -r requirements.txt

第 2 步:启动服务器

安装软件包后,启动服务器并确保两者运行正常。请务必按照正确的说明启动MilvusRedis服务器。

第 3 步:下载项目数据

默认情况下,本笔记本会提取 VOCImage 数据片段作为示例,但只要遵循笔记本顶部的文件结构,任何包含图像的目录都可以使用。

! gdown "https://drive.google.com/u/1/uc?id=1jdudBiUu41kL-U5lhH3ari_WBRXyedWo&export=download"
! tar -xf 'VOCdevkit.zip'
! rm 'VOCdevkit.zip'

第 4 步:连接服务器

在本例中,服务器运行在本地主机的默认端口上。

connections.connect(host="127.0.0.1", port=19537)
red = redis.Redis(host = '127.0.0.1', port=6379, db=0)

第 5 步:创建 Collections

启动服务器后,在 Milvus 中创建一个用于存储所有向量的 Collection。在本例中,维度大小设置为 512,即 resnet-18 输出的大小,相似度指标设置为欧氏距离 (L2)。Milvus 支持多种不同的相似度量

collection_name = "image_similarity_search"
dim = 512
default_fields = [
    schema.FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    schema.FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=dim)
]
default_schema = schema.CollectionSchema(fields=default_fields, description="Image test collection")
collection = Collection(name=collection_name, schema=default_schema)

第 6 步:为 Collections 建立索引

Collections 制作完成后,为其建立索引。本例中使用的是 IVF_SQ8 索引。该索引需要 "nlist "参数,该参数告诉 Milvus 在每个数据文件(段)中建立多少个聚类。不同的索引需要不同的参数。

default_index = {"index_type": "IVF_SQ8", "params": {"nlist": 2048}, "metric_type": "L2"}
collection.create_index(field_name="vector", index_params=default_index)
collection.load()

第 7 步:设置模型和数据加载器

建立 IVF_SQ8 索引后,设置神经网络和数据加载器。本例中使用的预训练 pytorch resnet-18 没有最后一层,该层会压缩向量进行分类,可能会丢失有价值的信息。

model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet18', pretrained=True)
encoder = torch.nn.Sequential(*(list(model.children())[:-1]))

需要对数据集和数据加载器进行修改,使其能够对图像进行预处理和批处理,同时提供图像的文件路径。这可以通过稍加修改的 torchvision 数据加载器来实现。在预处理方面,由于 resnet-18 模型是在特定尺寸和数值范围内训练的,因此需要对图像进行裁剪和归一化处理。

dataset = ImageFolderWithPaths(data_dir, transform=transforms.Compose([
                                                transforms.Resize(256),
                                                transforms.CenterCrop(224),
                                                transforms.ToTensor(),
                                                transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])]))

dataloader = torch.utils.data.DataLoader(dataset, num_workers=0, batch_si

步骤 8:将向量插入 Collections

收集设置完成后,就可以处理图像并将其加载到创建的 Collections 中。首先由数据加载器提取图像并通过 resnet-18 模型运行。然后将生成的向量 Embeddings 插入 Milvus,Milvus 会为每个向量返回一个唯一的 ID。然后将向量 ID 和图像文件路径作为键值对插入 Redis 服务器。

steps = len(dataloader)
step = 0
for inputs, labels, paths in dataloader:
    with torch.no_grad():
        output = encoder(inputs).squeeze()
        output = output.numpy()

    mr = collection.insert([output.tolist()])
    ids = mr.primary_keys
    for x in range(len(ids)):
        red.set(str(ids[x]), paths[x])
    if step%5 == 0:
        print("Insert Step: " + str(step) + "/" + str(steps))
    step += 1

将所有数据插入 Milvus 和 Redis 后,就可以执行实际的向量相似性搜索了。在本例中,从 Redis 服务器中随机抽取三张图片进行向量相似性搜索。

random_ids = [int(red.randomkey()) for x in range(3)]
search_images = [x.decode("utf-8") for x in red.mget(random_ids)]

这些图像首先经过与步骤 7 中发现的相同的预处理,然后通过 resnet-18 模型推送。

transform_ops = transforms.Compose([
                transforms.Resize(256),
                transforms.CenterCrop(224),
                transforms.ToTensor(),
                transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])

embeddings = [transform_ops(Image.open(x)) for x in search_images]
embeddings = torch.stack(embeddings, dim=0)

with torch.no_grad():
    embeddings = encoder(embeddings).squeeze().numpy()

然后利用得到的向量 Embeddings 进行搜索。首先,设置搜索参数,包括要搜索的 Collections 名称、nprobe(要搜索的集群数量)和 top_k(返回向量的数量)。在本例中,搜索速度应该很快。

search_params = {"metric_type": "L2", "params": {"nprobe": 32}}
start = time.time()
results = collection.search(embeddings, "vector", param=search_params, limit=3, expr=None)
end = time.time() - start

步骤 10:图像搜索结果

查询返回的向量 ID 用于查找相应的图像。然后使用 Matplotlib 显示图像搜索结果。

pic1.png pic1.png pic2.pngpic2.png pic3.pngpic3.png


了解如何在不同环境中部署 Milvus

新启动训练营的部署部分包含在不同环境和设置中使用 Milvus 的所有信息。它包括部署 Milvus、将 Kubernetes 与 Milvus 结合使用、负载平衡等。每个环境都有详细的步骤指南,解释如何让 Milvus 在其中工作。


不要成为陌生人

  • 阅读我们的博客
  • Slack 上与我们的开源社区互动。
  • Github 上使用或贡献世界上最流行的向量数据库 Milvus。

    Try Managed Milvus for Free

    Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

    Get Started

    Like the article? Spread the word

    扩展阅读