Milvus实践 第二章:基本概念使用与优化

时间:2025-03-03 15:45:50

基本概念与使用

本文基于Python sdk使用

连接服务器

milvus = Milvus(host='localhost', port='19530')

集合

存储向量与索引的基本单元,类似于关系型数据库的表的概念,创建集合需设置集合名称collection_name,维度dimension,索引数据文件大小index_file_size,距离度量方式metric_type。

创建集合:

param = {'collection_name':'test01', 'dimension':256, 'index_file_size':1024, 'metric_type':MetricType.L2}

milvus.create_collection(param)

删除集合:

milvus.drop_collection(collection_name='test01')

分区

通过标签将集合分割为若干个分区,从而提高搜索效率。每个分区实际上也是一个集合。

创建分区:

milvus.create_partition('test01', 'tag01')

删除分区:

milvus.drop_partition(collection_name='test01', partition_tag='tag01')

向量

每个集合中存储的主要数据,单次插入最大256MB向量数据。

插入向量:

vectors = [[() for _ in range(256)] for _ in range(20)]

(collection_name='test01', records=vectors)

自定义ID向量:

(collection_name='test01', records=vectors)

(collection_name='test01', records=vectors, ids=vector_ids)

分区中插入向量:

('test01', vectors, partition_tag="tag01")

通过ID删除向量:

ids = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

milvus.delete_entity_by_id(collection_name='test01', id_array=ids)

索引

一个集合只支持一种索引类型,切换索引类型会自动删除旧的索引文件。在创建其它索引前,FLAT 作为集合的默认索引类型。

create_index() 会指定该集合的索引类型,并同步为之前插入的数据建立索引,后续插入的数据在大小达到 index_file_size 时,索引会在后台自动建立。在实际生产环境中,如果是流式数据,建议在插入向量之前先创建索引,以便后续系统自动建立;如果是静态数据,建议导入所有数据后再一次性创建索引。

索引文件往往比原始向量更大。

为指定集合创建索引:

ivf_param = {'nlist': 16384}

milvus.create_index('test01', IndexType.IVF_FLAT, ivf_param)

删除索引:

milvus.drop_index('test01')

查询向量

搜索参数:对于不同的索引类型,搜索所需参数也有区别。所有的搜索参数都必须赋值。

搜索:

search_param = {'nprobe': 16}

q_records = [[() for _ in range(256)] for _ in range(5)]

(collection_name='test01', query_records=q_records, top_k=2, params=search_param)

在分区中搜索:

(collection_name='test01', query_records=q_records, top_k=1, partition_tags=['tag01'], params=search_param)

数据落盘

在进行有关数据更改的操作时,你可以将集合中的数据从内存中进行 flush 操作使数据落盘。Milvus 也会执行自动落盘。自动落盘会在固定的时间周期(1 秒)对所有现存集合的数据进行落盘操作。

(collection_name_array=['test01'])

在调用 delete 接口后,用户可以选择再调用 flush,保证新增的数据可见,被删除的数据不会再被搜到。

数据段整理

数据段是 Milvus 自动将插入的向量数据合并所获得的数据文件。一个集合可包含多个数据段。如果一个数据段中的向量数据被删除,其所占据的空间并不会自动释放。你可以对集合中的数据段进行 compact 操作以释放多余空间。

(collection_name='test01', timeout=1)

关闭客户端

()

距离度量方式

欧氏距离(L2)、内积 (IP)、杰卡德距离、谷本距离、超结构、子结构。

优化

配置优化:

cache:

cache_size,内存中的缓冲区大小

insert_buffer_size,数据导入时的缓冲区大小

gpu:

cache_size,显存中的缓冲区大小,当前阶段建议4G起步,否则将面临显存-内存数据切换问题

gpu_search_threshold,gpu检索的阈值,np最小值

Wal:

buffer_size,预写式日志缓冲区大小,0-4096mb,当前参考512mb 

SDK使用:

建立索引时:nlist,索引分桶数量,一般情况下nlist越大,检索性能越好,也可在按照4 * sqrt(n)方式设置再做优化。

检索:nprobe,检索时需要检索到的桶数,值越大检索性能越低,但精准度下降。科通通过实验设置合理的值。

索引类型选择:

Milvus支持八种索引类型,当前可参考FLATIVF_FLAT、IVF_SQ8H三种。

FLAT N/A
      • 查询数据规模小,对查询速度要求不高。
      • 需要 100% 的召回率。
      • rt 6ms
IVF_FLAT 基于量化的索引
      • 高速查询,
      • 要求尽可能高的召回率。
      • rt 5ms
IVF_SQ8H 基于量化的索引
      • 高速查询,
      • 磁盘、内存、显存有限。
      • rt 3ms

分布式集群

略显复杂,暂无可额外总结的知识点,参考官方文档

Mishards:集群分片中间件 - Milvus documentation