Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
8fc7443
benchmark: configure PiPNN graph builds
SeliMeli Jul 29, 2026
ffd730b
benchmark: add dedicated PiPNN batch pipeline
SeliMeli Jul 29, 2026
fc865c5
test(benchmark): cover PiPNN build pipelines
SeliMeli Jul 29, 2026
bb98da2
benchmark: exclude provider allocation from build timing
SeliMeli Jul 29, 2026
aeb65e2
docs(benchmark): clarify PiPNN memory-budget scope
SeliMeli Jul 29, 2026
ba3759a
build(benchmark): update PiPNN feature lockfile
SeliMeli Jul 29, 2026
0c93372
test(benchmark): assert PiPNN registered results
SeliMeli Jul 29, 2026
a81f771
fix(benchmark): connect start slots to real graph sources
SeliMeli Jul 29, 2026
de207fe
docs(benchmark): map PiPNN batch lifecycle
SeliMeli Jul 31, 2026
856c702
fix(benchmark): preserve PiPNN start adjacency
SeliMeli Aug 3, 2026
63de4a7
refactor(benchmark): use diskann pipnn module
SeliMeli Aug 5, 2026
9a3be65
fix(benchmark): fail closed on unavailable pipnn
SeliMeli Aug 6, 2026
9000c18
fix(benchmark): reject pipnn dynamic runs
SeliMeli Aug 6, 2026
ea200b3
fix(benchmark): adapt pipnn errors to main
SeliMeli Aug 6, 2026
4f2429e
fix(benchmark): allow platform-sized input enum
SeliMeli Aug 6, 2026
f401eeb
docs(benchmark): complete vector safety proof
SeliMeli Aug 7, 2026
c50648c
docs(pipnn): simplify benchmark lifecycle comments
SeliMeli Aug 7, 2026
411d00b
docs(pipnn): use direct benchmark wording
SeliMeli Aug 7, 2026
75f4a3b
perf(pipnn): score each start candidate once
SeliMeli Aug 10, 2026
8556fa8
fix(benchmark): retain spherical summary arm
SeliMeli Sep 4, 2026
20842c2
Merge batched core into PiPNN benchmarks
SeliMeli Sep 14, 2026
c6d1670
perf(pipnn): install graph rows in parallel
SeliMeli Sep 14, 2026
ba99dd7
Merge reviewed PiPNN kernel tests into benchmarks
SeliMeli Sep 17, 2026
cfced02
Merge TopK visitor into PR5
SeliMeli Sep 18, 2026
c8ecdfd
Merge fast PiPNN norms into PR5
SeliMeli Sep 18, 2026
c0f2165
Merge shared GEMM test helper into PR5
SeliMeli Sep 18, 2026
76befef
Merge focused GEMM cases into PR5
SeliMeli Sep 18, 2026
3300840
Keep matrix view hardening outside PR5
SeliMeli Sep 18, 2026
2438638
Sync PR2 Clippy fix through PR5
SeliMeli Sep 18, 2026
3b694c1
Sync rewritten PiPNN core tests through PR5
SeliMeli Sep 21, 2026
14a5eee
Sync PiPNN partition coverage through PR5
SeliMeli Sep 21, 2026
abcab8d
Sync NEON tracking cleanup through PR5
SeliMeli Sep 21, 2026
c2db2c5
merge(pipnn): carry review fixes into benchmarks
SeliMeli Sep 22, 2026
7d8f3bb
merge(pipnn): carry top-k simplification into benchmarks
SeliMeli Sep 23, 2026
8e456bc
merge(pipnn): carry debug-only top-k checks into benchmarks
SeliMeli Sep 23, 2026
0875c04
merge(pipnn): catch benchmarks up with main through integration
SeliMeli Sep 24, 2026
8a2ccf1
merge(pipnn): catch benchmarks up with core review changes
SeliMeli Sep 28, 2026
5aa2bb6
merge(pipnn): catch benchmarks up with the integration import fix
SeliMeli Sep 28, 2026
a5b28cb
merge(pipnn): catch benchmarks up with the unsorted leaf candidates
SeliMeli Sep 29, 2026
d7fcc93
merge(pipnn): catch benchmarks up with the fixed assignment stripe
SeliMeli Oct 12, 2026
0944aef
merge(pipnn): catch benchmarks up with the prune pool cap
SeliMeli Oct 12, 2026
93f8bd1
merge(pipnn): catch benchmarks up with the seed constant docs
SeliMeli Oct 12, 2026
0a957d4
merge(pipnn): catch benchmarks up with split RNG seeds
SeliMeli Oct 12, 2026
0a303b3
merge(pipnn): catch benchmarks up with the caller seed
SeliMeli Oct 12, 2026
d5602dc
merge(pipnn): catch benchmarks up with the partitioning renames
SeliMeli Oct 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions diskann-benchmark/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,6 @@ disk-index = [
"dep:opentelemetry_sdk",
"dep:scopeguard",
]

