Skip to content

Commit 635bbcb

Browse files
authored
Merge branch 'main' into gpipnn_core
2 parents 79e55b5 + 920fc83 commit 635bbcb

76 files changed

Lines changed: 2694 additions & 660 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/workflows/build.yaml‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,20 @@ concurrency:
3535
permissions: {}
3636

3737
jobs:
38+
checks:
39+
if: ${{ github.ref == 'refs/heads/main' }}
40+
permissions:
41+
actions: read
42+
contents: read
43+
uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@main
44+
with:
45+
# Seed the default-branch pre-commit cache without running checks that only apply to PRs.
46+
base-branch: main
47+
enable_check_size: false
48+
enable_check_generated_files: false
49+
enable_check_pr_job_dependencies: false
50+
enable_check_version_files_changed: false
51+
enable_check_version_against_tag: false
3852
build-details:
3953
uses: rapidsai/shared-workflows/.github/workflows/compute-build-details.yaml@main
4054
cpp-build:

‎.github/workflows/pr.yaml‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,9 @@ jobs:
434434
contents: read
435435
with:
436436
enable_check_generated_files: false
437+
# Main builds seed this cache. PR merge refs can restore it but should not create
438+
# duplicate archives that are inaccessible to other PRs.
439+
pre-commit-cache-read-only: true
437440
check-c-abi:
438441
permissions:
439442
actions: read

‎c/src/neighbors/mg_cagra.cpp‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -325,12 +325,12 @@ void* _mg_deserialize(cuvsResources_t res, const char* filename, mg_cagra_datase
325325
if (layout == mg_cagra_dataset_layout::device_padded) {
326326
using padded_ann_t = cuvs::neighbors::cagra::device_padded_index<T, uint32_t>;
327327
auto* mg_index = new mg_cagra_index_t<T, padded_ann_t>(*res_ptr, cuvs::neighbors::REPLICATED);
328-
cuvs::neighbors::cagra::deserialize<T, uint32_t>(*res_ptr, std::string(filename), mg_index);
328+
cuvs::neighbors::cagra::deserialize(*res_ptr, std::string(filename), mg_index);
329329
return make_mg_cagra_box<T, padded_ann_t>(mg_index, mg_cagra_dataset_layout::device_padded);
330330
}
331331
using standard_ann_t = cuvs::neighbors::cagra::device_standard_index<T, uint32_t>;
332332
auto* mg_index = new mg_cagra_index_t<T, standard_ann_t>(*res_ptr, cuvs::neighbors::REPLICATED);
333-
cuvs::neighbors::cagra::deserialize<T, uint32_t>(*res_ptr, std::string(filename), mg_index);
333+
cuvs::neighbors::cagra::deserialize(*res_ptr, std::string(filename), mg_index);
334334
return make_mg_cagra_box<T, standard_ann_t>(mg_index, mg_cagra_dataset_layout::device_standard);
335335
}
336336

@@ -341,12 +341,12 @@ void* _mg_distribute(cuvsResources_t res, const char* filename, mg_cagra_dataset
341341
if (layout == mg_cagra_dataset_layout::device_padded) {
342342
using padded_ann_t = cuvs::neighbors::cagra::device_padded_index<T, uint32_t>;
343343
auto* mg_index = new mg_cagra_index_t<T, padded_ann_t>(*res_ptr, cuvs::neighbors::REPLICATED);
344-
cuvs::neighbors::cagra::distribute<T, uint32_t>(*res_ptr, std::string(filename), mg_index);
344+
cuvs::neighbors::cagra::distribute(*res_ptr, std::string(filename), mg_index);
345345
return make_mg_cagra_box<T, padded_ann_t>(mg_index, mg_cagra_dataset_layout::device_padded);
346346
}
347347
using standard_ann_t = cuvs::neighbors::cagra::device_standard_index<T, uint32_t>;
348348
auto* mg_index = new mg_cagra_index_t<T, standard_ann_t>(*res_ptr, cuvs::neighbors::REPLICATED);
349-
cuvs::neighbors::cagra::distribute<T, uint32_t>(*res_ptr, std::string(filename), mg_index);
349+
cuvs::neighbors::cagra::distribute(*res_ptr, std::string(filename), mg_index);
350350
return make_mg_cagra_box<T, standard_ann_t>(mg_index, mg_cagra_dataset_layout::device_standard);
351351
}
352352

