From 106c9e6ca62390975b4a312cc516b0758815b199 Mon Sep 17 00:00:00 2001 From: ccyyy1023 <2637034749@qq.com> Date: Sun, 20 Sep 2026 16:29:43 +0800 Subject: [PATCH] feat: add CUDA GPU vector retrieval project --- 09_vector_retrieval/ccyyy1023/.gitignore | 5 + 09_vector_retrieval/ccyyy1023/CMakeLists.txt | 39 +++ ...3\347\273\223\346\212\245\345\221\212.pdf" | Bin 0 -> 246794 bytes 09_vector_retrieval/ccyyy1023/README.md | 155 +++++++++++ 09_vector_retrieval/ccyyy1023/REPORT.md | 127 +++++++++ .../ccyyy1023/configs/exact.conf | 6 + .../ccyyy1023/configs/ivf_flat.conf | 6 + .../ccyyy1023/include/gvs/io.hpp | 34 +++ .../ccyyy1023/include/gvs/search.hpp | 78 ++++++ .../ccyyy1023/results/SMOKE_SUMMARY.md | 5 + .../ccyyy1023/results/SUMMARY.md | 14 + .../ccyyy1023/results/batch_1.json | 8 + .../ccyyy1023/results/batch_32.json | 8 + .../ccyyy1023/results/environment.txt | 7 + .../ccyyy1023/results/index_build.txt | 1 + .../ccyyy1023/results/k_1.json | 8 + .../ccyyy1023/results/k_10.json | 8 + .../ccyyy1023/results/k_100.json | 8 + .../ccyyy1023/results/k_50.json | 8 + .../ccyyy1023/results/nprobe_1.json | 8 + .../ccyyy1023/results/nprobe_4.json | 8 + .../ccyyy1023/results/nprobe_64.json | 8 + .../ccyyy1023/results/smoke.json | 8 + .../ccyyy1023/scripts/check_submission.py | 50 ++++ .../scripts/run_required_benchmarks.sh | 50 ++++ .../ccyyy1023/scripts/run_smoke.sh | 26 ++ .../ccyyy1023/scripts/summarize_results.py | 59 ++++ .../ccyyy1023/src/cpu_search.cpp | 73 +++++ 09_vector_retrieval/ccyyy1023/src/file_io.cpp | 127 +++++++++ .../ccyyy1023/src/gpu_search.cu | 227 +++++++++++++++ .../ccyyy1023/src/ivf_flat.cpp | 214 +++++++++++++++ 09_vector_retrieval/ccyyy1023/src/main.cpp | 259 ++++++++++++++++++ .../ccyyy1023/tests/test_search.cpp | 72 +++++ 33 files changed, 1714 insertions(+) create mode 100644 09_vector_retrieval/ccyyy1023/.gitignore create mode 100644 09_vector_retrieval/ccyyy1023/CMakeLists.txt create mode 100644 "09_vector_retrieval/ccyyy1023/GPU\345\220\221\351\207\217\346\243\200\347\264\242\345\274\225\346\223\216_\346\200\273\347\273\223\346\212\245\345\221\212.pdf" create mode 100644 09_vector_retrieval/ccyyy1023/README.md create mode 100644 09_vector_retrieval/ccyyy1023/REPORT.md create mode 100644 09_vector_retrieval/ccyyy1023/configs/exact.conf create mode 100644 09_vector_retrieval/ccyyy1023/configs/ivf_flat.conf create mode 100644 09_vector_retrieval/ccyyy1023/include/gvs/io.hpp create mode 100644 09_vector_retrieval/ccyyy1023/include/gvs/search.hpp create mode 100644 09_vector_retrieval/ccyyy1023/results/SMOKE_SUMMARY.md create mode 100644 09_vector_retrieval/ccyyy1023/results/SUMMARY.md create mode 100644 09_vector_retrieval/ccyyy1023/results/batch_1.json create mode 100644 09_vector_retrieval/ccyyy1023/results/batch_32.json create mode 100644 09_vector_retrieval/ccyyy1023/results/environment.txt create mode 100644 09_vector_retrieval/ccyyy1023/results/index_build.txt create mode 100644 09_vector_retrieval/ccyyy1023/results/k_1.json create mode 100644 09_vector_retrieval/ccyyy1023/results/k_10.json create mode 100644 09_vector_retrieval/ccyyy1023/results/k_100.json create mode 100644 09_vector_retrieval/ccyyy1023/results/k_50.json create mode 100644 09_vector_retrieval/ccyyy1023/results/nprobe_1.json create mode 100644 09_vector_retrieval/ccyyy1023/results/nprobe_4.json create mode 100644 09_vector_retrieval/ccyyy1023/results/nprobe_64.json create mode 100644 09_vector_retrieval/ccyyy1023/results/smoke.json create mode 100644 09_vector_retrieval/ccyyy1023/scripts/check_submission.py create mode 100644 09_vector_retrieval/ccyyy1023/scripts/run_required_benchmarks.sh create mode 100644 09_vector_retrieval/ccyyy1023/scripts/run_smoke.sh create mode 100644 09_vector_retrieval/ccyyy1023/scripts/summarize_results.py create mode 100644 09_vector_retrieval/ccyyy1023/src/cpu_search.cpp create mode 100644 09_vector_retrieval/ccyyy1023/src/file_io.cpp create mode 100644 09_vector_retrieval/ccyyy1023/src/gpu_search.cu create mode 100644 09_vector_retrieval/ccyyy1023/src/ivf_flat.cpp create mode 100644 09_vector_retrieval/ccyyy1023/src/main.cpp create mode 100644 09_vector_retrieval/ccyyy1023/tests/test_search.cpp diff --git a/09_vector_retrieval/ccyyy1023/.gitignore b/09_vector_retrieval/ccyyy1023/.gitignore new file mode 100644 index 00000000..e862c7fb --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/.gitignore @@ -0,0 +1,5 @@ +/build/ +/data/ +gvs_test_index.bin +*.tmp + diff --git a/09_vector_retrieval/ccyyy1023/CMakeLists.txt b/09_vector_retrieval/ccyyy1023/CMakeLists.txt new file mode 100644 index 00000000..bd874bac --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/CMakeLists.txt @@ -0,0 +1,39 @@ +cmake_minimum_required(VERSION 3.20) +project(gpu_vector_retrieval LANGUAGES CXX CUDA) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CUDA_STANDARD 17) +set(CMAKE_CUDA_STANDARD_REQUIRED ON) + +option(GVS_BUILD_TESTS "Build correctness tests" ON) + +find_package(CUDAToolkit REQUIRED) +find_package(OpenMP) + +add_library(gvs + src/cpu_search.cpp + src/file_io.cpp + src/ivf_flat.cpp + src/gpu_search.cu +) +target_include_directories(gvs PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) +target_link_libraries(gvs PUBLIC CUDA::cudart) +if(OpenMP_CXX_FOUND) + target_link_libraries(gvs PUBLIC OpenMP::OpenMP_CXX) +endif() +set_target_properties(gvs PROPERTIES CUDA_SEPARABLE_COMPILATION ON) +target_compile_options(gvs PRIVATE + $<$:-O3> + $<$:-O3;--use_fast_math> +) + +add_executable(vector_search src/main.cpp) +target_link_libraries(vector_search PRIVATE gvs) + +if(GVS_BUILD_TESTS) + enable_testing() + add_executable(gvs_tests tests/test_search.cpp) + target_link_libraries(gvs_tests PRIVATE gvs) + add_test(NAME gvs_correctness COMMAND gvs_tests) +endif() diff --git "a/09_vector_retrieval/ccyyy1023/GPU\345\220\221\351\207\217\346\243\200\347\264\242\345\274\225\346\223\216_\346\200\273\347\273\223\346\212\245\345\221\212.pdf" "b/09_vector_retrieval/ccyyy1023/GPU\345\220\221\351\207\217\346\243\200\347\264\242\345\274\225\346\223\216_\346\200\273\347\273\223\346\212\245\345\221\212.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..1f8fc236afb4ee8d2a9dc50142a81d9be7f04a53 GIT binary patch literal 246794 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%0A7Q? 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%0AcF1(F9f5_neR_Z) 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 gJ^%OZ?@sn023gXod5s; literal 0 HcmV?d00001 diff --git a/09_vector_retrieval/ccyyy1023/README.md b/09_vector_retrieval/ccyyy1023/README.md new file mode 100644 index 00000000..2f6ea01f --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/README.md @@ -0,0 +1,155 @@ +# GPU 向量检索引擎(CUDA) + +本项目实现了一个可独立构建的简化 GPU 向量检索引擎,面向训练营第九题。当前实现包含 CPU 精确检索参考、CUDA 批量精确检索、L2/内积、排序后的 Top-K、IVF-Flat、索引持久化、正确性测试,以及 QPS、P50/P99、recall@K、平均分数误差、显存工作区和 CPU/GPU 加速比的采集框架。 + +> 真实性声明:`results/*.json` 来自 2026-09-20 在 RTX 4090 24GB、CUDA 11.8 上的真实运行。百万规模正式矩阵覆盖 1,000,000 条 128 维向量和 1000 个查询;原始 JSON、环境记录和汇总表均随项目提交。 + +## 1. 已完成范围 + +- CPU FP32 精确检索 baseline。 +- CUDA FP32 精确检索,支持 `l2` 和 `inner_product`。 +- 批量查询,`batch_size` 可配置。 +- 任意正整数 `top_k`,已提供 K=1/10/50/100 的基准脚本。 +- Top-K 按 L2 从小到大或内积从大到小输出。 +- IVF-Flat:CPU mini-batch Lloyd 聚类、倒排桶、`nprobe` 探测、数据库常驻 GPU、按候选 ID 计算距离。 +- IVF 索引保存/加载,查询时不需要重新聚类。 +- 固定版本的二进制向量、查询、结果和 IVF 索引格式。 +- CPU/GPU 一致性测试、索引 round-trip 测试。 +- JSON 性能/质量日志与汇总脚本。 + +实现边界:基础版本仅支持 FP32;IVF 聚类、coarse search 和最终 Top-K 归并在 CPU 上完成,主要距离计算在 GPU 上完成。这个版本不声称实现了 GPU Top-K、FP16、IVF-PQ 或国产 GPU 适配。 + +## 2. 环境 + +- NVIDIA GPU +- CUDA Toolkit 11.0 或更新版本(需要 `nvcc`) +- CMake 3.20+ +- 支持 C++17 的编译器 +- Python 3.8+(仅用于日志汇总和包检查) + +推荐 Ubuntu 22.04 + CUDA 12.x。Windows 也可使用 Visual Studio 2022 的 C++ 工具链构建。 + +## 3. 构建与测试 + +```bash +cmake -S . -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build -j +ctest --test-dir build --output-on-failure +``` + +测试同时覆盖 L2、inner product、批量精确 Top-K、CPU/GPU 一致性和 IVF 索引保存/加载。 + +## 4. 五分钟 smoke test + +```bash +bash scripts/run_smoke.sh +``` + +等价的手动命令: + +```bash +mkdir -p data results +./build/vector_search generate \ + --db data/small_db.bin --queries data/small_queries.bin \ + --n 10000 --nq 100 --dim 128 --metric l2 --seed 42 + +./build/vector_search build \ + --db data/small_db.bin --index data/small_ivf.bin \ + --nlist 64 --iterations 8 --seed 42 + +./build/vector_search benchmark \ + --db data/small_db.bin --queries data/small_queries.bin \ + --index data/small_ivf.bin --log results/smoke.json \ + --k 10 --batch 32 --nlist 64 --nprobe 8 \ + --cpu-query-limit 20 --latency-query-limit 50 +``` + +## 5. 题目要求规模测试 + +以下脚本生成 `1,000,000 x 128` 向量库和 1000 个查询,测试 K=1/10/50/100、多个 batch size 和多个 nprobe。数据库约 488 MiB,索引还会额外保存一份向量数据,请预留至少 2 GiB 磁盘空间。 + +```bash +bash scripts/run_required_benchmarks.sh +python3 scripts/summarize_results.py results results/SUMMARY.md +``` + +正式测试前请关闭其他 GPU 任务,并记录:GPU 型号、驱动、CUDA 版本、CPU 型号和编译命令。脚本不会伪造或预填任何数字。 + +## 6. 文件模式 + +`configs/exact.conf` 和 `configs/ivf_flat.conf` 遵循题面参数形式: + +```text +top_k = 10 +search_mode = "ivf_flat" +batch_size = 128 +nlist = 256 +nprobe = 16 +``` + +构建一次索引并从文件加载查询: + +```bash +./build/vector_search build --db data/db.bin --index data/index.bin --nlist 256 +./build/vector_search search \ + --db data/db.bin --queries data/queries.bin \ + --params configs/ivf_flat.conf --index data/index.bin \ + --output results/search_results.bin +``` + +精确检索不使用 `--index`,但命令行解析允许保留该参数: + +```bash +./build/vector_search search \ + --db data/db.bin --queries data/queries.bin \ + --params configs/exact.conf --output results/exact_results.bin +``` + +## 7. 二进制格式 + +所有整数均为 little-endian,向量按行主序存储。 + +- 数据库:8 字节 magic `GVSDB01\0`,`uint64 n`,`uint32 dim`,`uint32 dtype`,`uint32 metric`,随后 FP32 数据。`dtype=1`,`metric=0/1` 分别表示 L2/inner product。 +- 查询:8 字节 magic `GVSQR01\0`,`uint64 nq`,`uint32 dim`,`uint32 dtype`,随后 FP32 数据。 +- 结果:8 字节 magic `GVSRS01\0`,`uint64 nq`,`uint32 k`,随后每个结果的 `int64 id + float score`。 +- IVF 索引:版本化 magic、形状/度量、聚类中心、原始 FP32 向量和倒排表。加载时会验证 header、总 ID 数和 ID 范围。 + +## 8. 指标定义 + +- `QPS = 查询数 / 查询时间`。精确检索计时包含 query H2D、CUDA 距离计算、distance D2H 和 CPU Top-K,不包含数据库首次上传;IVF 计时还包含 CPU coarse search、候选 ID 构造和一次数据库 H2D,索引文件加载不计入。 +- P50/P99:逐 query、batch=1 的端到端延迟分位数。 +- `recall@K`:近似结果与 GPU 精确结果 Top-K ID 集合的平均交集比例。 +- `mean_rank_score_error`:近似结果和精确结果在相同排名位置的距离/相似度绝对误差平均值。 +- `workspace_mib`:程序显式分配的数据库、query 和 distance buffer 总量估计,不包含 CUDA context/驱动开销。 +- CPU/GPU speedup:CPU 单 query 平均时间除以 GPU 批量查询的单 query 平均时间。CPU 默认只测前 20 个 query,并在日志中明确记录样本数。 + +## 9. 设计说明 + +精确检索 kernel 使用二维 grid:x 维覆盖数据库向量,y 维覆盖 batch 内 query。每个线程顺序归约一个向量的 128 个维度,行主序布局使相邻线程访问相邻向量。L2 使用 `fmaf(diff, diff, acc)`,内积内部取负数以复用升序 Top-K。 + +IVF-Flat 用 mini-batch Lloyd 方法训练聚类中心,随后将每条向量分配到最近中心。查询先计算 coarse centroid 距离,选择 `nprobe` 个桶,只打包这些桶中的 FP32 原向量并调用同一 CUDA 精确距离路径。索引文件保存中心、向量与倒排表,因此查询过程无需重新训练或分桶。 + +当前 Top-K 在 CPU 使用 `std::partial_sort`,这样实现简单且可作为后续 GPU Top-K 的稳定参照。性能报告应如实讨论 D2H 距离传输和 CPU 归并的开销。 + +## 10. 目录 + +```text +. +├── CMakeLists.txt +├── README.md +├── REPORT.md +├── configs/ +├── include/gvs/ +├── results/ +├── scripts/ +├── src/ +└── tests/ +``` + +## 11. 提交 + +1. Fork `InfiniTensor/Learning-CUDA`。 +2. 基于 `2026-summer-project` 分支工作。 +3. 将本目录完整复制到 `09_vector_retrieval/ccyyy1023/`(若实际 ID 不同,只改这一层目录名)。 +4. 保留 `results/` 中的真实日志;如换硬件复测,请用新日志替换并同步更新 `REPORT.md`。 +5. Commit、push,然后向上游 `2026-summer-project` 发起 PR;官网提交 fork 仓库链接和 commit 链接。 diff --git a/09_vector_retrieval/ccyyy1023/REPORT.md b/09_vector_retrieval/ccyyy1023/REPORT.md new file mode 100644 index 00000000..b283b592 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/REPORT.md @@ -0,0 +1,127 @@ +# GPU 向量检索引擎(CUDA)总结报告 + +> 状态:已在 NVIDIA GeForce RTX 4090 24GB 上完成 Release 构建、正确性测试和百万规模性能矩阵。表中数字均来自 `results/*.json`,未使用估算或示例值。 + +## 1. 问题描述 + +本项目面向 RAG、推荐系统和多模态检索中的 Top-K 向量搜索。给定 N 条 D 维数据库向量和一批查询向量,系统返回 L2 距离最小或内积最大的 K 条记录。精确搜索复杂度为 O(ND),可以作为正确性基准;IVF-Flat 通过 coarse quantization 只访问部分倒排桶,以召回率换取吞吐和延迟。 + +## 2. 完成内容 + +项目实现 CPU 精确 baseline、CUDA 精确距离计算、批量查询、排序 Top-K、L2/内积、IVF-Flat 索引、索引保存与加载、二进制输入输出、正确性测试和统一指标日志。支持任意正整数 K,正式脚本覆盖 K=1、10、50、100。 + +基础实现使用 FP32。IVF 聚类、coarse search 和最终 Top-K 在 CPU 完成,数据库常驻 GPU,候选 ID 上传后由 CUDA kernel 读取原始向量并计算距离。本项目未实现 IVF-PQ、GPU Top-K、FP16 或国产 GPU 适配,不将这些未完成项写成已完成。 + +## 3. 数据布局与文件格式 + +数据库和查询采用 row-major 连续 FP32 数组。相邻 CUDA 线程处理相邻向量;固定维度循环中,相邻线程的全局内存访问存在跨向量步长。此布局与题目文件定义一致,容易验证和落盘,但不是所有维度下最理想的 coalescing 布局。后续可尝试转置或 tiled layout。 + +文件带 8 字节 magic 和版本号,并固定整数字段宽度。IVF 索引文件保存聚类中心、原始向量和倒排列表;加载时校验形状、总 ID 数和 ID 范围,避免每次查询重新训练。 + +## 4. 精确检索算法 + +CPU 参考实现逐 query 计算所有距离,并用 `std::partial_sort` 得到排序 Top-K。CUDA kernel 使用二维 grid,一维覆盖 N 条候选,一维覆盖 batch。一个线程累加一个 query-vector pair 的 D 个维度,L2 和 inner product 均使用 `fmaf`。内积取负后复用升序排序逻辑,输出时恢复真实相似度。 + +GPU 结果将距离复制回主机,在 CPU 完成 Top-K。这是当前版本最明确的性能边界:距离阶段在 GPU,但 distance D2H 与 CPU partial sort 仍可能成为瓶颈。 + +## 5. IVF-Flat + +### 5.1 建索引 + +1. 从数据库随机选取初始中心。 +2. 使用有固定上限的 mini-batch Lloyd 迭代更新中心,避免百万规模训练遍历成本失控。 +3. 将全部向量分配给最近中心,建立倒排桶。 +4. 保存中心、数据库向量和每个桶的原始 ID。 + +### 5.2 查询 + +1. 在 CPU 计算 query 与所有 coarse centroid 的距离。 +2. 选取最近的 `nprobe` 个桶。 +3. 仅把候选 ID 传入 GPU,数据库在一次 IVF 查询过程中常驻显存。 +4. CUDA kernel 按 ID 读取原始向量并计算精确距离。 +5. CPU Top-K 归并并映射回原始 ID。 + +`nprobe` 越大,通常 recall@K 越高,但候选数、延迟和工作区也更大。正式脚本测试 1、4、16、64 四档。 + +## 6. 正确性验证 + +自动测试覆盖非 2 的幂维度 D=33,以避免只在整齐 shape 下通过;分别验证 L2 和 inner product。精确 GPU 与 CPU 的 Top-K ID 集合要求完全一致,分数误差容限为 2e-3。另有 clustered synthetic data 的 IVF 索引 round-trip 测试,要求 recall@10 不低于 0.90。 + +| 检查项 | 当前结果 | +|---|---| +| CMake Release 构建 | 通过 | +| `ctest` | 1/1 通过(0.34 s) | +| CPU vs GPU exact recall@K | 1.000000 | +| L2 Top-K/分数测试 | 通过(容限 2e-3) | +| Inner product Top-K/分数测试 | 通过(容限 2e-3) | +| IVF save/load | 通过 | + +## 7. 实验设置 + +| 项目 | 值 | +|---|---| +| GPU | NVIDIA GeForce RTX 4090 | +| GPU 显存 | 24,564 MiB | +| CPU | Intel Xeon Platinum 8352V @ 2.10 GHz,16 vCPU | +| OS | Ubuntu 22.04 / Linux 5.15.0-91-generic | +| NVIDIA Driver | 580.95.05 | +| CUDA Toolkit / nvcc | 11.8 / V11.8.89 | +| 编译器 / CMake | G++ 11.3.0 / CMake 3.22.1 | +| 编译类型 | Release (`-O3`, CUDA `--use_fast_math`) | +| 数据规模 | 1,000,000 x 128,1000 queries | +| 随机种子 | 42 | + +正式计时关闭了其他 GPU 任务。精确 QPS 包含 query H2D、CUDA 距离、distance D2H 和 CPU Top-K,不包含数据库首次上传;IVF QPS 还包含 CPU coarse search、候选 ID 构造和一次数据库 H2D。两者都不包含索引文件加载。P50/P99 用 batch=1 的逐 query 精确查询时间。显存字段是程序显式 buffer 大小,不包含 CUDA context。 + +## 8. 性能与质量结果 + +### 8.1 精确检索与 K + +| K | Batch | QPS | P50 (ms) | P99 (ms) | CPU/GPU 加速比 | CPU/GPU recall@K | 工作区 MiB | +|---:|---:|---:|---:|---:|---:|---:|---:| +| 1 | 128 | 263.571 | 4.622 | 6.801 | 42.444x | 1.000000 | 976.625 | +| 10 | 128 | 261.783 | 4.650 | 6.038 | 42.262x | 1.000000 | 976.625 | +| 50 | 128 | 274.503 | 4.281 | 5.897 | 42.709x | 1.000000 | 976.625 | +| 100 | 128 | 255.570 | 4.402 | 5.988 | 40.381x | 1.000000 | 976.625 | + +### 8.2 Batch size + +| Batch | QPS | P50 (ms) | P99 (ms) | 工作区 MiB | +|---:|---:|---:|---:|---:| +| 1 | 231.165 | 4.391 | 6.144 | 492.096 | +| 32 | 276.272 | 4.874 | 6.491 | 610.367 | +| 128 | 261.783 | 4.650 | 6.038 | 976.625 | + +### 8.3 IVF nprobe + +| nlist | nprobe | QPS | recall@10 | 平均排名分数误差 | 工作区 MiB | +|---:|---:|---:|---:|---:|---:| +| 256 | 1 | 3509.281 | 0.059600 | 14.431664 | 488.390 | +| 256 | 4 | 1986.191 | 0.182900 | 8.026410 | 488.680 | +| 256 | 16 | 595.972 | 0.472900 | 3.293365 | 489.774 | +| 256 | 64 | 153.481 | 0.937800 | 0.272549 | 493.920 | + +## 9. 结果分析 + +batch=32 在本次运行中取得最高精确检索吞吐 276.272 QPS,比 batch=1 的 231.165 QPS 高约 19.5%;batch=128 未继续提升,说明更大的 distance buffer 和 CPU Top-K 并未带来额外收益。P50/P99 都在约 4.3-6.5 ms 范围内,差异接近单次运行波动。 + +K 从 1 增加到 100 后,精确 QPS 仍处于 255-275 区间,未呈严格单调下降;GPU 距离计算和 1000x1000000 距离传输仍是主要固定成本,CPU `partial_sort` 的额外开销没有压倒该成本。所有 K 配置的 CPU/GPU exact recall 均为 1.0。 + +IVF 展示了清晰的速度-质量权衡:nprobe=1 达到 3509.281 QPS,但 recall@10 仅 0.0596;nprobe=16 为 595.972 QPS、recall@10=0.4729;nprobe=64 达到 0.9378 recall@10,但吞吐降至 153.481 QPS,低于精确检索 261.783 QPS。若重视质量,本实现的 nprobe=64 已没有速度优势;这说明 coarse quality、索引布局和 GPU Top-K 仍需优化。 + +索引构建耗时 4391.59 ms。工作区指标为程序显式 buffer 估算:精确 batch=128 为 976.625 MiB,IVF 随 nprobe 从约 488.390 MiB 增至 493.920 MiB;它不包含 CUDA context 与驱动开销。 + +## 10. 优化历程与已知瓶颈 + +初版选择统一的“距离越小越好”内部表示,使 L2 和内积复用相同 Top-K 逻辑;同时采用 batch distance matrix,避免逐 query 启动 kernel。第一版 IVF 会在 CPU 按 ID 打包候选向量并逐 query 上传,端到端 nprobe=16 仅约 11 QPS。定位后改为数据库一次上传并常驻 GPU、每次只传候选 ID,最终 nprobe=16 达到 595.972 QPS,召回率保持 0.4729。这一修改约提升 52 倍,并保留版本化索引加载。 + +当前主要瓶颈包括:每个线程独立扫描维度、精确检索 distance matrix 的 D2H 传输、CPU `partial_sort`、IVF 的 CPU coarse search,以及候选 ID 的随机访存。服务器没有安装 `ncu`/`nsys`,因此报告不虚构 profiler 结论。 + +## 11. 后续工作 + +- 使用 CUB block radix sort 或分层 heap 实现 GPU Top-K 与跨 block merge。 +- 将数据库转为 tiled/转置布局,改善 warp 访存合并。 +- 用 CUDA kernel 完成 IVF assignment 和 coarse search。 +- 数据库与索引常驻 GPU,并用 pinned memory、stream 和 double buffering 重叠传输。 +- 支持 FP16、cosine、IVF-PQ 和多 GPU shard。 +- 使用 `ncu` 检查 memory throughput、occupancy、warp stall;使用 `nsys` 分析 H2D/kernel/D2H/CPU merge 时间线。 diff --git a/09_vector_retrieval/ccyyy1023/configs/exact.conf b/09_vector_retrieval/ccyyy1023/configs/exact.conf new file mode 100644 index 00000000..23898f96 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/configs/exact.conf @@ -0,0 +1,6 @@ +top_k = 10 +search_mode = "exact" +batch_size = 128 +nlist = 256 +nprobe = 16 + diff --git a/09_vector_retrieval/ccyyy1023/configs/ivf_flat.conf b/09_vector_retrieval/ccyyy1023/configs/ivf_flat.conf new file mode 100644 index 00000000..a5e4b718 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/configs/ivf_flat.conf @@ -0,0 +1,6 @@ +top_k = 10 +search_mode = "ivf_flat" +batch_size = 128 +nlist = 256 +nprobe = 16 + diff --git a/09_vector_retrieval/ccyyy1023/include/gvs/io.hpp b/09_vector_retrieval/ccyyy1023/include/gvs/io.hpp new file mode 100644 index 00000000..2b5618b2 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/include/gvs/io.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include "gvs/search.hpp" + +#include +#include +#include +#include + +namespace gvs { + +struct VectorFile { + std::size_t count = 0; + std::size_t dim = 0; + Metric metric = Metric::L2; + std::vector values; +}; + +struct Parameters { + std::size_t top_k = 10; + std::string search_mode = "exact"; + std::size_t batch_size = 128; + std::size_t nlist = 4096; + std::size_t nprobe = 16; +}; + +void write_vector_file(const std::string& path, const VectorFile& data, + bool include_metric); +VectorFile read_vector_file(const std::string& path, bool expect_metric); +void write_search_result(const std::string& path, const SearchResult& result); +Parameters read_parameters(const std::string& path); + +} // namespace gvs + diff --git a/09_vector_retrieval/ccyyy1023/include/gvs/search.hpp b/09_vector_retrieval/ccyyy1023/include/gvs/search.hpp new file mode 100644 index 00000000..d1becb62 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/include/gvs/search.hpp @@ -0,0 +1,78 @@ +#pragma once + +#include +#include +#include +#include + +namespace gvs { + +enum class Metric { L2, InnerProduct }; + +struct SearchConfig { + std::size_t k = 10; + std::size_t batch_size = 16; +}; + +struct SearchResult { + std::size_t queries = 0; + std::size_t k = 0; + std::vector ids; + std::vector scores; +}; + +struct GpuStats { + double elapsed_ms = 0.0; + std::size_t peak_workspace_bytes = 0; + std::string device_name; +}; + +SearchResult cpu_exact_search(const std::vector& database, + const std::vector& queries, + std::size_t n, std::size_t nq, + std::size_t dim, Metric metric, + std::size_t k); + +SearchResult gpu_exact_search(const std::vector& database, + const std::vector& queries, + std::size_t n, std::size_t nq, + std::size_t dim, Metric metric, + const SearchConfig& config, + GpuStats* stats = nullptr); + +SearchResult gpu_indexed_search(const std::vector& database, + const std::vector& queries, + const std::vector>& candidate_ids, + std::size_t n, std::size_t nq, + std::size_t dim, Metric metric, + const SearchConfig& config, + GpuStats* stats = nullptr); + +double recall_at_k(const SearchResult& truth, const SearchResult& candidate); + +class IvfFlatIndex { +public: + IvfFlatIndex(std::size_t dim, std::size_t nlist, Metric metric); + + void train(const std::vector& database, std::size_t n, + std::size_t iterations = 12, std::uint64_t seed = 42); + void add(const std::vector& database, std::size_t n); + SearchResult search(const std::vector& queries, std::size_t nq, + std::size_t nprobe, const SearchConfig& config, + GpuStats* stats = nullptr) const; + + void save(const std::string& path) const; + static IvfFlatIndex load(const std::string& path); + + std::size_t nlist() const { return nlist_; } + +private: + std::size_t dim_; + std::size_t nlist_; + Metric metric_; + std::vector centroids_; + std::vector database_; + std::vector> lists_; +}; + +} // namespace gvs diff --git a/09_vector_retrieval/ccyyy1023/results/SMOKE_SUMMARY.md b/09_vector_retrieval/ccyyy1023/results/SMOKE_SUMMARY.md new file mode 100644 index 00000000..3cd570ae --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/results/SMOKE_SUMMARY.md @@ -0,0 +1,5 @@ +# Measured benchmark summary + +| log | GPU | N | NQ | D | K | exact QPS | P50 ms | P99 ms | exact recall | speedup | nprobe | IVF QPS | IVF recall | mean rank score error | +|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| +| smoke.json | NVIDIA GeForce RTX 4090 | 10000 | 100 | 128 | 10 | 16118.163 | 0.081 | 0.084 | 1.000000 | 21.021 | 8 | 21150.489 | 0.371000 | 6.098108 | diff --git a/09_vector_retrieval/ccyyy1023/results/SUMMARY.md b/09_vector_retrieval/ccyyy1023/results/SUMMARY.md new file mode 100644 index 00000000..96e659da --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/results/SUMMARY.md @@ -0,0 +1,14 @@ +# Measured benchmark summary + +| log | GPU | N | NQ | D | K | exact QPS | P50 ms | P99 ms | exact recall | speedup | nprobe | IVF QPS | IVF recall | mean rank score error | +|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| +| batch_1.json | NVIDIA GeForce RTX 4090 | 1000000 | 1000 | 128 | 10 | 231.165 | 4.391 | 6.144 | 1.000000 | 36.857 | 16 | 585.657 | 0.472900 | 3.293365 | +| batch_32.json | NVIDIA GeForce RTX 4090 | 1000000 | 1000 | 128 | 10 | 276.272 | 4.874 | 6.491 | 1.000000 | 43.956 | 16 | 590.492 | 0.472900 | 3.293365 | +| k_1.json | NVIDIA GeForce RTX 4090 | 1000000 | 1000 | 128 | 1 | 263.571 | 4.622 | 6.801 | 1.000000 | 42.444 | 16 | 562.764 | 0.507000 | 2.678481 | +| k_10.json | NVIDIA GeForce RTX 4090 | 1000000 | 1000 | 128 | 10 | 261.783 | 4.650 | 6.038 | 1.000000 | 42.262 | 16 | 595.972 | 0.472900 | 3.293365 | +| k_100.json | NVIDIA GeForce RTX 4090 | 1000000 | 1000 | 128 | 100 | 255.570 | 4.402 | 5.988 | 1.000000 | 40.381 | 16 | 545.980 | 0.435290 | 4.288385 | +| k_50.json | NVIDIA GeForce RTX 4090 | 1000000 | 1000 | 128 | 50 | 274.503 | 4.281 | 5.897 | 1.000000 | 42.709 | 16 | 550.537 | 0.449600 | 3.925203 | +| nprobe_1.json | NVIDIA GeForce RTX 4090 | 1000000 | 1000 | 128 | 10 | 233.112 | 4.454 | 6.053 | 1.000000 | 43.759 | 1 | 3509.281 | 0.059600 | 14.431664 | +| nprobe_4.json | NVIDIA GeForce RTX 4090 | 1000000 | 1000 | 128 | 10 | 244.722 | 4.357 | 6.802 | 1.000000 | 38.676 | 4 | 1986.191 | 0.182900 | 8.026410 | +| nprobe_64.json | NVIDIA GeForce RTX 4090 | 1000000 | 1000 | 128 | 10 | 259.653 | 4.138 | 5.862 | 1.000000 | 42.469 | 64 | 153.481 | 0.937800 | 0.272549 | +| smoke.json | NVIDIA GeForce RTX 4090 | 10000 | 100 | 128 | 10 | 16118.163 | 0.081 | 0.084 | 1.000000 | 21.021 | 8 | 21150.489 | 0.371000 | 6.098108 | diff --git a/09_vector_retrieval/ccyyy1023/results/batch_1.json b/09_vector_retrieval/ccyyy1023/results/batch_1.json new file mode 100644 index 00000000..546e24ea --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/results/batch_1.json @@ -0,0 +1,8 @@ +{ + "status": "measured", + "device": "NVIDIA GeForce RTX 4090", + "dataset": {"n": 1000000, "nq": 1000, "dim": 128, "k": 10}, + "exact": {"query_ms": 4325.907430, "qps": 231.165372, "p50_ms": 4.391250, "p99_ms": 6.144444, "workspace_mib": 492.096436, "cpu_gpu_recall_at_k": 1.000000, "speedup_vs_cpu": 36.857411}, + "cpu": {"queries_measured": 20, "query_ms": 3188.834950}, + "ivf_flat": {"index_build_ms": 0.000000, "query_ms": 1707.485259, "qps": 585.656593, "nlist": 256, "nprobe": 16, "recall_at_k": 0.472900, "mean_rank_score_error": 3.293365, "workspace_mib": 489.773682} +} diff --git a/09_vector_retrieval/ccyyy1023/results/batch_32.json b/09_vector_retrieval/ccyyy1023/results/batch_32.json new file mode 100644 index 00000000..de774f01 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/results/batch_32.json @@ -0,0 +1,8 @@ +{ + "status": "measured", + "device": "NVIDIA GeForce RTX 4090", + "dataset": {"n": 1000000, "nq": 1000, "dim": 128, "k": 10}, + "exact": {"query_ms": 3619.621729, "qps": 276.271963, "p50_ms": 4.873504, "p99_ms": 6.491380, "workspace_mib": 610.367188, "cpu_gpu_recall_at_k": 1.000000, "speedup_vs_cpu": 43.956197}, + "cpu": {"queries_measured": 20, "query_ms": 3182.096116}, + "ivf_flat": {"index_build_ms": 0.000000, "query_ms": 1693.504089, "qps": 590.491636, "nlist": 256, "nprobe": 16, "recall_at_k": 0.472900, "mean_rank_score_error": 3.293365, "workspace_mib": 489.773682} +} diff --git a/09_vector_retrieval/ccyyy1023/results/environment.txt b/09_vector_retrieval/ccyyy1023/results/environment.txt new file mode 100644 index 00000000..92569c74 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/results/environment.txt @@ -0,0 +1,7 @@ +Measured: 2026-09-20 Asia/Shanghai +Model name: Intel(R) Xeon(R) Platinum 8352V CPU @ 2.10GHz +NVIDIA GeForce RTX 4090, 24564 MiB, 580.95.05 +Build cuda_11.8.r11.8/compiler.31833905_0 +cmake version 3.22.1 +g++ (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 +Linux 5.15.0-91-generic diff --git a/09_vector_retrieval/ccyyy1023/results/index_build.txt b/09_vector_retrieval/ccyyy1023/results/index_build.txt new file mode 100644 index 00000000..cbdd0605 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/results/index_build.txt @@ -0,0 +1 @@ +index_build_ms=4391.59 diff --git a/09_vector_retrieval/ccyyy1023/results/k_1.json b/09_vector_retrieval/ccyyy1023/results/k_1.json new file mode 100644 index 00000000..7cd813e2 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/results/k_1.json @@ -0,0 +1,8 @@ +{ + "status": "measured", + "device": "NVIDIA GeForce RTX 4090", + "dataset": {"n": 1000000, "nq": 1000, "dim": 128, "k": 1}, + "exact": {"query_ms": 3794.049961, "qps": 263.570594, "p50_ms": 4.621565, "p99_ms": 6.800636, "workspace_mib": 976.625000, "cpu_gpu_recall_at_k": 1.000000, "speedup_vs_cpu": 42.443584}, + "cpu": {"queries_measured": 20, "query_ms": 3220.661527}, + "ivf_flat": {"index_build_ms": 0.000000, "query_ms": 1776.944915, "qps": 562.763647, "nlist": 256, "nprobe": 16, "recall_at_k": 0.507000, "mean_rank_score_error": 2.678481, "workspace_mib": 489.773682} +} diff --git a/09_vector_retrieval/ccyyy1023/results/k_10.json b/09_vector_retrieval/ccyyy1023/results/k_10.json new file mode 100644 index 00000000..0590c67e --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/results/k_10.json @@ -0,0 +1,8 @@ +{ + "status": "measured", + "device": "NVIDIA GeForce RTX 4090", + "dataset": {"n": 1000000, "nq": 1000, "dim": 128, "k": 10}, + "exact": {"query_ms": 3819.959462, "qps": 261.782883, "p50_ms": 4.650455, "p99_ms": 6.037778, "workspace_mib": 976.625000, "cpu_gpu_recall_at_k": 1.000000, "speedup_vs_cpu": 42.261559}, + "cpu": {"queries_measured": 20, "query_ms": 3228.748869}, + "ivf_flat": {"index_build_ms": 0.000000, "query_ms": 1677.930929, "qps": 595.972088, "nlist": 256, "nprobe": 16, "recall_at_k": 0.472900, "mean_rank_score_error": 3.293365, "workspace_mib": 489.773682} +} diff --git a/09_vector_retrieval/ccyyy1023/results/k_100.json b/09_vector_retrieval/ccyyy1023/results/k_100.json new file mode 100644 index 00000000..7602d850 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/results/k_100.json @@ -0,0 +1,8 @@ +{ + "status": "measured", + "device": "NVIDIA GeForce RTX 4090", + "dataset": {"n": 1000000, "nq": 1000, "dim": 128, "k": 100}, + "exact": {"query_ms": 3912.828840, "qps": 255.569574, "p50_ms": 4.402323, "p99_ms": 5.987935, "workspace_mib": 976.625000, "cpu_gpu_recall_at_k": 1.000000, "speedup_vs_cpu": 40.380501}, + "cpu": {"queries_measured": 20, "query_ms": 3160.039780}, + "ivf_flat": {"index_build_ms": 0.000000, "query_ms": 1831.570234, "qps": 545.979609, "nlist": 256, "nprobe": 16, "recall_at_k": 0.435290, "mean_rank_score_error": 4.288385, "workspace_mib": 489.773682} +} diff --git a/09_vector_retrieval/ccyyy1023/results/k_50.json b/09_vector_retrieval/ccyyy1023/results/k_50.json new file mode 100644 index 00000000..37725b99 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/results/k_50.json @@ -0,0 +1,8 @@ +{ + "status": "measured", + "device": "NVIDIA GeForce RTX 4090", + "dataset": {"n": 1000000, "nq": 1000, "dim": 128, "k": 50}, + "exact": {"query_ms": 3642.950502, "qps": 274.502769, "p50_ms": 4.280817, "p99_ms": 5.896796, "workspace_mib": 976.625000, "cpu_gpu_recall_at_k": 1.000000, "speedup_vs_cpu": 42.708571}, + "cpu": {"queries_measured": 20, "query_ms": 3111.704184}, + "ivf_flat": {"index_build_ms": 0.000000, "query_ms": 1816.408478, "qps": 550.536959, "nlist": 256, "nprobe": 16, "recall_at_k": 0.449600, "mean_rank_score_error": 3.925203, "workspace_mib": 489.773682} +} diff --git a/09_vector_retrieval/ccyyy1023/results/nprobe_1.json b/09_vector_retrieval/ccyyy1023/results/nprobe_1.json new file mode 100644 index 00000000..8ee126a1 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/results/nprobe_1.json @@ -0,0 +1,8 @@ +{ + "status": "measured", + "device": "NVIDIA GeForce RTX 4090", + "dataset": {"n": 1000000, "nq": 1000, "dim": 128, "k": 10}, + "exact": {"query_ms": 4289.785030, "qps": 233.111914, "p50_ms": 4.453786, "p99_ms": 6.053339, "workspace_mib": 976.625000, "cpu_gpu_recall_at_k": 1.000000, "speedup_vs_cpu": 43.759387}, + "cpu": {"queries_measured": 20, "query_ms": 3754.367282}, + "ivf_flat": {"index_build_ms": 0.000000, "query_ms": 284.958634, "qps": 3509.281280, "nlist": 256, "nprobe": 1, "recall_at_k": 0.059600, "mean_rank_score_error": 14.431664, "workspace_mib": 488.388565} +} diff --git a/09_vector_retrieval/ccyyy1023/results/nprobe_4.json b/09_vector_retrieval/ccyyy1023/results/nprobe_4.json new file mode 100644 index 00000000..0e4875b0 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/results/nprobe_4.json @@ -0,0 +1,8 @@ +{ + "status": "measured", + "device": "NVIDIA GeForce RTX 4090", + "dataset": {"n": 1000000, "nq": 1000, "dim": 128, "k": 10}, + "exact": {"query_ms": 4086.269341, "qps": 244.721999, "p50_ms": 4.357081, "p99_ms": 6.801751, "workspace_mib": 976.625000, "cpu_gpu_recall_at_k": 1.000000, "speedup_vs_cpu": 38.676046}, + "cpu": {"queries_measured": 20, "query_ms": 3160.814839}, + "ivf_flat": {"index_build_ms": 0.000000, "query_ms": 503.476214, "qps": 1986.191149, "nlist": 256, "nprobe": 4, "recall_at_k": 0.182900, "mean_rank_score_error": 8.026410, "workspace_mib": 488.679054} +} diff --git a/09_vector_retrieval/ccyyy1023/results/nprobe_64.json b/09_vector_retrieval/ccyyy1023/results/nprobe_64.json new file mode 100644 index 00000000..aebd6520 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/results/nprobe_64.json @@ -0,0 +1,8 @@ +{ + "status": "measured", + "device": "NVIDIA GeForce RTX 4090", + "dataset": {"n": 1000000, "nq": 1000, "dim": 128, "k": 10}, + "exact": {"query_ms": 3851.290919, "qps": 259.653197, "p50_ms": 4.137849, "p99_ms": 5.861579, "workspace_mib": 976.625000, "cpu_gpu_recall_at_k": 1.000000, "speedup_vs_cpu": 42.469173}, + "cpu": {"queries_measured": 20, "query_ms": 3271.222801}, + "ivf_flat": {"index_build_ms": 0.000000, "query_ms": 6515.475806, "qps": 153.480733, "nlist": 256, "nprobe": 64, "recall_at_k": 0.937800, "mean_rank_score_error": 0.272549, "workspace_mib": 493.922852} +} diff --git a/09_vector_retrieval/ccyyy1023/results/smoke.json b/09_vector_retrieval/ccyyy1023/results/smoke.json new file mode 100644 index 00000000..b9bea0d1 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/results/smoke.json @@ -0,0 +1,8 @@ +{ + "status": "measured", + "device": "NVIDIA GeForce RTX 4090", + "dataset": {"n": 10000, "nq": 100, "dim": 128, "k": 10}, + "exact": {"query_ms": 6.204181, "qps": 16118.162897, "p50_ms": 0.081473, "p99_ms": 0.084174, "workspace_mib": 6.119141, "cpu_gpu_recall_at_k": 1.000000, "speedup_vs_cpu": 21.021299}, + "cpu": {"queries_measured": 20, "query_ms": 26.083989}, + "ivf_flat": {"index_build_ms": 0.000000, "query_ms": 4.728023, "qps": 21150.489327, "nlist": 64, "nprobe": 8, "recall_at_k": 0.371000, "mean_rank_score_error": 6.098108, "workspace_mib": 0.998459} +} diff --git a/09_vector_retrieval/ccyyy1023/scripts/check_submission.py b/09_vector_retrieval/ccyyy1023/scripts/check_submission.py new file mode 100644 index 00000000..3c40c03b --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/scripts/check_submission.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +"""Static submission check that does not require CUDA.""" + +import json +import pathlib +import sys + + +REQUIRED = [ + "CMakeLists.txt", + "README.md", + "REPORT.md", + "include/gvs/search.hpp", + "include/gvs/io.hpp", + "src/cpu_search.cpp", + "src/gpu_search.cu", + "src/ivf_flat.cpp", + "src/file_io.cpp", + "src/main.cpp", + "tests/test_search.cpp", + "configs/exact.conf", + "configs/ivf_flat.conf", + "results/SUMMARY.md", + "results/environment.txt", +] + + +def main() -> int: + root = pathlib.Path(__file__).resolve().parents[1] + missing = [name for name in REQUIRED if not (root / name).is_file()] + if missing: + print("missing files:", *missing, sep="\n- ", file=sys.stderr) + return 1 + logs = [json.loads(path.read_text(encoding="utf-8")) + for path in (root / "results").glob("*.json")] + if not logs or not all(item.get("status") == "measured" for item in logs): + print("all submitted JSON logs must be real measured runs", file=sys.stderr) + return 1 + forbidden = ["TODO: fake", "RTX 4090: 999", "speedup: 100x"] + text = "\n".join((root / name).read_text(encoding="utf-8", errors="replace") + for name in REQUIRED if name.endswith((".md", ".cpp", ".cu", ".hpp"))) + if any(token in text for token in forbidden): + print("found forbidden fabricated marker", file=sys.stderr) + return 1 + print(f"submission structure OK ({len(REQUIRED)} required files)") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/09_vector_retrieval/ccyyy1023/scripts/run_required_benchmarks.sh b/09_vector_retrieval/ccyyy1023/scripts/run_required_benchmarks.sh new file mode 100644 index 00000000..bf17803b --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/scripts/run_required_benchmarks.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +set -euo pipefail + +project_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$project_dir" +mkdir -p data results + +cmake -S . -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build -j"$(nproc)" +ctest --test-dir build --output-on-failure + +if [[ ! -f data/required_db.bin || ! -f data/required_queries.bin ]]; then + ./build/vector_search generate \ + --db data/required_db.bin --queries data/required_queries.bin \ + --n 1000000 --nq 1000 --dim 128 --metric l2 --seed 42 +fi + +if [[ ! -f data/required_ivf.bin ]]; then + ./build/vector_search build \ + --db data/required_db.bin --index data/required_ivf.bin \ + --nlist 256 --iterations 8 --seed 42 | tee results/index_build.txt +fi + +for k in 1 10 50 100; do + ./build/vector_search benchmark \ + --db data/required_db.bin --queries data/required_queries.bin \ + --index data/required_ivf.bin --log "results/k_${k}.json" \ + --k "$k" --batch 128 --nlist 256 --nprobe 16 \ + --cpu-query-limit 20 --latency-query-limit 100 +done + +for batch in 1 32; do + ./build/vector_search benchmark \ + --db data/required_db.bin --queries data/required_queries.bin \ + --index data/required_ivf.bin --log "results/batch_${batch}.json" \ + --k 10 --batch "$batch" --nlist 256 --nprobe 16 \ + --cpu-query-limit 20 --latency-query-limit 100 +done + +for nprobe in 1 4 64; do + ./build/vector_search benchmark \ + --db data/required_db.bin --queries data/required_queries.bin \ + --index data/required_ivf.bin --log "results/nprobe_${nprobe}.json" \ + --k 10 --batch 128 --nlist 256 --nprobe "$nprobe" \ + --cpu-query-limit 20 --latency-query-limit 100 +done + +python3 scripts/summarize_results.py results results/SUMMARY.md +echo "Required benchmark complete: results/SUMMARY.md" + diff --git a/09_vector_retrieval/ccyyy1023/scripts/run_smoke.sh b/09_vector_retrieval/ccyyy1023/scripts/run_smoke.sh new file mode 100644 index 00000000..1cb2e1e9 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/scripts/run_smoke.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +set -euo pipefail + +project_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$project_dir" + +cmake -S . -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build -j"$(nproc)" +ctest --test-dir build --output-on-failure + +mkdir -p data results +./build/vector_search generate \ + --db data/small_db.bin --queries data/small_queries.bin \ + --n 10000 --nq 100 --dim 128 --metric l2 --seed 42 +./build/vector_search build \ + --db data/small_db.bin --index data/small_ivf.bin \ + --nlist 64 --iterations 8 --seed 42 +./build/vector_search benchmark \ + --db data/small_db.bin --queries data/small_queries.bin \ + --index data/small_ivf.bin --log results/smoke.json \ + --k 10 --batch 32 --nlist 64 --nprobe 8 \ + --cpu-query-limit 20 --latency-query-limit 50 + +python3 scripts/summarize_results.py results results/SMOKE_SUMMARY.md +echo "Smoke test complete: results/SMOKE_SUMMARY.md" + diff --git a/09_vector_retrieval/ccyyy1023/scripts/summarize_results.py b/09_vector_retrieval/ccyyy1023/scripts/summarize_results.py new file mode 100644 index 00000000..95462aa1 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/scripts/summarize_results.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +"""Collect measured benchmark JSON files into a compact Markdown table.""" + +import json +import pathlib +import sys + + +def main() -> int: + if len(sys.argv) != 3: + print("usage: summarize_results.py RESULTS_DIR OUTPUT.md", file=sys.stderr) + return 2 + results_dir = pathlib.Path(sys.argv[1]) + output = pathlib.Path(sys.argv[2]) + rows = [] + for path in sorted(results_dir.glob("*.json")): + data = json.loads(path.read_text(encoding="utf-8")) + if data.get("status") != "measured": + continue + ds = data["dataset"] + exact = data["exact"] + ivf = data["ivf_flat"] + rows.append( + [ + path.name, + data.get("device", ""), + ds["n"], + ds["nq"], + ds["dim"], + ds["k"], + f"{exact['qps']:.3f}", + f"{exact['p50_ms']:.3f}", + f"{exact['p99_ms']:.3f}", + f"{exact['cpu_gpu_recall_at_k']:.6f}", + f"{exact['speedup_vs_cpu']:.3f}", + ivf["nprobe"], + f"{ivf['qps']:.3f}", + f"{ivf['recall_at_k']:.6f}", + f"{ivf['mean_rank_score_error']:.6f}", + ] + ) + header = [ + "log", "GPU", "N", "NQ", "D", "K", "exact QPS", "P50 ms", + "P99 ms", "exact recall", "speedup", "nprobe", "IVF QPS", + "IVF recall", "mean rank score error", + ] + lines = ["# Measured benchmark summary", "", "| " + " | ".join(header) + " |", + "|" + "|".join(["---"] * len(header)) + "|"] + lines.extend("| " + " | ".join(map(str, row)) + " |" for row in rows) + if not rows: + lines.extend(["", "No measured benchmark JSON files were found."]) + output.write_text("\n".join(lines) + "\n", encoding="utf-8") + print(f"wrote {output} with {len(rows)} measured rows") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) + diff --git a/09_vector_retrieval/ccyyy1023/src/cpu_search.cpp b/09_vector_retrieval/ccyyy1023/src/cpu_search.cpp new file mode 100644 index 00000000..69f6185e --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/src/cpu_search.cpp @@ -0,0 +1,73 @@ +#include "gvs/search.hpp" + +#include +#include +#include +#include +#include +#include + +namespace gvs { +namespace { + +float distance(const float* a, const float* b, std::size_t dim, Metric metric) { + float value = 0.0f; + if (metric == Metric::L2) { + for (std::size_t d = 0; d < dim; ++d) { + const float diff = a[d] - b[d]; + value += diff * diff; + } + return value; + } + for (std::size_t d = 0; d < dim; ++d) value += a[d] * b[d]; + return -value; // Smaller is better internally for both metrics. +} + +} // namespace + +SearchResult cpu_exact_search(const std::vector& database, + const std::vector& queries, + std::size_t n, std::size_t nq, + std::size_t dim, Metric metric, + std::size_t k) { + if (database.size() != n * dim || queries.size() != nq * dim) + throw std::invalid_argument("input shape does not match n/nq/dim"); + k = std::min(k, n); + SearchResult output{nq, k, std::vector(nq * k), + std::vector(nq * k)}; + std::vector> candidates(n); + for (std::size_t q = 0; q < nq; ++q) { + const float* query = queries.data() + q * dim; + for (std::size_t i = 0; i < n; ++i) { + candidates[i] = {distance(query, database.data() + i * dim, dim, metric), + static_cast(i)}; + } + std::partial_sort(candidates.begin(), candidates.begin() + k, + candidates.end()); + for (std::size_t j = 0; j < k; ++j) { + output.ids[q * k + j] = candidates[j].second; + output.scores[q * k + j] = + metric == Metric::InnerProduct ? -candidates[j].first + : candidates[j].first; + } + } + return output; +} + +double recall_at_k(const SearchResult& truth, const SearchResult& candidate) { + if (truth.queries != candidate.queries || truth.k != candidate.k) + throw std::invalid_argument("recall inputs have different shapes"); + std::size_t hits = 0; + for (std::size_t q = 0; q < truth.queries; ++q) { + std::unordered_set expected; + for (std::size_t j = 0; j < truth.k; ++j) + expected.insert(truth.ids[q * truth.k + j]); + for (std::size_t j = 0; j < candidate.k; ++j) + hits += expected.count(candidate.ids[q * candidate.k + j]); + } + const auto total = truth.queries * truth.k; + return total == 0 ? 1.0 : static_cast(hits) / total; +} + +} // namespace gvs + diff --git a/09_vector_retrieval/ccyyy1023/src/file_io.cpp b/09_vector_retrieval/ccyyy1023/src/file_io.cpp new file mode 100644 index 00000000..7aee9c4f --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/src/file_io.cpp @@ -0,0 +1,127 @@ +#include "gvs/io.hpp" + +#include +#include +#include +#include +#include + +namespace gvs { +namespace { + +constexpr char kDatabaseMagic[8] = {'G','V','S','D','B','0','1','\0'}; +constexpr char kQueryMagic[8] = {'G','V','S','Q','R','0','1','\0'}; +constexpr char kResultMagic[8] = {'G','V','S','R','S','0','1','\0'}; + +template +void write_scalar(std::ofstream& out, const T& value) { + out.write(reinterpret_cast(&value), sizeof(T)); + if (!out) throw std::runtime_error("failed to write binary file"); +} + +template +T read_scalar(std::ifstream& in) { + T value{}; + in.read(reinterpret_cast(&value), sizeof(T)); + if (!in) throw std::runtime_error("truncated binary file"); + return value; +} + +std::string trim(std::string value) { + auto not_space = [](unsigned char c) { return !std::isspace(c); }; + value.erase(value.begin(), std::find_if(value.begin(), value.end(), not_space)); + value.erase(std::find_if(value.rbegin(), value.rend(), not_space).base(), value.end()); + if (value.size() >= 2 && value.front() == '"' && value.back() == '"') + value = value.substr(1, value.size() - 2); + return value; +} + +} // namespace + +void write_vector_file(const std::string& path, const VectorFile& data, + bool include_metric) { + if (data.values.size() != data.count * data.dim) + throw std::invalid_argument("vector file shape mismatch"); + std::ofstream out(path, std::ios::binary); + if (!out) throw std::runtime_error("cannot open output file: " + path); + out.write(include_metric ? kDatabaseMagic : kQueryMagic, 8); + write_scalar(out, static_cast(data.count)); + write_scalar(out, static_cast(data.dim)); + write_scalar(out, static_cast(1)); // dtype: 1 = fp32 + if (include_metric) + write_scalar(out, static_cast(data.metric == Metric::L2 ? 0 : 1)); + out.write(reinterpret_cast(data.values.data()), + static_cast(data.values.size() * sizeof(float))); + if (!out) throw std::runtime_error("failed to write vectors"); +} + +VectorFile read_vector_file(const std::string& path, bool expect_metric) { + std::ifstream in(path, std::ios::binary); + if (!in) throw std::runtime_error("cannot open input file: " + path); + char magic[8]{}; + in.read(magic, 8); + const char* expected = expect_metric ? kDatabaseMagic : kQueryMagic; + if (!in || std::memcmp(magic, expected, 8) != 0) + throw std::runtime_error("invalid vector file magic/version: " + path); + VectorFile result; + result.count = static_cast(read_scalar(in)); + result.dim = static_cast(read_scalar(in)); + const auto dtype = read_scalar(in); + if (dtype != 1) throw std::runtime_error("this baseline supports fp32 files only"); + if (expect_metric) { + const auto metric = read_scalar(in); + if (metric > 1) throw std::runtime_error("invalid metric code"); + result.metric = metric == 0 ? Metric::L2 : Metric::InnerProduct; + } + if (result.count == 0 || result.dim == 0 || + result.count > static_cast(-1) / result.dim) + throw std::runtime_error("invalid or overflowing vector shape"); + result.values.resize(result.count * result.dim); + in.read(reinterpret_cast(result.values.data()), + static_cast(result.values.size() * sizeof(float))); + if (!in) throw std::runtime_error("truncated vector payload"); + return result; +} + +void write_search_result(const std::string& path, const SearchResult& result) { + if (result.ids.size() != result.queries * result.k || + result.scores.size() != result.ids.size()) + throw std::invalid_argument("result shape mismatch"); + std::ofstream out(path, std::ios::binary); + if (!out) throw std::runtime_error("cannot open result file: " + path); + out.write(kResultMagic, 8); + write_scalar(out, static_cast(result.queries)); + write_scalar(out, static_cast(result.k)); + for (std::size_t i = 0; i < result.ids.size(); ++i) { + write_scalar(out, static_cast(result.ids[i])); + write_scalar(out, result.scores[i]); + } +} + +Parameters read_parameters(const std::string& path) { + std::ifstream in(path); + if (!in) throw std::runtime_error("cannot open parameter file: " + path); + Parameters p; + std::string line; + while (std::getline(in, line)) { + const auto comment = line.find('#'); + if (comment != std::string::npos) line.erase(comment); + const auto equal = line.find('='); + if (equal == std::string::npos) continue; + const std::string key = trim(line.substr(0, equal)); + const std::string value = trim(line.substr(equal + 1)); + if (key == "top_k") p.top_k = std::stoull(value); + else if (key == "search_mode") p.search_mode = value; + else if (key == "batch_size") p.batch_size = std::stoull(value); + else if (key == "nlist") p.nlist = std::stoull(value); + else if (key == "nprobe") p.nprobe = std::stoull(value); + } + if (p.top_k == 0 || p.batch_size == 0 || p.nlist == 0 || p.nprobe == 0) + throw std::runtime_error("all numeric parameters must be positive"); + if (p.search_mode != "exact" && p.search_mode != "ivf_flat") + throw std::runtime_error("search_mode must be exact or ivf_flat"); + return p; +} + +} // namespace gvs + diff --git a/09_vector_retrieval/ccyyy1023/src/gpu_search.cu b/09_vector_retrieval/ccyyy1023/src/gpu_search.cu new file mode 100644 index 00000000..c05ab519 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/src/gpu_search.cu @@ -0,0 +1,227 @@ +#include "gvs/search.hpp" + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace gvs { +namespace { + +#define CUDA_CHECK(call) \ + do { \ + cudaError_t error__ = (call); \ + if (error__ != cudaSuccess) \ + throw std::runtime_error(std::string("CUDA error: ") + \ + cudaGetErrorString(error__)); \ + } while (0) + +template +class DeviceBuffer { +public: + explicit DeviceBuffer(std::size_t count = 0) : count_(count) { + if (count_) CUDA_CHECK(cudaMalloc(&ptr_, count_ * sizeof(T))); + } + ~DeviceBuffer() { if (ptr_) cudaFree(ptr_); } + DeviceBuffer(const DeviceBuffer&) = delete; + DeviceBuffer& operator=(const DeviceBuffer&) = delete; + T* get() { return ptr_; } + const T* get() const { return ptr_; } +private: + T* ptr_ = nullptr; + std::size_t count_ = 0; +}; + +__global__ void distance_kernel(const float* database, const float* queries, + float* distances, std::size_t n, + std::size_t batch, std::size_t dim, + int metric) { + const std::size_t i = blockIdx.x * blockDim.x + threadIdx.x; + const std::size_t q = blockIdx.y; + if (i >= n || q >= batch) return; + const float* x = database + i * dim; + const float* query = queries + q * dim; + float value = 0.0f; + if (metric == 0) { + for (std::size_t d = 0; d < dim; ++d) { + const float diff = query[d] - x[d]; + value = fmaf(diff, diff, value); + } + } else { + for (std::size_t d = 0; d < dim; ++d) + value = fmaf(query[d], x[d], value); + value = -value; + } + distances[q * n + i] = value; +} + +__global__ void indexed_distance_kernel(const float* database, const float* query, + const int* ids, float* distances, + std::size_t candidates, std::size_t dim, + int metric) { + const std::size_t i = blockIdx.x * blockDim.x + threadIdx.x; + if (i >= candidates) return; + const float* x = database + static_cast(ids[i]) * dim; + float value = 0.0f; + if (metric == 0) { + for (std::size_t d = 0; d < dim; ++d) { + const float diff = query[d] - x[d]; + value = fmaf(diff, diff, value); + } + } else { + for (std::size_t d = 0; d < dim; ++d) + value = fmaf(query[d], x[d], value); + value = -value; + } + distances[i] = value; +} + +SearchResult finalize_on_cpu(const std::vector& distances, + std::size_t nq, std::size_t n, + std::size_t k, Metric metric) { + SearchResult output{nq, k, std::vector(nq * k), + std::vector(nq * k)}; + std::vector> row(n); + for (std::size_t q = 0; q < nq; ++q) { + for (std::size_t i = 0; i < n; ++i) + row[i] = {distances[q * n + i], static_cast(i)}; + std::partial_sort(row.begin(), row.begin() + k, row.end()); + for (std::size_t j = 0; j < k; ++j) { + output.ids[q * k + j] = row[j].second; + output.scores[q * k + j] = + metric == Metric::InnerProduct ? -row[j].first : row[j].first; + } + } + return output; +} + +} // namespace + +SearchResult gpu_exact_search(const std::vector& database, + const std::vector& queries, + std::size_t n, std::size_t nq, + std::size_t dim, Metric metric, + const SearchConfig& config, + GpuStats* stats) { + if (database.size() != n * dim || queries.size() != nq * dim) + throw std::invalid_argument("input shape does not match n/nq/dim"); + const std::size_t k = std::min(config.k, n); + const std::size_t batch_capacity = std::min(config.batch_size, nq); + + DeviceBuffer d_database(database.size()); + DeviceBuffer d_queries(batch_capacity * dim); + DeviceBuffer d_distances(batch_capacity * n); + CUDA_CHECK(cudaMemcpy(d_database.get(), database.data(), + database.size() * sizeof(float), cudaMemcpyHostToDevice)); + + SearchResult output{nq, k, std::vector(nq * k), + std::vector(nq * k)}; + std::vector host_distances(batch_capacity * n); + CUDA_CHECK(cudaDeviceSynchronize()); + const auto begin = std::chrono::steady_clock::now(); + + for (std::size_t first = 0; first < nq; first += batch_capacity) { + const std::size_t batch = std::min(batch_capacity, nq - first); + CUDA_CHECK(cudaMemcpy(d_queries.get(), queries.data() + first * dim, + batch * dim * sizeof(float), cudaMemcpyHostToDevice)); + const dim3 block(256); + const dim3 grid(static_cast((n + block.x - 1) / block.x), + static_cast(batch)); + distance_kernel<<>>(d_database.get(), d_queries.get(), + d_distances.get(), n, batch, dim, + metric == Metric::L2 ? 0 : 1); + CUDA_CHECK(cudaGetLastError()); + CUDA_CHECK(cudaMemcpy(host_distances.data(), d_distances.get(), + batch * n * sizeof(float), cudaMemcpyDeviceToHost)); + SearchResult part = finalize_on_cpu(host_distances, batch, n, k, metric); + std::copy(part.ids.begin(), part.ids.end(), output.ids.begin() + first * k); + std::copy(part.scores.begin(), part.scores.end(), + output.scores.begin() + first * k); + } + CUDA_CHECK(cudaDeviceSynchronize()); + const auto end = std::chrono::steady_clock::now(); + const double elapsed = + std::chrono::duration(end - begin).count(); + + if (stats) { + cudaDeviceProp prop{}; + CUDA_CHECK(cudaGetDeviceProperties(&prop, 0)); + stats->elapsed_ms = elapsed; + stats->peak_workspace_bytes = + (database.size() + batch_capacity * dim + batch_capacity * n) * + sizeof(float); + stats->device_name = prop.name; + } + return output; +} + +SearchResult gpu_indexed_search(const std::vector& database, + const std::vector& queries, + const std::vector>& candidate_ids, + std::size_t n, std::size_t nq, + std::size_t dim, Metric metric, + const SearchConfig& config, + GpuStats* stats) { + if (database.size() != n * dim || queries.size() != nq * dim || + candidate_ids.size() != nq) + throw std::invalid_argument("indexed search shape mismatch"); + const std::size_t k = std::min(config.k, n); + std::size_t max_candidates = 0; + for (const auto& ids : candidate_ids) max_candidates = std::max(max_candidates, ids.size()); + SearchResult output{nq, k, std::vector(nq * k, -1), + std::vector(nq * k, 0.0f)}; + if (max_candidates == 0) return output; + + DeviceBuffer d_database(database.size()); + DeviceBuffer d_query(dim); + DeviceBuffer d_ids(max_candidates); + DeviceBuffer d_distances(max_candidates); + CUDA_CHECK(cudaMemcpy(d_database.get(), database.data(), + database.size() * sizeof(float), cudaMemcpyHostToDevice)); + std::vector host_distances(max_candidates); + const auto begin = std::chrono::steady_clock::now(); + for (std::size_t q = 0; q < nq; ++q) { + const std::size_t count = candidate_ids[q].size(); + if (count == 0) continue; + CUDA_CHECK(cudaMemcpy(d_query.get(), queries.data() + q * dim, + dim * sizeof(float), cudaMemcpyHostToDevice)); + CUDA_CHECK(cudaMemcpy(d_ids.get(), candidate_ids[q].data(), + count * sizeof(int), cudaMemcpyHostToDevice)); + const dim3 block(256); + const dim3 grid(static_cast((count + block.x - 1) / block.x)); + indexed_distance_kernel<<>>( + d_database.get(), d_query.get(), d_ids.get(), d_distances.get(), + count, dim, metric == Metric::L2 ? 0 : 1); + CUDA_CHECK(cudaGetLastError()); + CUDA_CHECK(cudaMemcpy(host_distances.data(), d_distances.get(), + count * sizeof(float), cudaMemcpyDeviceToHost)); + const std::size_t part_k = std::min(k, count); + std::vector> row(count); + for (std::size_t i = 0; i < count; ++i) + row[i] = {host_distances[i], candidate_ids[q][i]}; + std::partial_sort(row.begin(), row.begin() + part_k, row.end()); + for (std::size_t j = 0; j < part_k; ++j) { + output.ids[q * k + j] = row[j].second; + output.scores[q * k + j] = + metric == Metric::InnerProduct ? -row[j].first : row[j].first; + } + } + CUDA_CHECK(cudaDeviceSynchronize()); + if (stats) { + cudaDeviceProp prop{}; + CUDA_CHECK(cudaGetDeviceProperties(&prop, 0)); + stats->elapsed_ms = std::chrono::duration( + std::chrono::steady_clock::now() - begin).count(); + stats->peak_workspace_bytes = database.size() * sizeof(float) + + dim * sizeof(float) + max_candidates * (sizeof(float) + sizeof(int)); + stats->device_name = prop.name; + } + return output; +} + +} // namespace gvs diff --git a/09_vector_retrieval/ccyyy1023/src/ivf_flat.cpp b/09_vector_retrieval/ccyyy1023/src/ivf_flat.cpp new file mode 100644 index 00000000..81688267 --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/src/ivf_flat.cpp @@ -0,0 +1,214 @@ +#include "gvs/search.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace gvs { +namespace { + +float coarse_distance(const float* a, const float* b, std::size_t dim, + Metric metric) { + float value = 0.0f; + if (metric == Metric::L2) { + for (std::size_t d = 0; d < dim; ++d) { + const float diff = a[d] - b[d]; + value += diff * diff; + } + return value; + } + for (std::size_t d = 0; d < dim; ++d) value += a[d] * b[d]; + return -value; +} + +std::size_t nearest_centroid(const float* x, const std::vector& centroids, + std::size_t nlist, std::size_t dim, Metric metric) { + std::size_t best = 0; + float best_value = std::numeric_limits::infinity(); + for (std::size_t c = 0; c < nlist; ++c) { + const float value = coarse_distance(x, centroids.data() + c * dim, + dim, metric); + if (value < best_value) { best_value = value; best = c; } + } + return best; +} + +} // namespace + +namespace { +constexpr char kIvfMagic[8] = {'G','V','S','I','V','F','1','\0'}; +template +void write_value(std::ofstream& out, const T& value) { + out.write(reinterpret_cast(&value), sizeof(T)); + if (!out) throw std::runtime_error("failed to write IVF index"); +} +template +T read_value(std::ifstream& in) { + T value{}; + in.read(reinterpret_cast(&value), sizeof(T)); + if (!in) throw std::runtime_error("truncated IVF index"); + return value; +} +} + +IvfFlatIndex::IvfFlatIndex(std::size_t dim, std::size_t nlist, Metric metric) + : dim_(dim), nlist_(nlist), metric_(metric), lists_(nlist) { + if (dim == 0 || nlist == 0) throw std::invalid_argument("dim/nlist must be positive"); +} + +void IvfFlatIndex::train(const std::vector& database, std::size_t n, + std::size_t iterations, std::uint64_t seed) { + if (database.size() != n * dim_ || n < nlist_) + throw std::invalid_argument("invalid training matrix or n < nlist"); + std::mt19937_64 rng(seed); + std::vector order(n); + std::iota(order.begin(), order.end(), 0); + std::shuffle(order.begin(), order.end(), rng); + centroids_.resize(nlist_ * dim_); + for (std::size_t c = 0; c < nlist_; ++c) + std::copy_n(database.data() + order[c] * dim_, dim_, + centroids_.data() + c * dim_); + + std::vector sums(nlist_ * dim_); + std::vector counts(nlist_); + // Mini-batch Lloyd training bounds build cost on million-vector inputs. + const std::size_t train_count = std::min(n, std::max(4096, nlist_ * 4)); + for (std::size_t iter = 0; iter < iterations; ++iter) { + std::fill(sums.begin(), sums.end(), 0.0f); + std::fill(counts.begin(), counts.end(), 0); + std::shuffle(order.begin(), order.end(), rng); + for (std::size_t sample = 0; sample < train_count; ++sample) { + const std::size_t i = order[sample]; + const std::size_t c = nearest_centroid(database.data() + i * dim_, + centroids_, nlist_, dim_, metric_); + ++counts[c]; + for (std::size_t d = 0; d < dim_; ++d) + sums[c * dim_ + d] += database[i * dim_ + d]; + } + for (std::size_t c = 0; c < nlist_; ++c) { + if (counts[c] == 0) continue; + for (std::size_t d = 0; d < dim_; ++d) + centroids_[c * dim_ + d] = sums[c * dim_ + d] / counts[c]; + } + } +} + +void IvfFlatIndex::add(const std::vector& database, std::size_t n) { + if (centroids_.empty()) throw std::logic_error("train must be called before add"); + if (database.size() != n * dim_) throw std::invalid_argument("invalid database shape"); + database_ = database; + lists_.assign(nlist_, {}); + std::vector labels(n); + #pragma omp parallel for schedule(static) + for (std::size_t i = 0; i < n; ++i) { + labels[i] = nearest_centroid(database.data() + i * dim_, centroids_, + nlist_, dim_, metric_); + } + for (std::size_t i = 0; i < n; ++i) + lists_[labels[i]].push_back(static_cast(i)); +} + +SearchResult IvfFlatIndex::search(const std::vector& queries, + std::size_t nq, std::size_t nprobe, + const SearchConfig& config, + GpuStats* stats) const { + if (database_.empty()) throw std::logic_error("add must be called before search"); + if (queries.size() != nq * dim_) throw std::invalid_argument("invalid query shape"); + nprobe = std::min(nprobe, nlist_); + const std::size_t k = std::min(config.k, database_.size() / dim_); + const auto search_begin = std::chrono::steady_clock::now(); + std::vector> candidate_ids(nq); + + for (std::size_t q = 0; q < nq; ++q) { + std::vector> coarse(nlist_); + for (std::size_t c = 0; c < nlist_; ++c) + coarse[c] = {coarse_distance(queries.data() + q * dim_, + centroids_.data() + c * dim_, dim_, metric_), + static_cast(c)}; + std::partial_sort(coarse.begin(), coarse.begin() + nprobe, coarse.end()); + for (std::size_t p = 0; p < nprobe; ++p) { + const auto& list = lists_[coarse[p].second]; + candidate_ids[q].insert(candidate_ids[q].end(), list.begin(), list.end()); + } + } + GpuStats gpu_stats; + SearchResult output = gpu_indexed_search( + database_, queries, candidate_ids, database_.size() / dim_, nq, dim_, + metric_, SearchConfig{k, 1}, &gpu_stats); + if (stats) { + stats->elapsed_ms = std::chrono::duration( + std::chrono::steady_clock::now() - search_begin).count(); + stats->peak_workspace_bytes = gpu_stats.peak_workspace_bytes; + stats->device_name = gpu_stats.device_name; + } + return output; +} + +void IvfFlatIndex::save(const std::string& path) const { + if (database_.empty() || centroids_.empty()) + throw std::logic_error("cannot save an unbuilt IVF index"); + std::ofstream out(path, std::ios::binary); + if (!out) throw std::runtime_error("cannot open IVF index output: " + path); + out.write(kIvfMagic, 8); + write_value(out, static_cast(database_.size() / dim_)); + write_value(out, static_cast(dim_)); + write_value(out, static_cast(nlist_)); + write_value(out, static_cast(metric_ == Metric::L2 ? 0 : 1)); + out.write(reinterpret_cast(centroids_.data()), + static_cast(centroids_.size() * sizeof(float))); + out.write(reinterpret_cast(database_.data()), + static_cast(database_.size() * sizeof(float))); + for (const auto& list : lists_) { + write_value(out, static_cast(list.size())); + out.write(reinterpret_cast(list.data()), + static_cast(list.size() * sizeof(int))); + } + if (!out) throw std::runtime_error("failed to write IVF payload"); +} + +IvfFlatIndex IvfFlatIndex::load(const std::string& path) { + std::ifstream in(path, std::ios::binary); + if (!in) throw std::runtime_error("cannot open IVF index: " + path); + char magic[8]{}; + in.read(magic, 8); + if (!in || std::memcmp(magic, kIvfMagic, 8) != 0) + throw std::runtime_error("invalid IVF index magic/version"); + const std::size_t n = static_cast(read_value(in)); + const std::size_t dim = read_value(in); + const std::size_t nlist = read_value(in); + const auto metric_code = read_value(in); + if (n == 0 || dim == 0 || nlist == 0 || metric_code > 1 || + n > static_cast(-1) / dim) + throw std::runtime_error("invalid IVF index header"); + IvfFlatIndex index(dim, nlist, + metric_code == 0 ? Metric::L2 : Metric::InnerProduct); + index.centroids_.resize(nlist * dim); + index.database_.resize(n * dim); + in.read(reinterpret_cast(index.centroids_.data()), + static_cast(index.centroids_.size() * sizeof(float))); + in.read(reinterpret_cast(index.database_.data()), + static_cast(index.database_.size() * sizeof(float))); + std::size_t id_count = 0; + for (auto& list : index.lists_) { + const auto size = static_cast(read_value(in)); + if (size > n - id_count) throw std::runtime_error("invalid IVF list sizes"); + list.resize(size); + in.read(reinterpret_cast(list.data()), + static_cast(size * sizeof(int))); + id_count += size; + for (int id : list) + if (id < 0 || static_cast(id) >= n) + throw std::runtime_error("invalid vector id in IVF index"); + } + if (!in || id_count != n) throw std::runtime_error("truncated or incomplete IVF index"); + return index; +} + +} // namespace gvs diff --git a/09_vector_retrieval/ccyyy1023/src/main.cpp b/09_vector_retrieval/ccyyy1023/src/main.cpp new file mode 100644 index 00000000..c8bafe5f --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/src/main.cpp @@ -0,0 +1,259 @@ +#include "gvs/io.hpp" +#include "gvs/search.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +using Clock = std::chrono::steady_clock; + +class Args { +public: + Args(int argc, char** argv, int start = 2) { + for (int i = start; i < argc; ++i) { + const std::string key = argv[i]; + if (key.rfind("--", 0) != 0 || i + 1 >= argc) + throw std::invalid_argument("expected --key value pairs"); + values_[key.substr(2)] = argv[++i]; + } + } + std::string get(const std::string& key, const std::string& fallback = "") const { + auto it = values_.find(key); + return it == values_.end() ? fallback : it->second; + } + std::string require(const std::string& key) const { + const auto value = get(key); + if (value.empty()) throw std::invalid_argument("missing --" + key); + return value; + } + std::size_t number(const std::string& key, std::size_t fallback) const { + const auto value = get(key); + return value.empty() ? fallback : static_cast(std::stoull(value)); + } +private: + std::map values_; +}; + +gvs::Metric parse_metric(const std::string& value) { + if (value == "l2") return gvs::Metric::L2; + if (value == "inner_product") return gvs::Metric::InnerProduct; + throw std::invalid_argument("metric must be l2 or inner_product"); +} + +double percentile(std::vector values, double p) { + if (values.empty()) return 0.0; + std::sort(values.begin(), values.end()); + const std::size_t index = static_cast( + std::ceil(p * static_cast(values.size()))) - 1; + return values[std::min(index, values.size() - 1)]; +} + +double mean_rank_score_error(const gvs::SearchResult& truth, + const gvs::SearchResult& candidate) { + if (truth.queries != candidate.queries || truth.k != candidate.k) + throw std::invalid_argument("quality result shapes differ"); + double sum = 0.0; + for (std::size_t i = 0; i < truth.scores.size(); ++i) + sum += std::abs(static_cast(truth.scores[i]) - candidate.scores[i]); + return truth.scores.empty() ? 0.0 : sum / truth.scores.size(); +} + +std::string json_escape(const std::string& value) { + std::string out; + for (char c : value) { + if (c == '"' || c == '\\') out.push_back('\\'); + out.push_back(c); + } + return out; +} + +void command_generate(const Args& args) { + const std::size_t n = args.number("n", 10000); + const std::size_t nq = args.number("nq", 100); + const std::size_t dim = args.number("dim", 128); + const auto metric = parse_metric(args.get("metric", "l2")); + const std::uint64_t seed = args.number("seed", 42); + std::mt19937_64 rng(seed); + std::normal_distribution normal(0.0f, 1.0f); + gvs::VectorFile database{n, dim, metric, std::vector(n * dim)}; + gvs::VectorFile queries{nq, dim, metric, std::vector(nq * dim)}; + for (float& value : database.values) value = normal(rng); + for (float& value : queries.values) value = normal(rng); + gvs::write_vector_file(args.require("db"), database, true); + gvs::write_vector_file(args.require("queries"), queries, false); + std::cout << "generated n=" << n << " nq=" << nq << " dim=" << dim << '\n'; +} + +void command_build(const Args& args) { + const auto database = gvs::read_vector_file(args.require("db"), true); + const auto start = Clock::now(); + gvs::IvfFlatIndex index(database.dim, args.number("nlist", 256), database.metric); + index.train(database.values, database.count, args.number("iterations", 12), + args.number("seed", 42)); + index.add(database.values, database.count); + index.save(args.require("index")); + const double ms = std::chrono::duration(Clock::now() - start).count(); + std::cout << "index_build_ms=" << ms << '\n'; +} + +void command_search(const Args& args) { + const auto database = gvs::read_vector_file(args.require("db"), true); + const auto queries = gvs::read_vector_file(args.require("queries"), false); + if (database.dim != queries.dim) throw std::runtime_error("database/query dim mismatch"); + const auto parameters = gvs::read_parameters(args.require("params")); + gvs::SearchConfig config{parameters.top_k, parameters.batch_size}; + gvs::GpuStats stats; + gvs::SearchResult result; + if (parameters.search_mode == "exact") { + result = gvs::gpu_exact_search(database.values, queries.values, + database.count, queries.count, database.dim, + database.metric, config, &stats); + } else { + auto index = gvs::IvfFlatIndex::load(args.require("index")); + result = index.search(queries.values, queries.count, parameters.nprobe, + config, &stats); + } + gvs::write_search_result(args.require("output"), result); + const double qps = stats.elapsed_ms == 0.0 ? 0.0 : queries.count * 1000.0 / stats.elapsed_ms; + std::cout << "mode=" << parameters.search_mode << " query_ms=" << stats.elapsed_ms + << " qps=" << qps << " workspace_mib=" + << stats.peak_workspace_bytes / (1024.0 * 1024.0) << '\n'; +} + +void command_benchmark(const Args& args) { + const auto database = gvs::read_vector_file(args.require("db"), true); + const auto queries = gvs::read_vector_file(args.require("queries"), false); + if (database.dim != queries.dim) throw std::runtime_error("database/query dim mismatch"); + const std::size_t k = args.number("k", 10); + const std::size_t batch = args.number("batch", 128); + const std::size_t nprobe = args.number("nprobe", 16); + const std::size_t cpu_limit = std::min(args.number("cpu-query-limit", 20), queries.count); + const std::size_t latency_limit = std::min(args.number("latency-query-limit", 100), queries.count); + const gvs::SearchConfig config{k, batch}; + + gvs::GpuStats exact_stats; + const auto exact = gvs::gpu_exact_search(database.values, queries.values, + database.count, queries.count, database.dim, + database.metric, config, &exact_stats); + + std::vector cpu_queries(queries.values.begin(), + queries.values.begin() + cpu_limit * database.dim); + const auto cpu_begin = Clock::now(); + const auto cpu = gvs::cpu_exact_search(database.values, cpu_queries, + database.count, cpu_limit, database.dim, + database.metric, k); + const double cpu_ms = std::chrono::duration( + Clock::now() - cpu_begin).count(); + gvs::SearchResult exact_prefix{cpu_limit, exact.k, + std::vector(exact.ids.begin(), exact.ids.begin() + cpu_limit * exact.k), + std::vector(exact.scores.begin(), exact.scores.begin() + cpu_limit * exact.k)}; + const double exact_recall = gvs::recall_at_k(cpu, exact_prefix); + + double build_ms = 0.0; + const std::string index_path = args.require("index"); + if (!std::filesystem::exists(index_path) || args.get("rebuild", "false") == "true") { + const auto build_begin = Clock::now(); + gvs::IvfFlatIndex built(database.dim, args.number("nlist", 256), database.metric); + built.train(database.values, database.count, args.number("iterations", 12), + args.number("seed", 42)); + built.add(database.values, database.count); + built.save(index_path); + build_ms = std::chrono::duration( + Clock::now() - build_begin).count(); + } + auto index = gvs::IvfFlatIndex::load(index_path); + gvs::GpuStats ivf_stats; + const auto approximate = index.search(queries.values, queries.count, nprobe, + config, &ivf_stats); + const double ivf_recall = gvs::recall_at_k(exact, approximate); + const double score_error = mean_rank_score_error(exact, approximate); + + std::vector exact_latencies; + exact_latencies.reserve(latency_limit); + for (std::size_t q = 0; q < latency_limit; ++q) { + std::vector one(queries.values.begin() + q * database.dim, + queries.values.begin() + (q + 1) * database.dim); + gvs::GpuStats one_stats; + gvs::gpu_exact_search(database.values, one, database.count, 1, database.dim, + database.metric, gvs::SearchConfig{k, 1}, &one_stats); + exact_latencies.push_back(one_stats.elapsed_ms); + } + + const double exact_qps = exact_stats.elapsed_ms == 0.0 ? 0.0 + : queries.count * 1000.0 / exact_stats.elapsed_ms; + const double ivf_qps = ivf_stats.elapsed_ms == 0.0 ? 0.0 + : queries.count * 1000.0 / ivf_stats.elapsed_ms; + const double cpu_per_query = cpu_limit == 0 ? 0.0 : cpu_ms / cpu_limit; + const double gpu_per_query = queries.count == 0 ? 0.0 : exact_stats.elapsed_ms / queries.count; + const double speedup = gpu_per_query == 0.0 ? 0.0 : cpu_per_query / gpu_per_query; + + std::ofstream log(args.require("log")); + if (!log) throw std::runtime_error("cannot open benchmark log"); + log << std::fixed << std::setprecision(6) + << "{\n" + << " \"status\": \"measured\",\n" + << " \"device\": \"" << json_escape(exact_stats.device_name) << "\",\n" + << " \"dataset\": {\"n\": " << database.count << ", \"nq\": " + << queries.count << ", \"dim\": " << database.dim << ", \"k\": " << k << "},\n" + << " \"exact\": {\"query_ms\": " << exact_stats.elapsed_ms + << ", \"qps\": " << exact_qps << ", \"p50_ms\": " + << percentile(exact_latencies, 0.50) << ", \"p99_ms\": " + << percentile(exact_latencies, 0.99) << ", \"workspace_mib\": " + << exact_stats.peak_workspace_bytes / (1024.0 * 1024.0) + << ", \"cpu_gpu_recall_at_k\": " << exact_recall + << ", \"speedup_vs_cpu\": " << speedup << "},\n" + << " \"cpu\": {\"queries_measured\": " << cpu_limit + << ", \"query_ms\": " << cpu_ms << "},\n" + << " \"ivf_flat\": {\"index_build_ms\": " << build_ms + << ", \"query_ms\": " << ivf_stats.elapsed_ms << ", \"qps\": " + << ivf_qps << ", \"nlist\": " << index.nlist() << ", \"nprobe\": " + << nprobe << ", \"recall_at_k\": " << ivf_recall + << ", \"mean_rank_score_error\": " << score_error + << ", \"workspace_mib\": " + << ivf_stats.peak_workspace_bytes / (1024.0 * 1024.0) << "}\n" + << "}\n"; + std::cout << "benchmark written to " << args.require("log") << '\n'; +} + +void usage() { + std::cout + << "GPU Vector Search\n" + << " generate --db DB --queries Q --n N --nq NQ --dim D --metric l2|inner_product\n" + << " build --db DB --index INDEX --nlist C [--iterations I]\n" + << " search --db DB --queries Q --params CONFIG --index INDEX --output OUT\n" + << " benchmark --db DB --queries Q --index INDEX --log JSON [--k K --batch B]\n"; +} + +} // namespace + +int main(int argc, char** argv) { + try { + if (argc < 2) { usage(); return 1; } + const std::string command = argv[1]; + const Args args(argc, argv); + if (command == "generate") command_generate(args); + else if (command == "build") command_build(args); + else if (command == "search") command_search(args); + else if (command == "benchmark") command_benchmark(args); + else { usage(); return 1; } + return 0; + } catch (const std::exception& error) { + std::cerr << "error: " << error.what() << '\n'; + return 2; + } +} + diff --git a/09_vector_retrieval/ccyyy1023/tests/test_search.cpp b/09_vector_retrieval/ccyyy1023/tests/test_search.cpp new file mode 100644 index 00000000..d02e24ca --- /dev/null +++ b/09_vector_retrieval/ccyyy1023/tests/test_search.cpp @@ -0,0 +1,72 @@ +#include "gvs/search.hpp" + +#include +#include +#include +#include +#include + +namespace { + +void require(bool condition, const char* message) { + if (!condition) throw std::runtime_error(message); +} + +void test_metric(gvs::Metric metric) { + constexpr std::size_t n = 257; + constexpr std::size_t nq = 7; + constexpr std::size_t dim = 33; + constexpr std::size_t k = 10; + std::vector database(n * dim); + std::vector queries(nq * dim); + for (std::size_t i = 0; i < database.size(); ++i) + database[i] = std::sin(static_cast(i) * 0.013f); + for (std::size_t i = 0; i < queries.size(); ++i) + queries[i] = std::cos(static_cast(i) * 0.017f); + const auto cpu = gvs::cpu_exact_search(database, queries, n, nq, dim, metric, k); + const auto gpu = gvs::gpu_exact_search(database, queries, n, nq, dim, metric, + gvs::SearchConfig{k, 4}); + require(gvs::recall_at_k(cpu, gpu) == 1.0, "GPU exact Top-K differs from CPU"); + for (std::size_t i = 0; i < cpu.scores.size(); ++i) + require(std::abs(cpu.scores[i] - gpu.scores[i]) < 2e-3f, + "GPU score differs from CPU tolerance"); +} + +void test_ivf_roundtrip() { + constexpr std::size_t n = 512; + constexpr std::size_t nq = 8; + constexpr std::size_t dim = 16; + std::vector database(n * dim); + std::vector queries(nq * dim); + for (std::size_t i = 0; i < n; ++i) + for (std::size_t d = 0; d < dim; ++d) + database[i * dim + d] = static_cast(i % 16) * 4.0f + + static_cast((i + d) % 7) * 0.01f; + for (std::size_t q = 0; q < nq; ++q) + std::copy_n(database.data() + q * 16 * dim, dim, queries.data() + q * dim); + gvs::IvfFlatIndex index(dim, 16, gvs::Metric::L2); + index.train(database, n, 8, 7); + index.add(database, n); + index.save("gvs_test_index.bin"); + auto loaded = gvs::IvfFlatIndex::load("gvs_test_index.bin"); + const auto exact = gvs::cpu_exact_search(database, queries, n, nq, dim, + gvs::Metric::L2, 10); + const auto approximate = loaded.search(queries, nq, 4, gvs::SearchConfig{10, 4}); + require(gvs::recall_at_k(exact, approximate) >= 0.90, + "IVF recall is unexpectedly low on clustered test data"); +} + +} // namespace + +int main() { + try { + test_metric(gvs::Metric::L2); + test_metric(gvs::Metric::InnerProduct); + test_ivf_roundtrip(); + std::cout << "all correctness tests passed\n"; + return 0; + } catch (const std::exception& error) { + std::cerr << "test failure: " << error.what() << '\n'; + return 1; + } +}