Milvus 3.0接入SVS LeanVec 性能优于HNSW高召回低延迟

Milvus 3.0正式接入英特尔SVS Vamana内存图索引,该索引原生支持LeanVec向量降维与量化,其召回-性能曲线全面优于HNSW SQ8、HNSW FP16,在相同召回率下吞吐量更高、延迟更低,适合正使用HNSW并计划切换的团队,兼顾高召回与低内存成本。
HNSW架构的性能与成本矛盾
RAG、图像检索、推荐等业务对延迟上限及Top K召回率要求严苛,HNSW因此成为行业主流选择。但该架构需将向量本体与图邻接信息全部驻留内存,数据扩容或副本增加时,资源开销呈线性上涨。实际部署中,平衡精度与内存的方式主要有两种:一种是SQ8标量量化,每维压缩至8bit,向量存储体积降至原始float32的1/4,多数场景下可稳定实现约95%召回;另一种是FP16量化,每维16bit,量化误差更小,易实现高召回,但存储开销为SQ8的两倍。
若要基于SQ8实现更高召回,需扩大检索遍历范围,扫描更多邻接节点找回漏检向量,这会带来大量额外距离计算与内存随机访问,导致高召回率下吞吐量明显下降、尾延迟上升。数据显示,召回率从95%提升至99%,看似仅增加4个百分点,系统需付出的成本却远不止于此。
LeanVec的双重优化逻辑
SVS LeanVec通过量化与降维结合,减少搜索过程中反复读取计算的向量数据,同时通过重排序补回压缩损失的精度,解决了上述矛盾。其核心基于与DiskANN同源的Vamana近邻图结构,该图经剪枝后,搜索可通过几次长距离跳跃快速接近目标向量。
每个向量被分为两种表示用于不同阶段:用于搜索的主向量先经线性投影降维(可配置为1/2、1/4、1/6等比例),再进行LVQ量化,图的构建与遍历均基于该低维表示,大幅减少距离计算量;用于重排序的辅助向量则在量化后保留完整维度,检索环节拿到候选集后,系统用其对结果重新计算距离,降低降维对最终精度的影响。
以1536维的向量数据集为例,主向量降至256维、4bit量化,图遍历全程在该小空间执行,仅最后少量候选调用1536维、8bit的辅助向量重排。相比之下,HNSW SQ8虽压缩了维度,但每次节点访问仍需读取完整维度向量,LeanVec进一步减少了遍历阶段的数据量,在高维数据上的收益尤为显著。
实测性能优势显著
测试选取四组数据集,对比SVS LeanVec(采用LeanVec4x8配置,主向量4bit、辅助向量8bit,测试开启/关闭OOD模式、多组检索窗口)与Milvus中基于Faiss的HNSW_SQ索引(含FP16与SQ8两种存储模式),固定并发为100个客户端线程,采集索引加载耗时、QPS、P99延迟等指标。
在95%召回率下,SVS LeanVec在各数据集上均优于HNSW FP16,吞吐量达到HNSW SQ8的1.40~1.84倍,P99延迟降低24%~38%;在更高维度、更大规模的数据集(如Bioasq 1024D、OpenAI 5M)上,收益更为突出。
当召回率提升至99%时,HNSW SQ8需大幅增加搜索开销,性能差距进一步拉大:在Cohere 100万数据集中,HNSW SQ8的吞吐量仅为95%时的约1/5,P99延迟超过原来的4倍;而SVS LeanVec仍保持7252 QPS,约为HNSW SQ8的4.6倍。FP16的高召回表现虽优于SQ8,但多数测试结果仍落后于SVS LeanVec,仅OpenAI 500万数据集例外;Bioasq数据集无索引能达到99%召回,SVS LeanVec在可及范围内仍保持吞吐量领先。
需注意,SVS LeanVec的性能优势是Vamana图结构、LeanVec两级压缩、后置重排及底层实现共同作用的结果,并非单一优化点带来的收益。
内存成本与构建效率
除性能外,内存开销是向量检索的核心成本项。单向量内存占用方面,HNSW FP16约为2·d字节,HNSW SQ8约为d字节,LeanVec4x8约为d/4 + d字节,可见SVS LeanVec的内存占用远低于FP16,与SQ8接近。
实测稳态内存显示,SVS LeanVec加载峰值内存始终低于HNSW FP16,稳态内存为FP16的57%~68%,同时在各召回率下的吞吐量持平或优于FP16,仅比HNSW SQ8低10%~20%。若以“每GiB索引内存可承载的QPS”衡量资源性价比,99%召回率下,SVS LeanVec是HNSW FP16的1.5~2.3倍;OpenAI 500万数据集上,SVS仅需9.0 GiB索引内存,而FP16需15.6 GiB。
建索引耗时方面,使用ID模式(共享投影)时,SVS LeanVec在四组数据上的构建与加载总时间比HNSW FP16缩短22%~39%;启用OOD模式(分别学习投影)时,Cohere与两组OpenAI数据耗时接近FP16,仅Bioasq耗时从791秒增至1532秒。因此,若召回率目标在95%左右且重视构建速度,可选择ID模式;更在意高召回率下的吞吐量,则需权衡OOD模式的收益与额外耗时。
在Milvus中的使用方法
要使用SVS Vamana,需Milvus、PyMilvus 3.0.0或更高版本,并在源码构建时启用SVS支持,编译命令如下:
make USE_SVS=ON
配置索引时,通过Milvus的FAISS接口设置,示例如下:
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
collection_name = "your_collection_name"
index_params = client.prepare_index_params()
index_params.add_index(
field_name="your_vector_field_name",
index_type="FAISS",
index_name="vector_index",
metric_type="COSINE",
params={
"faiss_index_name": "SVSVamana64,LeanVec4x8_256",
"construction_window_size": 200,
"ood_training": True,
},
)
client.create_index(
collection_name=collection_name,
index_params=index_params,
)
client.load_collection(collection_name=collection_name)
其中,“256”代表降维后的维度,省略该后缀时默认降至原始维度的一半;将ood_training设为False即可使用构建更快的ID模式。
搜索阶段的参数设置示例:
search_params = {
"params": {
"search_window_size": 100,
"search_buffer_capacity": 100,
}
}
初次测试可从LeanVec4x8开始,高召回率下查询开销大时可尝试提高主向量维度,希望减少内存则可降低维度或改用LeanVec4x4。需注意:LeanVec压缩依赖Intel CPU,AVX-512环境下收益最优;非Intel平台仍可运行SVS Vamana,但建议选用FP32、FP16或普通SQ8存储方式。

