Hotdry.
ai-systems

Milvus DiskANN 索引:亿级混合多向量过滤与动态分片低延迟查询

Milvus 基于 DiskANN 实现亿级 ANN 搜索,支持 hybrid 多向量过滤、动态分片,提供低延迟查询参数与工程化监控要点。

在亿级向量规模下,传统内存索引如 HNSW 面临内存爆炸问题,而 Milvus 的 DiskANN 索引通过磁盘驻留 Vamana 图结构,仅需原始数据 1/4 内存,即可实现高召回 ANN 搜索,QPS 达数千,延迟控制在 10ms 级。这得益于其 PQ 码表内存缓存 + 磁盘邻接表设计,适用于资源受限的云原生生产环境。

DiskANN 核心是基于 Vamana 图的近似最近邻算法:构建时采样生成 PQ Pivots,对原始 float 向量(推荐 dim 16-1024)进行压缩,内存中建图后持久化磁盘(占用原始数据 1.5-2 倍)。搜索阶段,从 entry point BFS 扩展 search_list(默认 100),beamwidth 控制并发 I/O,每步 PQ 近似距离排序,取 topK。Milvus 集成时,IndexNode 从 MinIO 拉取 segment 数据(默认 2GB)本地建索引,QueryNode 加载 PQ + cache(1/8 数据)执行查询。

关键参数落地:索引构建无需额外 params,直接指定 index_type="DISKANN",metric 支持 L2/IP/COSINE。配置文件 milvus.yamldiskIndex 节点调优:

  • maxDegree: 56(节点出度,[1,512],增大召回但索引大)
  • searchListSize: 100(候选集,增大精度但慢)
  • pqCodeBudgetGBRatio: 0.125(PQ 内存占比,(0,0.25])
  • searchCacheBudgetGBRatio: 0.125(缓存占比,[0,0.3))
  • beamWidthRatio: 4.0(I/O 并行,[1,128/CPU 核心])

前提:NVMe SSD 挂载 /var/lib/milvus/data,Ubuntu 18+,queryNode.enableDisk: true。Build 需 segment 原始数据 1.7x 内存,避免分块合并损失性能。

Hybrid 多向量过滤是 DiskANN 生产杀手锏:结合 ANN + 标量 filter(如 status=="active" and price < 100),expr 语法支持 JSON / 数组。Multi-vector 示例:Collection 定义多 float_vector 字段(如 text_emb、img_emb,dim=768),搜索时 multi_vector_search([text_q, img_q], ["text_emb", "img_emb"], weights=[0.7,0.3]),自动融合分数。过滤加速:用 partition_key(如时间 / 用户)隔离,load([partition]),仅载相关 segment,内存节省 50% 以上。动态分片:Kubernetes 部署,DataCoord 按负载 auto-shard,scale QueryNode 至 10+ pod,低延迟 serving(P99<50ms)。

低延迟工程参数清单:

  1. Segment 调大dataCoord.segment.diskSegmentMaxSize: 4GB,图算法随规模 latency 稳定。
  2. 搜索 paramssearch_list=16+topknprobe=10(若 IVF 预备),batch_size=100。
  3. Warmup/Cache:QueryNode 启动 preload,Prometheus 监控 query_latency_p99io_wait_time
  4. GPU 加速:若需,配 GPU_CAGRA 备选,但 DiskANN CPU 优化已足(SIMD/AVX512)。
  5. 一致性consistency_level="Bounded",平衡强一致与性能。
  6. 回滚策略:索引失败 fallback FLAT,监控 index_build_fail_rate >0.1 告警。

监控要点:

  • Metrics:milvus_query_throughputdisk_io_utilization(<80%)、cache_hit_rate >90%
  • Tools:Prometheus + Grafana dashboard,Kubernetes HPA 基于 CPU 80%/QPS auto-scale。
  • 风险:高维 (>1024) I/O 增,filter 复杂降速 → 预分区 + 索引 scalar 字段。

实际部署:Helm chart milvus-operator,资源 req: CPU 4c/16GiB per QueryNode(10 亿向量)。测试:pymilvus insert 1e9 vectors,hybrid query QPS 2k,recall@10=0.95。相比 HNSW,内存降 75%,成本优化显著。

资料来源:Milvus 官方文档(milvus.io/docs/disk_index.md),DiskANN 在 Milvus 中的集成详解,以及 GitHub 仓库(github.com/milvus-io/milvus)。[1]

查看归档