本项目实现了基于 RNNDescent(Recursive Nearest Neighbor Descent)的高效向量检索算法,适用于大规模高维向量数据的最近邻搜索任务。
本项目(外部调试版本)的知识产权归华为公司所有,未经授权不得用于商业目的。详细许可条款请见本文档末尾的商用许可章节。
RNNDescent 是一种基于图的近似最近邻搜索算法,通过构建和优化近邻图来加速向量检索过程。本实现针对不同维度的向量(512维、1024维、1536维)进行了优化,支持大规模数据集(百万级)的高效检索。
- 支持多种向量维度(512D、1024D、1536D)
- 针对不同维度的向量进行了参数优化
- 集成 PCA 降维技术提升高维向量检索效率
- 支持并行计算,充分利用多核 CPU
- 实现了多种距离计算优化(SIMD、BLAS 等)
RNNDescent 算法通过以下步骤构建和优化近邻图:
- 初始图构建:为每个数据点随机选择或通过启发式方法选择初始近邻
- 迭代优化:重复应用局部搜索策略,不断改进近邻图的质量
- 搜索过程:从种子点开始,在近邻图中进行贪婪搜索,找出近似最近邻
本实现还针对不同维度的向量进行了特殊优化:
- 对于高维向量(1024D、1536D),使用 PCA 降维技术降低计算复杂度
- 对于 512D 向量,采用了数据重排策略提升缓存命中率
├── main.cpp # 主程序入口,包含测试和性能评估
├── CMakeLists.txt # CMake 构建配置
├── run.sh # 运行脚本
└── solution/ # 核心算法实现
├── solution.h # Solution 类接口定义
├── solution.cpp # Solution 类实现
└── rnndescent/ # RNNDescent 算法核心实现
├── IndexRNNDescent.h # RNNDescent 索引接口
├── RNNDescent.h # RNNDescent 算法核心
├── RNNDescentInitial.h # 初始图构建
└── discomputer/ # 距离计算模块
- C++17 兼容的编译器
- CMake 3.23 或更高版本
- OpenMP(用于并行计算)
- Faiss 库(用于基础向量操作)
- BLAS 或 OpenBLAS(用于矩阵计算)
- 确保所有依赖项已安装
- 执行以下命令进行编译:
mkdir -p build
cd build
cmake ..
make -j$(nproc)- 编译完成后,可执行文件将生成在 build 目录下
编译完成后,可以直接运行生成的可执行文件:
./algorithm或者使用提供的运行脚本:
./run.sh在 solution.cpp 中可以调整以下关键参数:
S:局部搜索的大小R:构建过程中的采样数量beamSizeMax:beam search 参数search_L:搜索过程中的扩展参数K0:初始搜索数量numSearchInitializeItem:搜索初始化项数量
针对不同维度的向量,代码中已经预设了优化的参数组合。
主程序会自动生成随机测试数据并进行性能评估,输出以下信息:
- 索引构建时间
- 搜索延迟(每查询平均毫秒数)
- 吞吐量(每秒查询数)
- 检索结果的距离信息
测试覆盖三种维度(512D、1024D、1536D),每种维度包含百万级向量数据。
本实现采用了多种优化技术来提升性能:
- 多线程并行:使用 OpenMP 实现构建和搜索过程的并行化
- SIMD 优化:使用 SIMD 指令加速距离计算
- PCA 降维:对高维向量进行降维处理
- 缓存优化:通过数据重排提升缓存命中率
- 参数调优:针对不同维度向量优化算法参数
- 当前实现不支持动态插入数据,索引构建后无法添加新向量
- 算法参数针对特定硬件环境进行了优化,可能需要根据实际环境进行调整
- 编译时需确保正确链接 BLAS 或 OpenBLAS 库
- RNNDescent 算法原始论文
- Faiss 库文档
- OpenMP 并行编程指南
本项目(外部调试版本)遵循以下商用许可条款:
-
非商业用途许可:未经华为公司书面授权,不得将本项目用于任何商业目的。
-
内部调试使用:本代码仅用于算法调试和性能测试,与华为公司内部商用版本存在较大差异。
-
知识产权声明:本项目包含的所有代码、算法和优化方法的知识产权归华为公司所有。
-
修改限制:未经授权,不得修改、分发、逆向工程或以任何形式传播本项目代码。
-
免责声明:本调试版本不保证性能、稳定性或正确性,仅供参考和学习使用。
如需商业授权或了解更多商用版本信息,请联系华为公司相关部门。
本项目为华为算法大赛参赛作品(外部调试版本),实现了高效的大规模向量检索算法。与内部商用有较大差别