‎cpp/bench/ann/src/cuvs/cuvs_mg_cagra_wrapper.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ void cuvs_mg_cagra<T, IdxT>::load(const std::string& file)
151151
index_ = std::make_shared<
152152
cuvs::neighbors::mg_index<cuvs::neighbors::cagra::device_padded_index<T, IdxT>, T, IdxT>>(
153153
clique_, index_params_.mode);
154-
cuvs::neighbors::cagra::deserialize<T, IdxT>(clique_, file, index_.get());
154+
cuvs::neighbors::cagra::deserialize(clique_, file, index_.get());
155155
query_dim_ = static_cast<uint32_t>(dim_);
156156
if (!index_->ann_interfaces_.empty() && index_->ann_interfaces_[0].index_.has_value()) {
157157
query_dim_ = static_cast<uint32_t>(index_->ann_interfaces_[0].index_->dim());

‎cpp/include/cuvs/neighbors/cagra.hpp‎

Lines changed: 152 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3494,9 +3494,9 @@ struct merge_params {
34943494

34953495
/** @brief Merge multiple physical CAGRA indices into one.
34963496
*
3497-
* The overload without `merge_params` uses `merge_algo::AUTO`. AUTO runs Fastener only after a
3498-
* non-mutating preflight validates every input and option; otherwise it calls the existing rebuild
3499-
* implementation. REBUILD always preserves every input dataset.
3497+
* `merge_params` selects the algorithm and defaults to `merge_algo::AUTO`. AUTO runs Fastener only
3498+
* after a non-mutating preflight validates every input and option; otherwise it calls the existing
3499+
* rebuild implementation. REBUILD always preserves every input dataset.
35003500
*
35013501
* Fastener supports unfiltered, uncompressed `float`, `half`, `int8_t`, and `uint8_t`
35023502
* indices using L2Expanded and `uint32_t` graph IDs. Fastener uses `root_fanout` at the first
@@ -3510,40 +3510,91 @@ struct merge_params {
35103510
* which holds only a view of it.
35113511
*
35123512
* @note This API only supports physical merge (`merge_strategy = MERGE_STRATEGY_PHYSICAL`).
3513-
* All input indices must use the same `DatasetViewT` (dense padded or standard device views),
3514-
* and must share one row stride.
3513+
* All input indices must use the same dataset layout (device padded or device standard), and must
3514+
* share one row stride.
35153515
*
35163516
* @param[in] res RAFT resources used for the merge.
35173517
* @param[in] params Parameters for the returned CAGRA index.
35183518
* @param[in] indices CAGRA indices to merge.
35193519
* @param[in] merged_dataset Caller-owned storage for the consolidated dataset. Must have one row
35203520
* per retained vector after applying `row_filter`, and the same dimension and stride as the input
35213521
* datasets.
3522+
* @param[in] merge_params Parameters for the merge, including the algorithm selection.
35223523
* @param[in] row_filter Optional row filter. Any filter selects rebuild in AUTO and is rejected by
35233524
* explicit FASTENER.
35243525
* @return The merged physical CAGRA index.
35253526
*/
3526-
template <typename T, typename IdxT, cuvs::neighbors::ann_dataset_view DatasetViewT>
35273527
auto merge(raft::resources const& res,
35283528
const cuvs::neighbors::cagra::index_params& params,
3529-
std::vector<cuvs::neighbors::cagra::index<T, IdxT, DatasetViewT>*>& indices,
3530-
DatasetViewT merged_dataset,
3529+
std::vector<cuvs::neighbors::cagra::device_padded_index<float, uint32_t>*>& indices,
3530+
cuvs::neighbors::device_padded_dataset_view<float, int64_t> merged_dataset,
3531+
const cuvs::neighbors::cagra::merge_params& merge_params = {},
35313532
const cuvs::neighbors::filtering::base_filter& row_filter =
35323533
cuvs::neighbors::filtering::none_sample_filter{})
3533-
-> cuvs::neighbors::cagra::index<T, IdxT, DatasetViewT>;
3534+
-> cuvs::neighbors::cagra::device_padded_index<float, uint32_t>;
3535+
3536+
auto merge(raft::resources const& res,
3537+
const cuvs::neighbors::cagra::index_params& params,
3538+
std::vector<cuvs::neighbors::cagra::device_standard_index<float, uint32_t>*>& indices,
3539+
cuvs::neighbors::device_standard_dataset_view<float, int64_t> merged_dataset,
3540+
const cuvs::neighbors::cagra::merge_params& merge_params = {},
3541+
const cuvs::neighbors::filtering::base_filter& row_filter =
3542+
cuvs::neighbors::filtering::none_sample_filter{})
3543+
-> cuvs::neighbors::cagra::device_standard_index<float, uint32_t>;
3544+
3545+
auto merge(raft::resources const& res,
3546+
const cuvs::neighbors::cagra::index_params& params,
3547+
std::vector<cuvs::neighbors::cagra::device_padded_index<half, uint32_t>*>& indices,
3548+
cuvs::neighbors::device_padded_dataset_view<half, int64_t> merged_dataset,
3549+
const cuvs::neighbors::cagra::merge_params& merge_params = {},
3550+
const cuvs::neighbors::filtering::base_filter& row_filter =
3551+
cuvs::neighbors::filtering::none_sample_filter{})
3552+
-> cuvs::neighbors::cagra::device_padded_index<half, uint32_t>;
3553+
3554+
auto merge(raft::resources const& res,
3555+
const cuvs::neighbors::cagra::index_params& params,
3556+
std::vector<cuvs::neighbors::cagra::device_standard_index<half, uint32_t>*>& indices,
3557+
cuvs::neighbors::device_standard_dataset_view<half, int64_t> merged_dataset,
3558+
const cuvs::neighbors::cagra::merge_params& merge_params = {},
3559+
const cuvs::neighbors::filtering::base_filter& row_filter =
3560+
cuvs::neighbors::filtering::none_sample_filter{})
3561+
-> cuvs::neighbors::cagra::device_standard_index<half, uint32_t>;
3562+
3563+
auto merge(raft::resources const& res,
3564+
const cuvs::neighbors::cagra::index_params& params,
3565+
std::vector<cuvs::neighbors::cagra::device_padded_index<int8_t, uint32_t>*>& indices,
3566+
cuvs::neighbors::device_padded_dataset_view<int8_t, int64_t> merged_dataset,
3567+
const cuvs::neighbors::cagra::merge_params& merge_params = {},
3568+
const cuvs::neighbors::filtering::base_filter& row_filter =
3569+
cuvs::neighbors::filtering::none_sample_filter{})
3570+
-> cuvs::neighbors::cagra::device_padded_index<int8_t, uint32_t>;
35343571

3535-
/** @copydoc merge
3536-
* @param[in] merge_params Parameters for the merge, including the algorithm selection.
3537-
*/
3538-
template <typename T, typename IdxT, cuvs::neighbors::ann_dataset_view DatasetViewT>
35393572
auto merge(raft::resources const& res,
35403573
const cuvs::neighbors::cagra::index_params& params,
3541-
std::vector<cuvs::neighbors::cagra::index<T, IdxT, DatasetViewT>*>& indices,
3542-
DatasetViewT merged_dataset,
3543-
const cuvs::neighbors::cagra::merge_params& merge_params,
3574+
std::vector<cuvs::neighbors::cagra::device_standard_index<int8_t, uint32_t>*>& indices,
3575+
cuvs::neighbors::device_standard_dataset_view<int8_t, int64_t> merged_dataset,
3576+
const cuvs::neighbors::cagra::merge_params& merge_params = {},
35443577
const cuvs::neighbors::filtering::base_filter& row_filter =
35453578
cuvs::neighbors::filtering::none_sample_filter{})
3546-
-> cuvs::neighbors::cagra::index<T, IdxT, DatasetViewT>;
3579+
-> cuvs::neighbors::cagra::device_standard_index<int8_t, uint32_t>;
3580+
3581+
auto merge(raft::resources const& res,
3582+
const cuvs::neighbors::cagra::index_params& params,
3583+
std::vector<cuvs::neighbors::cagra::device_padded_index<uint8_t, uint32_t>*>& indices,
3584+
cuvs::neighbors::device_padded_dataset_view<uint8_t, int64_t> merged_dataset,
3585+
const cuvs::neighbors::cagra::merge_params& merge_params = {},
3586+
const cuvs::neighbors::filtering::base_filter& row_filter =
3587+
cuvs::neighbors::filtering::none_sample_filter{})
3588+
-> cuvs::neighbors::cagra::device_padded_index<uint8_t, uint32_t>;
3589+
3590+
auto merge(raft::resources const& res,
3591+
const cuvs::neighbors::cagra::index_params& params,
3592+
std::vector<cuvs::neighbors::cagra::device_standard_index<uint8_t, uint32_t>*>& indices,
3593+
cuvs::neighbors::device_standard_dataset_view<uint8_t, int64_t> merged_dataset,
3594+
const cuvs::neighbors::cagra::merge_params& merge_params = {},
3595+
const cuvs::neighbors::filtering::base_filter& row_filter =
3596+
cuvs::neighbors::filtering::none_sample_filter{})
3597+
-> cuvs::neighbors::cagra::device_standard_index<uint8_t, uint32_t>;
35473598

35483599
/**
35493600
* @}
@@ -4388,23 +4439,56 @@ void serialize(const raft::resources& clique,
43884439
* cuvs::neighbors::cagra::serialize(clique, index, filename);
43894440
* cuvs::neighbors::mg_index<cagra::device_standard_index<float, uint32_t>, float, uint32_t>
43904441
* new_index(clique, REPLICATED);
4391-
* cuvs::neighbors::cagra::deserialize<float, uint32_t>(clique, filename, &new_index);
4442+
* cuvs::neighbors::cagra::deserialize(clique, filename, &new_index);
43924443
*
43934444
* @endcode
43944445
*
43954446
* @param[in] clique a `raft::resources` object specifying the NCCL clique configuration
43964447
* @param[in] filename path to the file to be deserialized
43974448
*
43984449
*/
4399-
template <typename T, typename IdxT>
4400-
void deserialize(const raft::resources& clique,
4401-
const std::string& filename,
4402-
cuvs::neighbors::mg_index<cagra::device_standard_index<T, IdxT>, T, IdxT>* index);
4450+
void deserialize(
4451+
const raft::resources& clique,
4452+
const std::string& filename,
4453+
cuvs::neighbors::mg_index<cagra::device_padded_index<float, uint32_t>, float, uint32_t>* index);
44034454

4404-
template <typename T, typename IdxT>
4405-
void deserialize(const raft::resources& clique,
4406-
const std::string& filename,
4407-
cuvs::neighbors::mg_index<cagra::device_padded_index<T, IdxT>, T, IdxT>* index);
4455+
void deserialize(
4456+
const raft::resources& clique,
4457+
const std::string& filename,
4458+
cuvs::neighbors::mg_index<cagra::device_standard_index<float, uint32_t>, float, uint32_t>* index);
4459+
4460+
void deserialize(
4461+
const raft::resources& clique,
4462+
const std::string& filename,
4463+
cuvs::neighbors::mg_index<cagra::device_padded_index<half, uint32_t>, half, uint32_t>* index);
4464+
4465+
void deserialize(
4466+
const raft::resources& clique,
4467+
const std::string& filename,
4468+
cuvs::neighbors::mg_index<cagra::device_standard_index<half, uint32_t>, half, uint32_t>* index);
4469+
4470+
void deserialize(
4471+
const raft::resources& clique,
4472+
const std::string& filename,
4473+
cuvs::neighbors::mg_index<cagra::device_padded_index<int8_t, uint32_t>, int8_t, uint32_t>* index);
4474+
4475+
void deserialize(
4476+
const raft::resources& clique,
4477+
const std::string& filename,
4478+
cuvs::neighbors::mg_index<cagra::device_standard_index<int8_t, uint32_t>, int8_t, uint32_t>*
4479+
index);
4480+
4481+
void deserialize(
4482+
const raft::resources& clique,
4483+
const std::string& filename,
4484+
cuvs::neighbors::mg_index<cagra::device_padded_index<uint8_t, uint32_t>, uint8_t, uint32_t>*
4485+
index);
4486+
4487+
void deserialize(
4488+
const raft::resources& clique,
4489+
const std::string& filename,
4490+
cuvs::neighbors::mg_index<cagra::device_standard_index<uint8_t, uint32_t>, uint8_t, uint32_t>*
4491+
index);
44084492

44094493
/// \defgroup mg_cpp_distribute ANN MG local index distribution
44104494

@@ -4422,23 +4506,56 @@ void deserialize(const raft::resources& clique,
44224506
* cuvs::neighbors::cagra::serialize(clique, filename, index);
44234507
* cuvs::neighbors::mg_index<cagra::device_standard_index<float, uint32_t>, float, uint32_t>
44244508
* distributed_index(clique, REPLICATED);
4425-
* cuvs::neighbors::cagra::distribute<float, uint32_t>(clique, filename, &distributed_index);
4509+
* cuvs::neighbors::cagra::distribute(clique, filename, &distributed_index);
44264510
*
44274511
* @endcode
44284512
*
44294513
* @param[in] clique a `raft::resources` object specifying the NCCL clique configuration
44304514
* @param[in] filename path to the file to be deserialized : a local index
44314515
*
44324516
*/
4433-
template <typename T, typename IdxT>
4434-
void distribute(const raft::resources& clique,
4435-
const std::string& filename,
4436-
cuvs::neighbors::mg_index<cagra::device_standard_index<T, IdxT>, T, IdxT>* index);
4517+
void distribute(
4518+
const raft::resources& clique,
4519+
const std::string& filename,
4520+
cuvs::neighbors::mg_index<cagra::device_padded_index<float, uint32_t>, float, uint32_t>* index);
44374521

4438-
template <typename T, typename IdxT>
4439-
void distribute(const raft::resources& clique,
4440-
const std::string& filename,
4441-
cuvs::neighbors::mg_index<cagra::device_padded_index<T, IdxT>, T, IdxT>* index);
4522+
void distribute(
4523+
const raft::resources& clique,
4524+
const std::string& filename,
4525+
cuvs::neighbors::mg_index<cagra::device_standard_index<float, uint32_t>, float, uint32_t>* index);
4526+
4527+
void distribute(
4528+
const raft::resources& clique,
4529+
const std::string& filename,
4530+
cuvs::neighbors::mg_index<cagra::device_padded_index<half, uint32_t>, half, uint32_t>* index);
4531+
4532+
void distribute(
4533+
const raft::resources& clique,
4534+
const std::string& filename,
4535+
cuvs::neighbors::mg_index<cagra::device_standard_index<half, uint32_t>, half, uint32_t>* index);
4536+
4537+
void distribute(
4538+
const raft::resources& clique,
4539+
const std::string& filename,
4540+
cuvs::neighbors::mg_index<cagra::device_padded_index<int8_t, uint32_t>, int8_t, uint32_t>* index);
4541+
4542+
void distribute(
4543+
const raft::resources& clique,
4544+
const std::string& filename,
4545+
cuvs::neighbors::mg_index<cagra::device_standard_index<int8_t, uint32_t>, int8_t, uint32_t>*
4546+
index);
4547+
4548+
void distribute(
4549+
const raft::resources& clique,
4550+
const std::string& filename,
4551+
cuvs::neighbors::mg_index<cagra::device_padded_index<uint8_t, uint32_t>, uint8_t, uint32_t>*
4552+
index);
4553+
4554+
void distribute(
4555+
const raft::resources& clique,
4556+
const std::string& filename,
4557+
cuvs::neighbors::mg_index<cagra::device_standard_index<uint8_t, uint32_t>, uint8_t, uint32_t>*
4558+
index);
44424559

44434560
/**
44444561
* @brief Build a kNN graph using IVF-PQ.

0 commit comments

Comments
 (0)