公司动态

Faiss 1.15.0 解读:RaBitQ 量化提速与 FastScan 融合,把向量存储压进 1/32 内存

📅 2026/9/1 14:29:39
Faiss 1.15.0 解读:RaBitQ 量化提速与 FastScan 融合,把向量存储压进 1/32 内存
Faiss 1.15.0 解读RaBitQ 量化提速与 FastScan 融合把向量存储压进 1/32 内存【免费下载链接】faissA library for efficient similarity search and clustering of dense vectors.项目地址: https://gitcode.com/GitHub_Trending/fa/faissFaiss 1.15.0 把 RaBitQ 二进制量化又往前推了一大步新增 IVFRaBitQ 到 FastScan 的转换构造、补全 RISC-V RVV 内核并围绕 RaBitQ 搜索路径做了一整轮 SIMD 优化。读完这篇你会清楚 RaBitQ 为什么省内存、FastScan 变体快了哪一块以及nprobe、qb、nb_bits该怎么调。设想一下这个场景1 亿条 1024 维向量。fp32 全量存储每条占 4KB光向量就要 400GB 内存。换 RaBitQ 编码后单条 code 只剩 d/8 字节出头——同样 1 亿条压到十几 GB 量级单机就能装下。这就是这个版本值得看的理由。版本速览类别内容关键文件新增IVFRaBitQ → FastScan 转换构造#5422直接复用 FastScan 批处理扫描IndexIVFRaBitQFastScan.h新增RISC-V RVV 向量距离与 RaBitQ 内核#5354、#5369rabitq_avx512_spr.cpp新增Flat 与静态 Vamana SVS 索引的 mmap I/O#5271mapped_io.cpp优化RaBitQ fastscan 查询侧优化changelog 标注 QPS 提升 80%#5396CHANGELOG.md优化HNSW 跨查询复用 visited table不再每次重分配#5448HNSW.cpp优化RaBitQ AND-dot 与 popcount 扫描融合#5412RaBitQUtils.h修复大bbs下 fastscan 辅助偏移错误可能导致结果错乱#5421CHANGELOG.md修复RaBitQ 查询量化对零范数/常数查询的防御#5381RaBitQuantizer.cpp修复一批反序列化加固递归深度、存储大小、mmap reader 边界检查CHANGELOG.md完整变更日志见 CHANGELOG.md。深潜RaBitQ FastScan 是怎么省内存、提速度的它解决了什么问题传统 IVFPQ/SQ 方案里一条向量至少要压到 1 字节/维SQ8或更低1024 维就是 1KB 起步而 fp32 是 4KB。RaBitQ 走得更极端每条向量主体只存d/8字节的符号位外加每批向量共享的少量辅助量。1024 维向量从 4096 字节降到约 128 字节压缩比接近 32 倍——代价是距离从精确值变成无偏估计recall 会略降用benchs里的数据对拍即可量化具体以官方 benchmark 为准。工作原理三步讲清编码随机旋转 取符号。训练阶段统计全局中心IVF 形态则是逐 list 的质心向量先减去中心再转成 sign 向量一条向量约d/8字节。IVFRaBitQ 默认对残差做量化by_residual true见 IndexIVFRaBitQ.cpp。查询符号位距离用位运算算。查询向量量化到qb位后距离核心是 AND、点积和 popcount 的组合这一步在 1.15.0 里被融合成单次扫描#5412并有 AVX2/AVX512/SPRvpopcntdq、NEON、RVV 各档内核。批量FastScan 打包扫描。IndexIVFRaBitQFastScan把 32 条 code 打包成一组做 SIMD 查表默认bbs321.15.0 新增的转换构造让你可以直接把普通 IVFRaBitQ 转成 FastScan 版不需要重建索引。关键参数与取舍参数推荐值调大 / 调小的影响qb查询量化位数4~8调大距离估计更准、recall 略升建 LUT 开销略增qb0用原始 fp32 查询FastScan 变体不支持nb_bits数据库侧位宽1调大存储变宽、精度升多比特 RaBitQ 可用默认 1bit 是省内存主场景nprobe10~100随 nlist 缩放调大recall 升、QPS 降典型 IVF 权衡没有免费午餐内存对比d1024按 code_size 粗算索引单条向量存储相对 fp32IndexFlat (fp32)4096 B1xIndexIVFSQ8~1024 B~1/4IndexIVFRaBitQ (1bit)~128 B 批辅助量~1/32速度侧changelog 记录 RaBitQ fastscan 查询路径优化带来约 80% QPS 提升#5396recall 水平请自行跑 bench_rabitq.py 在你的数据上验证该脚本会输出 recall vs speed / recall vs memory 两张散点图并与 SQ、PQFastScan、HNSW 基线对拍。上手指南构建第一个 IVFRaBitQ 索引环境准备与安装有 GPU 需求之外的 CPU 场景直接装官方 wheel 即可pip install faiss-cpu需要特定编译选项时从源码构建git clone https://gitcode.com/GitHub_Trending/fa/faiss cd faiss cmake -B build -DFAISS_ENABLE_C_APION make -C build -j8。构建报 BLAS 相关错误时检查 OpenBLAS 开发包是否装齐细节见 INSTALL.md。最小可运行示例import numpy as np, faiss d, nb, k 128, 100_000, 10 x np.random.rand(nb, d).astype(float32) xq np.random.rand(1000, d).astype(float32) index faiss.index_factory(d, IVF1000,RaBitQ) index.train(x[:39_000]) index.add(x) D, I index.search(xq, k) print(D.shape, I.shape) # (1000, 10) (1000, 10)C 侧入口是 IndexRaBitQ.h 和 IndexIVFRaBitQ.h用法与 Python 一一对应行为测试可参考 test_rabitq.py。选型与调优速查维度推荐方案理由数据规模百万~千万级内存紧张IVFRaBitQFastScan1/32 存储单机可容纳更大库精度要求recall 需 0.95IVFPQFastScan / HNSW量化估计引入误差高精度场景选 PQ 或图索引硬件RISC-V / ARM 服务器RaBitQRVV/NEON 内核已覆盖1.15.0 补齐了多平台 SIMD 档位需要精确距离复核搭配 refineIndexRefine先用量化估计召回再精确复算高频调优参数nprobe10~100recall 与 QPS 的主开关qb4~8距离估计精度FastScan 下不可为 0nb_bits默认 1追求精度时看多比特 RaBitQbbsFastScan 打包宽度默认 32一般不用动训练样本建议 3.9 万 × nlist 起步kmeans 才收敛得稳调优入口bench_rabitq.py 一键产出 recall-speed-memory 三条曲线比单点数字更靠谱。容易踩的坑坑FastScan 版 RaBitQ 上把qb设成 0构造/搜索直接报错。→原因FastScan 依赖量化后的查询来建 SIMD 查找表不接受 fp32 查询。→解法params.qb 8把 0 留给非 FastScan 的IndexRaBitQ。坑RaBitQ 查出来的距离出现负数或排序看起来不对。→原因二进制量化距离是估计值1.15.0 才把 L2 估计夹到 ≥0#5393旧版行为不同且它不是精确距离。→解法下游阈值逻辑按估计值设计关键业务接 refine 复算。坑升级后 fastscan 结果和旧版本对不上。→原因旧版大bbs下辅助偏移算错#5421错的是旧版。→解法升级后重跑一遍 test_rabitq.py 基线确认。收尾1.15.0 的主线很清晰RaBitQ 从能用的省内存方案变成了多平台、快扫描、可与 FastScan 无缝衔接的主力方案配合 mmap I/O大索引的内存和加载成本都被压了一档。延伸阅读可以看 bench_rabitq.py 里的基线设计以及 IndexIVFRaBitQ.h 的接口注释。后续版本值得关注的方向是 RaBitQ 的 GPU 内核与多比特变体的进一步铺开。【免费下载链接】faissA library for efficient similarity search and clustering of dense vectors.项目地址: https://gitcode.com/GitHub_Trending/fa/faiss创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考