Faiss介绍
最新消息
- [2026.03.30]:Faiss提供全量优化补丁与等价优化补丁。其中,全量优化补丁针对IVFPQ算法进一步优化,新增支持HNSW FP16接口。
- [2025.12.30]:Faiss发布于Gitcode平台,实现IVFFLAT、IVFPQ、IVFPQFS、PQFS、HNSW优化。
项目介绍
Faiss是由facebook开发的用于高效相似搜索和密集向量聚类的算法库,其核心采用C++编写,并为Python/numpy提供完整封装接口。Faiss提供IVFFlat、IVFPQ、HNSW、IVFPQFS、PQFS等索引方式。鲲鹏优化基于开源Faiss代码做侵入式修改,保持原有接口。
HNSW是Faiss提供的一种近似最近邻(ANN)图检索算法,开源Faiss(HNSW)接口支持FP32数据类型。为优化计算效率与内存占用,对原生faiss进行适配改造,增加FP16接口,使其在鲲鹏ARM架构下同样支持基于FP16的高效召回计算。
目录结构
代码仓目录结构如下:
faiss/
├─ 0001-faiss_1.8.0-optimize-neq.patch // 全量优化补丁
├─ 0002-faiss_1.8.0-optimize-eqv.patch // 等价优化补丁
└── docs
├── LICENSE
└── zh
├── api_reference.md // API参考
├── feature_introduction.md // 特性介绍
├── best_practices.md // 最佳实现
├── installation_guide.md // 安装指南
├── quick_start.md // 快速上手
└── release_notes.md // 版本说明书使用补丁后Faiss完整的目录结构如下所示:
faiss/
├─ benchs/ // 基准测试
├─ c_api/ // C语言API封装
├─ cmake/ // CMake配置模块
├─ conda/ // Conda构建脚本
├─ contrib/ // Python贡献模块
├─ demos/ // 示例程序
├─ faiss/
│ ├─ CMakeLists.txt // 构建配置
│ ├─ Index.h // 抽象基类,统一接口
│ ├─ IndexFlat.cpp // 暴力搜索实现
│ ├─ IndexFlatCodes.h // 统一码存储基类(用于PQ、SQ 等)
│ ├─ IndexFlatCodes.cpp // 统一码存储基类实现
│ ├─ IndexFastScan.h // 4‑bit PQ/AQ快速扫描通用接口
│ ├─ IndexFastScan.cpp // 4‑bit PQ/AQ快速扫描通用实现
│ ├─ IndexIVF.h // IVF基类接口
│ ├─ IndexIVF.cpp // IVF基类+具体实现
│ ├─ IndexIVFFlat.cpp // IVFFlat具体实现
│ ├─ IndexIVFPQ.cpp // IVFPQ实现
│ ├─ IndexIVFFastScan.h // IVFPQFastScan接口
│ ├─ IndexIVFFastScan.cpp // IVFPQFastScan(CPU)实现
│ ├─ IndexHNSW.h // HNSW索引接口
│ ├─ IndexHNSW.cpp // HNSW索引实现
│ ├─ IndexRefine.h // 基准+细化组合索引接口
│ ├─ IndexRefine.cpp // 基准+细化组合索引实现
│ ├─ impl/
│ │ ├─ DistanceComputer.h // 距离计算抽象接口
│ │ ├─ ProductQuantizer.h // 乘积量化器接口
│ │ ├─ ProductQuantizer.cpp // 乘积量化器实现
│ │ ├─ pq4_fast_scan.h // 4‑bit PQ快速扫描接口
│ │ ├─ pq4_fast_scan_search_1.cpp // 4‑bit PQ快速扫描单查询实现
│ │ ├─ pq4_fast_scan_search_qbs.cpp // 4‑bit PQ快速扫描批量查询实现
│ │ ├─ HNSW.cpp // HNSW图结构实现
│ │ ├─ index_read.cpp // 索引反序列化实现
│ │ └─ simd_result_handlers.h // SIMD结果处理器
│ ├─ invlists/
│ │ ├─ InvertedLists.h // 倒排列表抽象接口
│ │ └─ InvertedLists.cpp // 倒排列表实现
│ ├─ utils/
│ │ └─ distances_simd.cpp // SIMD L2/IP/L1/Linf实现
│ ├─ sra_krl/
│ │ ├─ include/
│ │ │ ├─ krl.h // 对外统一API声明
│ │ │ ├─ krl_internal.h // 内部结构体、宏、SIMD辅助实现
│ │ │ ├─ platform_macros.h // 错误码、度量常量、平台宏
│ │ │ └─ safe_memory.h // 安全内存操作
│ │ └─ src/
│ │ ├─ Heap_sort.c // Top‑K堆构建、双堆重排实现
│ │ ├─ IPdistance_simd.c // 单精度向量内积SIMD实现(batch 2/4/8/16)
│ │ ├─ IPdistance_simd_f16.c // float16 IP距离计算实现
│ │ ├─ IPdistance_simd_f16f32.c // float16 IP距离计算实现(float输出)
│ │ ├─ IPdistance_simd_s8.c // int8 IP距离计算实现(int32/float输出)
│ │ ├─ L2distance_simd.c // float L2距离计算实现(batch 2/4/8/16/24)
│ │ ├─ L2distance_simd_f16.c // float16 L2距离计算实现
│ │ ├─ L2distance_simd_f16f32.c // float16 L2距离计算实现(float输出)
│ │ ├─ L2distance_simd_u8.c // uint8 L2距离计算实现(uint32/float输出)
│ │ ├─ matrix_block_transpose.c // 4×4块转置kernel
│ │ ├─ MinMax_quant.c // 量化(fp16/u8/s8)
│ │ ├─ NegaIPdistance_simd_f16f32.c // float16 IP距离计算实现(取反,float输出)
│ │ ├─ NegaIPdistance_simd_s8.c // int8 IP距离计算实现(取反,int32/float输出)
│ │ ├─ handle_IO.c // 句柄序列化/反序列化(文件I/O)
│ │ ├─ krl_handles.c // 句柄创建、初始化、清理、指针访问
│ │ ├─ pq_search_with_table_4bit.c // 4‑bit查表
│ │ ├─ pq_search_with_table_8bit.c // 8‑bit查表
│ │ ├─ reorder_2_vectors.c // 稀疏/连续重排
│ │ └─ sve_search_codes.c // 4‑bit fp16查表(sve)
│ ├─ cppcontrib/ // C++贡献模块
│ ├─ gpu/ // GPU子系统
│ └─ python/ // Python绑定
├─ misc/ // 杂项测试
├─ tests/ // 单元测试
├─ tutorial/ // 教程示例
├─ CMakeLists.txt // 顶层构建配置
├─ CHANGELOG.md
├─ CODE_OF_CONDUCT.md
├─ CONTRIBUTING.md
├─ INSTALL.md
├─ LICENSE
└─ README.md版本说明
关于Faiss的版本更新情况请参见《Faiss 版本说明书》。
学习文档
免责声明
此代码仓计划参与Faiss开源组件,编码风格遵照原生开源软件,继承原生开源软件安全设计,不破坏原生开源软件设计及编码风格和方式,软件的任何漏洞与安全问题,均由相应的上游社区根据其漏洞和安全响应机制解决。请密切关注上游社区发布的通知和版本更新。鲲鹏计算社区对软件的漏洞及安全问题不承担任何责任。
License
Faiss采用MIT License许可证授权,支持修改代码和再开源,具体请参见LICENSE文件。
本项目的文档适用CC-BY 4.0许可证,具体请参见LICENSE文件。
贡献声明
欢迎大家为社区做贡献,如果使用过程中有任何问题/建议,或者需要反馈特性需求和bug报告,可以提交Issues联系我们,具体贡献方法可参考这里。同时也欢迎大家在讨论专区展开讨论交流。感谢您的支持。
致谢
Faiss由华为公司的下列部门联合贡献:
- 鲲鹏计算Boostkit开发部
感谢来自社区的每一个PR,欢迎贡献Faiss!