Faiss 1.15.0 RaBitQ 快扫检索 QPS 提升 80%:1 比特量化向量检索走到哪了
2026/9/1 10:46:57 网站建设 项目流程

Faiss 1.15.0 RaBitQ 快扫检索 QPS 提升 80%:1 比特量化向量检索走到哪了

【免费下载链接】faissA library for efficient similarity search and clustering of dense vectors.项目地址: https://gitcode.com/GitHub_Trending/fa/faiss

向量数到 1 亿、维度 768 时,一份裸 float32 索引要吃掉 300 多 GB 内存,多数团队到这里只能接受召回与 QPS 的折中。Faiss RaBitQ 走了另一条路:把每个向量压到几个比特,让"找最近邻"退化成一次位运算计数问题。从 1.11.0 落地到 1.15.0,它经历了从"能用"到"敢上生产"的连续迭代——1.15.0 把 RaBitQ 快扫路径的检索 QPS 再抬高 80%(见 CHANGELOG.md 变更描述),并补上了多比特、mmap 与 RISC-V 向量化内核的缺口。

RaBitQ 压掉了什么:300 字讲清原理

RaBitQ(Randomized Binary Quantization,随机二值量化)只记录向量经随机旋转后的"符号":每个维度相对质心取正还是取负,1 比特。类比成记地址,不写精确坐标,只记"河的哪边、桥的哪侧",维度越高编码越精细。符号本身会丢精度,所以每个向量额外存了范数、量化向量与原向量的点积等几个系数,查询时用系数做距离估计,而非精确重算。

真正让它快的有两件事:一是随机旋转矩阵(相当于先把向量随机搅匀,让符号位均匀携带信息,避免数据分布偏斜导致估计误差);二是 FastScan 批打包——32 个向量的符号位被拼进 SIMD 友好的块里,CPU 一条指令处理一批。距离估计的主体是位平面上的 popcount(统计 1 的个数),这正是 AVX-512 的 vpopcntdq 指令擅长的事。实现见 faiss/IndexIVFRaBitQFastScan.h 与 faiss/impl/RaBitQuantizer.h。

1.15.0 关键变更:新增、优化、修复

类别变更说明
优化RaBitQ 快扫查询初始化重构 + AND 点积与 popcount 融合QPS 提升 80%,并新增 AVX-512 LUT 量化路径
新增IndexIVFRaBitQFastScan转换构造函数先建 IVFRaBitQ,可原地转成 FastScan 变体
新增RISC-V RVV RaBitQ 内核RISC-V 向量指令平台也可跑 RaBitQ
新增Flat 与静态 Vamana SVS 索引的 mmap 支持用内存映射加载大索引,免去整块反序列化进内存
修复大 bbs 下快扫辅助偏移错误批大小超过默认值时结果会算错,1.15.0 修正
修复L2 距离估计钳制到 ≥ 0消除旧版本偶发输出的微小负距离

怎么建 IVFRaBitQ 索引:最小可运行示例

工厂字符串是最省事的入口:"IVF1000,RaBitQ4"表示 nlist=1000 的 IVF(倒排文件索引,先分桶再检索)配 4 比特 RaBitQ;想要 SIMD 批处理就写"RaBitQfs"(默认 1 比特、批大小 32)。

import numpy as np import faiss d, nb, nq, k = 768, 200_000, 1_000, 100 xb = np.random.rand(nb, d).astype("float32") xq = np.random.rand(nq, d).astype("float32") index = faiss.index_factory(d, "IVF1000,RaBitQ4") index.train(xb) index.add(xb) params = faiss.IVFRaBitQSearchParameters() params.nprobe = 32 params.qb = 8 # 查询向量量化位数,0 仅非 FastScan 变体支持 D, I = faiss.search_with_parameters(index, xq, k, params)

内存账可以直接算:1 比特下 d=768 的向量符号码 96 字节,加几字节系数,约为 float32 原尺寸的 1/30。

容易踩的坑:qb、nb_bits 与训练量

  • ⚠️ qb 默认值在 1.14.0 从 0 改成了 4,且 FastScan 变体不支持 qb=0(SIMD 查找表必须用量化后的查询)。老代码里硬编码 qb=0 的,换到 RaBitQfs 路径会直接报错。
  • "RaBitQ"工厂串默认 1 比特;2~9 比特写成"RaBitQ4"这种形式(1.13.1 起支持多比特)。多比特换召回,内存按比特数线性涨,别默认拉满。
  • 训练样本建议至少 39×nlist——这是 faiss k-means 每个质心的默认最小样本数,不够会导致分桶严重偏斜。官方基准 benchs/bench_rabitq.py 用的正是 10 万训练点 + nlist=1000 这条下限。
  • 评估前先确认 CPU 支持 AVX2/AVX-512:位平面扫描是 RaBitQ 的速度来源,标量路径与 SIMD 差距非常大,跨机器复现数字时先看指令集。

延伸资源

  • benchs/bench_rabitq.py:官方基准,条件为 20 万合成向量、d∈{256, 512, 768, 1024}、k=100、nprobe∈{4, 16, 32},对照 SQ、PQFastScan、HNSW。要在自己机器上拿数,照这个脚本跑最公平。
  • tests/test_rabitq.py:内含按 RaBitQ 论文逐行翻译的参考实现,适合核对理解或做跨 SIMD 级别的等价校验。
  • faiss/IndexRaBitQ.h:qb、centered、nb_bits 等字段语义都有注释,比翻文档快。

GPU 侧目前还没有 RaBitQ 内核,上亿向量想全压到 GPU 的实用组合仍是 IVFPQFastScan。后续版本大概率继续补多比特快扫融合与更广的平台覆盖,但 1.15.0 的 CPU 路径已经可以直接进生产评估了。

【免费下载链接】faissA library for efficient similarity search and clustering of dense vectors.项目地址: https://gitcode.com/GitHub_Trending/fa/faiss

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询