Faiss 版本演进全解:从 CHANGELOG 读懂 Faiss 的新特性、量化器与 SIMD 动态分发
【免费下载链接】faissA library for efficient similarity search and clustering of dense vectors.项目地址: https://gitcode.com/GitHub_Trending/fa/faiss
本文以 Faiss 仓库根目录下的 CHANGELOG.md 为蓝本,系统梳理该向量相似性搜索库从 1.2.1(2018 年)到 1.15.0(2026-07-31)的版本演进脉络。读完本文,你能快速掌握每个版本的发布日期与核心能力、RaBitQ/SuperKMeans/EDEN 等量化器的成熟路径、SIMD 动态分发架构的落地过程,以及如何在项目中正确识别版本并选用对应的安装与分发方式。
一、CHANGELOG.md 的结构与阅读方法
Faiss 遵循 Keep a Changelog 风格的组织方式:每个版本一个## [x.y.z] - 日期段落,内部按Added / Changed / Fixed / Deprecated四类(部分版本还有 Removed)罗列变更条目。1.15.0 及之前的条目携带 commit 哈希前缀(40 位 SHA 的前 10 位)与 PR 编号,例如:
- 41133fde4222a8862650601d85f9af684314ebc8 Add EDEN quantizer indexes (#5278) - cb9a72ac03f4e7f7d563e3e54ab4e86b8ce1af12 Reuse the HNSW visited table across searches ... (#5448)文件末尾附有一组指向上游仓库版本对比页的引用链接(从[1.2.1]到[1.15.0]),方便在两个版本之间做 diff 审阅。阅读时的实用技巧是:先按主题横向检索关键词(如RaBitQ、SIMD、cuVS、deserialization),再回到对应版本段落纵向确认上下文——因为 Faiss 的一个大特性(例如 RaBitQ)往往横跨多个版本逐步完善。
版本时间线总览
| 版本 | 发布日期 | 该版本最具代表性的变化 |
|---|---|---|
| 1.2.1 | 2018-02-28 | IVF 磁盘存储、C bindings |
| 1.3.0 | 2018-07-10 | 二值索引(IndexBinaryFlat / IndexBinaryIVF)、索引序列化 |
| 1.6.0 | 2019-09-24 | ScalarQuantizer 上 GPU、serialize_index/deserialize_index |
| 1.7.0 | 2021-01-27 | (版本条目精简,过渡版本) |
| 1.7.3 | 2022-11-03 | 稀疏 k-means、Product Additive Quantization、每查询检索参数 |
| 1.7.4 | 2023-04-12 | 大批量 IVF 搜索(big batch search)、Jaccard 距离 |
| 1.8.0 | 2024-02-27 | faiss-gpu-raft 包、FAISS_OPT_LEVEL环境变量、AVX512 优化模式 |
| 1.9.0 | 2024-10-04 | ROCm 支持、QINCo、AVX-512 SQ8 距离、TimeoutCallback |
| 1.10.0 | 2025-01-30 | 从 RAFT 迁移到 cuVS、avx512_spr架构模式、Windows ARM64 |
| 1.11.0 | 2025-04-24 | RaBitQ 实现落地、mmap/零拷贝反序列化 |
| 1.12.0 | 2025-08-11 | 二进制 CAGRA(含 NN Descent)、IVF 额外度量、extended APIEx后缀 |
| 1.13.0 | 2025-11-11 | Panorama 集成进 IVF/HNSW、RaBitQ Fast Scan |
| 1.13.2 | 2025-12-19 | 启用 Intel ScalableVectorSearch(SVS)、IndexRefinePanorama |
| 1.14.0 | 2026-03-02 | SIMD 动态分发基础设施(SIMDConfig)、PEP 561 类型桩 |
| 1.14.2 | 2026-05-21 | SuperKMeans、Metal GPU 后端(Apple Silicon)、pip 安装支持、IVF 提前终止 |
| 1.14.3 | 2026-06-12 | TurboQuant(QJL 阶段)、Sapphire Rapids 优化、HNSWis_similarity模式 |
| 1.15.0 | 2026-07-31 | EDEN 量化器索引、cuVS IVF-SQ 后端、多 GPU CAGRA→HNSW 构建 |
上表可直接对照 CHANGELOG.md 中的对应段落逐条核验。
二、1.15.0 深度解读:EDEN、量化器加速与反序列化加固
Added:EDEN 量化器与多 GPU 构建能力
1.15.0 的 Added 段落中,技术含量最高的两条是:
- Add EDEN quantizer indexes (#5278):引入 EDEN 量化器索引。仓库中对应源文件为 faiss/IndexIVFEDEN.h、faiss/IndexIVFEDEN.cpp 与编码器头 faiss/impl/EDENQuantizer.h,该索引已接入 index_factory、clone_index 与序列化读写路径(可搜索
IndexIVFEDEN在 faiss/index_factory.cpp、faiss/impl/index_read.cpp 中的引用)。测试覆盖见 tests/test_eden.py。 - Enable byte-LUT gather path for QT_8bit_eden (#5498):为 EDEN 的 8-bit 量化计算补充字节查表(LUT gather)路径,属于紧随其后的性能补强。
其余值得注意的 Added 条目包括:
- 多 GPU CAGRA → HNSW 构建(#5282):支持
trainAllNeighbors与多 GPU optimize,打通 GPU 建图后回 CPU 的完整链路; - Flat 与静态 Vamana SVS 索引的内存映射 I/O(#5271):让超大索引可通过 mmap 加载;
- RISC-V RVV 内核(#5354、#5369):新增 RVV 向量距离与 rabitq 内核,配合 cmake/toolchains/riscv64-linux-gnu.cmake 的交叉编译支持;
- cuVS IVF-SQ 后端(#5306)与faiss-gpu-cuvs pip wheel 打包(#5250),后者对应仓库根目录的 pyproject-gpu-cuvs.toml;
- IndexHNSW 基类读写支持(#5305)与IndexFlat range_search 支持 METRIC_L1 等额外度量(#5391)。
Changed:RaBitQ FastScan 的系统性提速
1.15.0 的 Changed 段落几乎被 RaBitQ 相关优化主导,形成了一条清晰的优化链:
Optimize RaBitQ fastscan query setup + 80% qps (#5396)—— 查询侧建表提速;Fuse RaBitQ AND-dot and popcount scan (#5412)—— 将 AND-dot 与 popcount 扫描融合为单趟;RaBitQ fastscan avx512 lut quant (#5397)与RaBitQ SIMD-optimized bit-plane operation (#5392)—— AVX512 LUT 量化与位平面 SIMD 化;Reuse RaBitQ IVF scanner distance computer (#5390)—— 复用 DistanceComputer,避免重复构造。
此外还包括 HNSW visited table 跨查询复用(#5448)、visited table 哈希集合阈值从 50 万提高到 1000 万(#5446)、AMD Zen 4 上使用 256-bit 快速扫描 QBS 内核(#5488)等。这些条目的实现可分别在 faiss/utils/simd_impl/ 与 faiss/impl/hnsw/ 目录下按名字检索验证。
Fixed:反序列化安全加固的集中体现
1.15.0 的 Fixed 段落延续并扩大了 1.14.x 启动的“反序列化加固”运动,代表性条目:
Bound recursion depth in index deserialization (CWE-674) (#5468);Harden FastScan deserialization: enforce ksub==16 and bound reconstruct() (#5436);Bound IVFPQ precomputed-table allocation at deserialization time (#5464);Harden OnDiskInvertedLists mmap reader against malformed list sizes (#5312);Guard against integer overflow in index deserialization storage-size checks (#5313)。
从源码结构看,这些加固集中于 faiss/impl/index_read.cpp 与 faiss/impl/io.cpp,并有专门的越界/损坏文件测试 tests/test_io_corrupted.cpp 与反序列化验证测试 tests/test_read_index_deserialize.cpp 兜底。对使用方而言,这意味着加载不可信来源的索引文件时,1.15.0 比早期版本多了一层输入校验防线;若你长期停留在旧版本,升级时值得关注此类安全修复。
三、纵向主题一:RaBitQ 的完整成熟路径(1.11.0 → 1.15.0)
CHANGELOG 是追踪单个特性跨版本演进的最好材料。RaBitQ 的时间线如下:
- 1.11.0(2025-04-24):
RaBitQ implementation (#4235)首次落地,并修复了首个序列化问题(fix a serialization problem in RaBitQ (#4261))。 - 1.12.0(2025-08-11):
SIMD optimization RaBitQ (#4515)完成 SIMD 化;Change default qb from 0 to 4 in RaBitQ indexes (#4757)(在 1.14.0 段落中)调整了默认查询位数。 - 1.13.0(2025-11-11):
RaBitQ Fast Scan (#4595)与Implementation of IndexIVFRaBitQFastScan (#4596),进入 FastScan 体系。 - 1.13.1(2025-12-02):
Implement multi-bit RaBitQ quantization (nb_bits 2-9) (#4679),多比特支持。 - 1.13.2(2025-12-19):多比特扩展进 FastScan(#4721、#4722),并新增
RaBitQStats统计两阶段过滤效果。 - 1.14.x → 1.15.0:多比特 IP 度量 SIMD 优化(1.14.1 #4850)、VPOPCNTDQ 内核(1.14.3 #5149)、FastScan 全链路优化与正确性修复(1.15.0 #5396 系列、
Fix RaBitQ fast scan aux offsets for large bbs (#5421))。
当前仓库中,RaBitQ 相关实现分布在 faiss/RaBitQuantizer.h、faiss/IndexRaBitQ.h、faiss/IndexIVFRaBitQFastScan.h 等处,性能基准见 benchs/bench_rabitq.py 与 tests/test_rabitq.py。这个“实现 → SIMD → FastScan → 多比特 → 优化”的节奏,是阅读 Faiss 其他新特性(如 Panorama、TurboQuant)时同样适用的方法。
四、纵向主题二:SIMD 动态分发(Dynamic Dispatch)的落地
这是 1.14.x~1.15.0 间对编译体系影响最大的变化,直接改变了 Faiss 的构建与分发方式:
- 1.14.0:
Introduce Dynamic Dispatch infrastructure with SIMDConfig (#4780),同时resulthandlers with AVX512 (#4806)、dynamic dispatch distances_simd (#4781)等条目表明距离函数与结果处理器开始模板化; - 1.14.2:
Add SIMD dynamic dispatch migration guide (#4973),即仓库中的 faiss/docs/simd_dynamic_dispatch_migration.md;同时V2 enable specifying a subset of SIMD levels ... (#4959)允许在分发时裁剪 SIMD 级别集合; - 1.14.3:修复静态分发的退化问题——
static SIMD dispatch falls to scalar for avx512_spr/avx512/arm_sve builds (#5057),并为 Sapphire Rapids 增加 SQ 优化与 VPOPCNTDQ 内核; - 1.15.0:
SIMDConfig::has_dynamic_dispatch() (#5460)提供公开判断接口;SQ AVX-512 falls back to AVX2 when d%16!=0 (#5478)等条目体现回退策略的精细化的。
迁移指南解释了为何不能简单“运行时检查再分支”:整个编译单元(translation unit)会受-mavx2等标志影响被自动向量化,因此 SIMD 代码必须隔离到独立编译单元(如distances_avx2.cpp),公共代码以基线标志编译。这与当前源码布局完全一致:faiss/utils/simd_impl/ 下按指令集拆分.cpp文件,faiss/impl/simdlib/ 提供simdlib_avx2.h、simdlib_avx512.h、simdlib_neon.h、simdlib_ppc64.h、simdlib_emulated.h等按级别拆分的模板层,而运行时入口在 faiss/impl/simd_dispatch.h 的SIMDConfig与with_simd_level(后者可对整个代码块只做一次分发,避免紧循环内的逐次开销)。相关验证测试包括 tests/test_simd_dispatch.py、tests/test_simd_levels.cpp 及NoneSIMDLevel跨级别一致性检查(1.14.2 #5158)。
对使用者的实际影响:动态分发构建的单个二进制可以在不同指令集的机器上运行并自动选择最优内核,减少了“必须为 AVX2/AVX512 分别编译/链接”的负担——这正是 1.14.0 之前 monolithic SIMD 模型的痛点,见 CHANGELOG.md 1.14.0 段落与 faiss/docs/simd_dynamic_dispatch_migration.md 的对照阅读。
五、纵向主题三:GPU 生态(cuVS 取代 RAFT、Metal 后端)与打包演进
cuVS 迁移与扩展
- 1.10.0中
Migrate from RAFT to CUVS (#3549)是 GPU 侧的结构性转折,1.12.0 的 Deprecated 段落则正式清退了 CUDA 11 支持; - 1.13.x 升级 cuVS 至 25.10(#4639);1.14.0 升级为 26.06(#5240,实际记录在 1.14.3 段落);1.14.2 起 CUDA 13.2 进入 CI(#5207),并修复了 CI 超时问题(
pin CUDA toolkit to 13.2 (#5401),1.15.0); - 1.15.0新增 cuVS IVF-SQ 后端(#5306),并在 aarch64 上按需裁剪 cuVS 暴力 Flat 索引(
FAISS_CUVS_NO_FLAT,#5431)。
Metal 后端与多平台
- 1.14.2:
Add Metal GPU backend for Apple Silicon (IndexFlat) (#5144); - 1.14.3:
MetalIndexIVFFlat带 IVF scan/merge 内核(#5202),且 Apple 机器默认启用 Metal(#5280); - 1.15.0:
MetalIndexIVFPQ with product quantization and residual encoding support (#5288)。
对应源码位于 faiss/gpu_metal/,含独立.metalshader 与MetalIndexFlat、MetalIndexIVFFlat、MetalIndexIVFPQ等实现。
pip / conda 打包与类型桩
- 1.14.0:引入 PEP 561 Python 类型桩(#4840),对应 faiss/python/init.pyi 与 faiss/python/py.typed;
- 1.14.2:
Add pip install support via scikit-build-core + cibuildwheel (#4862),与 pyproject.toml 中的scikit-build-core>=0.10构建后端一致;同版本重新启用 musllinux 轮子(1.14.3 #5299); - 1.15.0:新增
faiss-gpu-cuvspip 打包(#5250)与 aarch64/GH200 的 conda 包pyfaiss_gpu_cuvs_2602(CUDA 12.4);类型桩持续补全(SVS 索引类 #5489、SQ 枚举 #5323/#5324)。 - 代码风格在 1.15.0 统一为 black(行宽 80)并配套 flake8 对齐(#5349~#5444 系列),这是该版本 Changed 段落的另一大组成。
版本号的单一事实来源是 faiss/Index.h 中的FAISS_VERSION_MAJOR/MINOR/PATCH(当前为 1.15.0,与 CHANGELOG 最新段落一致),Python 侧由 faiss/python/init.py 的__version__拼接导出,C 侧则有 1.9.0 引入的faiss_get_version()(C API #3688)。
六、实用建议:如何用这份 CHANGELOG 指导版本选择
- 确认安装版本:Python 中
import faiss; faiss.__version__,C++ 中用FAISS_VERSION宏或 C API 的faiss_get_version(); - 按需求选版本:需要 RaBitQ 多比特 + FastScan 至少 1.13.2;需要 Metal(Apple Silicon)至少 1.14.2;需要 EDEN、cuVS IVF-SQ、RISC-V RVV 内核则需 1.15.0;需要反序列化安全加固收益,建议不低于 1.14.0;
- 升级前看 Fixed 段:Faiss 的 Fixed 段落常包含跨版本累积的内存安全修复(如 1.14.2 中
Fix integer overflow and unbounded loop in Clustering.cpp (#5130)),从 1.12 之前的大版本跨度升级时尤应留意; - 特性追踪法:以 RaBitQ 为例(见第三节),用
grep -n "RaBitQ" CHANGELOG.md即可还原特性从落地到成熟的完整证据链,再结合对应测试文件(如 tests/test_rabitq.py)验证行为; - 注意适用前提:1.15.0 的 cuVS 相关能力要求对应 cuVS 版本与 CUDA 12.4/12.8+ 环境(见 pyproject-gpu-cuvs.toml 与 INSTALL.md),Metal 能力仅限 Apple Silicon,RVV 内核面向 RISC-V 平台,均非通用 CPU 路径的默认依赖。
七、小结
CHANGELOG.md 是 Faiss 仓库中信息密度最高的单一文件:它既记录了从 1.2.1 的磁盘 IVF 与 C bindings 到 1.15.0 的 EDEN 量化器、多 GPU CAGRA 构建与反序列化加固的完整演进,也以 RaBitQ、SIMD 动态分发、cuVS 迁移三条纵向主线展示了“新特性如何在多个版本间逐步成熟”的典型节奏。结合仓库中的源码(faiss/impl/simdlib/、faiss/gpu_metal/、faiss/svs/)、测试(tests/)与打包配置(pyproject*.toml、conda/),这份变更日志足以作为评估版本选择、规划升级路径的第一手依据。
【免费下载链接】faissA library for efficient similarity search and clustering of dense vectors.项目地址: https://gitcode.com/GitHub_Trending/fa/faiss
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考