利用 Milvus 2.0 Bootcamp 快速测试和部署向量搜索解决方案
随着 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 步:启动服务器
安装软件包后,启动服务器并确保两者运行正常。请务必按照正确的说明启动Milvus和Redis服务器。
第 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
步骤 9:进行向量相似性搜索
将所有数据插入 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
pic2.png
pic3.png
了解如何在不同环境中部署 Milvus
新启动训练营的部署部分包含在不同环境和设置中使用 Milvus 的所有信息。它包括部署 Milvus、将 Kubernetes 与 Milvus 结合使用、负载平衡等。每个环境都有详细的步骤指南,解释如何让 Milvus 在其中工作。
不要成为陌生人
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word