# Enable PiPNN graph construction.
pipnn = ["diskann/pipnn", "diskann-disk/pipnn"]
Comment thread
SeliMeli marked this conversation as resolved.
45 changes: 45 additions & 0 deletions diskann-benchmark/example/pipnn-disk-index.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{
"search_directories": [
"test_data/disk_index_search"
],
"jobs": [
{
"type": "disk-index",
"content": {
"source": {
"disk-index-source": "Build",
"data_type": "float32",
"data": "disk_index_siftsmall_learn_256pts_data.fbin",
"distance": "squared_l2",
"dim": 128,
"max_degree": 32,
"l_build": 50,
"alpha": 1.2,
"num_threads": 1,
"build_ram_limit_gb": 2.0,
"num_pq_chunks": 128,
"build_algorithm": {
"algorithm": "PiPNN",
"c_max": 64,
"p_samp": 0.05,
"fanout": [4, 2],
"k": 2,
"replicas": 1
},
"save_path": "pipnn_disk_index"
},
"search_phase": {
"queries": "disk_index_sample_query_10pts.fbin",
"groundtruth": "disk_index_10pts_idx_uint32_exact_ground_truth.bin",
"search_list": [10, 20, 40],
"beam_width": 4,
"recall_at": 10,
"num_threads": 1,
"is_flat_search": false,
"distance": "squared_l2",
"vector_filters_file": null
}
}
}
]
}
46 changes: 46 additions & 0 deletions diskann-benchmark/example/pipnn-graph-index.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{
"search_directories": [
"test_data/disk_index_search"
],
"jobs": [
{
"type": "graph-index-build",
"content": {
"source": {
"index-source": "Build",
"data_type": "float32",
"data": "disk_index_siftsmall_learn_256pts_data.fbin",
"distance": "squared_l2",
"max_degree": 32,
"l_build": 50,
"alpha": 1.2,
"backedge_ratio": 1.0,
"num_threads": 1,
"start_point_strategy": "first_vector",
"build_algorithm": {
"algorithm": "PiPNN",
"c_max": 64,
"p_samp": 0.05,
"fanout": [4, 2],
"k": 2,
"replicas": 1
}
},
"search_phase": {
"search-type": "topk",
"queries": "disk_index_sample_query_10pts.fbin",
"groundtruth": "disk_index_10pts_idx_uint32_exact_ground_truth.bin",
"reps": 1,
"num_threads": [1],
"runs": [
{
"search_n": 10,
"search_l": [10, 20, 40],
"recall_k": 10
}
]
}
}
}
]
}
23 changes: 18 additions & 5 deletions diskann-benchmark/src/disk_index/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ where
params.l_build,
metric.into(),
|b| {
b.alpha(params.alpha);
b.saturate_after_prune(true);
},
)
Expand All @@ -93,11 +94,23 @@ where

let metadata = load_metadata_from_file(storage_provider, &data_path)?;

let build_parameters = DiskIndexBuildParameters::new(
MemoryBudget::try_from_gb(params.build_ram_limit_gb)?,
params.quantization_type,
NumPQChunks::new_with(params.num_pq_chunks.get(), metadata.ndims())?,
);
let search_pq_chunks = NumPQChunks::new_with(params.num_pq_chunks.get(), metadata.ndims())?;
let build_parameters = match &params.build_algorithm {
diskann_disk::BuildAlgorithm::Vamana => DiskIndexBuildParameters::new(
MemoryBudget::try_from_gb(params.build_ram_limit_gb)?,
params.quantization_type.ok_or_else(|| {
anyhow::anyhow!("quantization_type is required for Vamana builds")
})?,
search_pq_chunks,
),
#[cfg(feature = "pipnn")]
diskann_disk::BuildAlgorithm::PiPNN(config) => DiskIndexBuildParameters::new_pipnn(
MemoryBudget::try_from_gb(params.build_ram_limit_gb)?,
search_pq_chunks,
config.clone(),
),
_ => anyhow::bail!("unsupported disk graph-build algorithm"),
};

let index_configuration = IndexConfiguration::new(
metric,
Expand Down
56 changes: 36 additions & 20 deletions diskann-benchmark/src/index/benchmarks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -212,26 +212,42 @@ where
writeln!(output, "{}", input)?;
let (index, build_stats) = match &input.source {
IndexSource::Build(build) => {
let (index, build_stats) = run_build(
build,
common::FullPrecision,
None,
output,
|data| {
let index = diskann_async::new_index::<T, _>(
build.try_as_config()?.build()?,
build.inmem_parameters(data.nrows(), data.ncols()),
common::NoDeletes,
)?;
build::set_start_points(
index.provider(),
data.as_view(),
*build.start_point_strategy(),
)?;
Ok(index)
},
single_or_multi_insert,
)?;
let mut incremental = || {
run_build(
build,
common::FullPrecision,
None,
output,
|data| {
let index = diskann_async::new_index::<T, _>(
build.try_as_config()?.build()?,
build.inmem_parameters(data.nrows(), data.ncols()),
common::NoDeletes,
)?;
build::set_start_points(
index.provider(),
data.as_view(),
*build.start_point_strategy(),
)?;
Ok(index)
},
single_or_multi_insert,
)
};
// PiPNN uses the batch build path. Do not create an incremental
// provider or run Vamana insertion.
#[cfg(feature = "pipnn")]
let result = match build.build_algorithm() {
diskann_disk::BuildAlgorithm::PiPNN(parameters) => {
let data =
Arc::new(datafiles::load_dataset(datafiles::BinFile(build.data()))?);
build::pipnn_build(data, build, parameters)
}
_ => incremental(),
};
#[cfg(not(feature = "pipnn"))]
let result = incremental();
let (index, build_stats) = result?;

// save the index if requested
if let Some(save_path) = build.save_path() {
Expand Down
Loading