跳到主要内容

磁盘索引

本文介绍了 DiskANN,一种用于磁盘优化向量搜索的磁盘索引算法。基于 Vamana 图,DiskANN 在大型数据集内提供高效的磁盘向量搜索。

为了提高查询性能,您可以为每个向量字段指定索引类型

目前,一个向量字段只支持一种索引类型。当切换索引类型时,Milvus 会自动删除旧的索引。

先决条件

要在 Milvus 中使用 DiskANN,请注意

  • Milvus 实例运行在 Ubuntu 18.04.6 或更高版本上。
  • Milvus 数据路径应挂载到 NVMe SSD 以获得完整性能:
    • 对于 Milvus Standalone 实例,数据路径应为实例运行容器中的 /var/lib/milvus/data
    • 对于 Milvus Cluster 实例,数据路径应为 QueryNode 和 IndexNode 运行容器中的 /var/lib/milvus/data

限制

要使用 DiskANN,请确保您

  • 在数据中仅使用至少 1 维的浮点向量。
  • 仅使用欧几里得距离(L2)、内积(IP)或余弦(COSINE)来测量向量之间的距离。

索引和搜索设置

  • 索引构建参数

    构建 DiskANN 索引时,使用 DISKANN 作为索引类型。不需要索引参数。

  • 搜索参数

    参数描述范围默认值
    search_list候选列表的大小,较大的大小提供更高的召回率但性能下降。[topk, int32_max]16

DiskANN 相关的 Milvus 配置

DiskANN 是可调节的。您可以在 ${MILVUS_ROOT_PATH}/configs/milvus.yaml 中修改 DiskANN 相关参数来提高其性能。

...
DiskIndex:
MaxDegree: 56
SearchListSize: 100
PQCodeBugetGBRatio: 0.125
SearchCacheBudgetGBRatio: 0.125
BeamWidthRatio: 4.0
...
参数描述值范围默认值
MaxDegreeVamana 图的最大度数。
较大的值提供更高的召回率,但会增加索引的大小和构建时间。
[1, 512]56
SearchListSize候选列表的大小。
较大的值增加构建索引的时间,但提供更高的召回率。
将其设置为小于 MaxDegree 的值,除非您需要减少索引构建时间。
[1, int32_max]100
PQCodeBugetGBRatioPQ 代码的大小限制。
较大的值提供更高的召回率,但增加内存使用量。
(0.0, 0.25]0.125
SearchCacheBudgetGBRatio缓存节点数与原始数据的比率。
较大的值通过增加内存使用量来提高索引构建性能。
[0.0, 0.3)0.10
BeamWidthRatio每次搜索迭代的最大 IO 请求数与 CPU 数量之间的比率。[1, max(128 / CPU 数量, 16)]4.0

故障排除

  • 如何处理 io_setup() failed; returned -11, errno=11:Resource temporarily unavailable 错误?

    Linux 内核提供了异步非阻塞 I/O(AIO)功能,允许进程同时启动多个 I/O 操作,而无需等待其中任何一个完成。这有助于提高可以重叠处理和 I/O 的应用程序的性能。

    可以使用 proc 文件系统中的 /proc/sys/fs/aio-max-nr 虚拟文件来调节性能。aio-max-nr 参数确定允许的最大并发请求数。

    aio-max-nr 默认为 65535,您可以将其设置为 10485760