From a6ee19e7e3dfcbc39dfc637d02150b6bd5db357f Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Wed, 22 Jan 2025 13:52:06 -0800 Subject: [PATCH 1/5] Proposal to reduce CAGRA test runtime. --- cpp/test/CMakeLists.txt | 35 +++++++++++++-------- cpp/test/neighbors/ann_cagra.cuh | 53 +++++++++++++++++++------------- 2 files changed, 53 insertions(+), 35 deletions(-) diff --git a/cpp/test/CMakeLists.txt b/cpp/test/CMakeLists.txt index 9aa596a6e0..fdca48d71d 100644 --- a/cpp/test/CMakeLists.txt +++ b/cpp/test/CMakeLists.txt @@ -138,19 +138,28 @@ if(BUILD_TESTS) ) ConfigureTest( - NAME - NEIGHBORS_ANN_CAGRA_TEST - PATH - neighbors/ann_cagra/bug_extreme_inputs_oob.cu - neighbors/ann_cagra/bug_multi_cta_crash.cu - neighbors/ann_cagra/test_float_uint32_t.cu - neighbors/ann_cagra/test_half_uint32_t.cu - neighbors/ann_cagra/test_int8_t_uint32_t.cu - neighbors/ann_cagra/test_uint8_t_uint32_t.cu - GPUS - 1 - PERCENT - 100 + NAME NEIGHBORS_ANN_CAGRA_TEST_BUGS PATH neighbors/ann_cagra/bug_extreme_inputs_oob.cu + neighbors/ann_cagra/bug_multi_cta_crash.cu GPUS 1 PERCENT 100 + ) + + ConfigureTest( + NAME NEIGHBORS_ANN_CAGRA_FLOAT_UINT32_TEST PATH neighbors/ann_cagra/test_float_uint32_t.cu GPUS + 1 PERCENT 100 + ) + + ConfigureTest( + NAME NEIGHBORS_ANN_CAGRA_HALF_UINT32_TEST PATH neighbors/ann_cagra/test_half_uint32_t.cu GPUS 1 + PERCENT 100 + ) + + ConfigureTest( + NAME NEIGHBORS_ANN_CAGRA_INT8_UINT32_TEST PATH neighbors/ann_cagra/test_int8_t_uint32_t.cu GPUS + 1 PERCENT 100 + ) + + ConfigureTest( + NAME NEIGHBORS_ANN_CAGRA_UINT8_UINT32_TEST PATH neighbors/ann_cagra/test_uint8_t_uint32_t.cu + GPUS 1 PERCENT 100 ) ConfigureTest( diff --git a/cpp/test/neighbors/ann_cagra.cuh b/cpp/test/neighbors/ann_cagra.cuh index c1cd3ca090..9e72e0f6e1 100644 --- a/cpp/test/neighbors/ann_cagra.cuh +++ b/cpp/test/neighbors/ann_cagra.cuh @@ -876,14 +876,15 @@ class AnnCagraFilterTest : public ::testing::TestWithParam { inline std::vector generate_inputs() { // TODO(tfeher): test MULTI_CTA kernel with search_width > 1 to allow multiple CTA per queries + // Varying dim, k, graph_build_algo, search_algo, max_queries std::vector inputs = raft::util::itertools::product( {100}, {1000}, - {1, 8, 17}, + {1, 17}, {1, 16}, // k {graph_build_algo::IVF_PQ, graph_build_algo::NN_DESCENT}, {search_algo::SINGLE_CTA, search_algo::MULTI_CTA, search_algo::MULTI_KERNEL}, - {0, 1, 10, 100}, // query size + {0, 1, 100}, // query size {0}, {256}, {1}, @@ -892,11 +893,12 @@ inline std::vector generate_inputs() {true}, {0.995}); + // Varying dim, graph_build_algo auto inputs2 = raft::util::itertools::product( {100}, {1000}, - {1, 3, 5, 7, 8, 17, 64, 128, 137, 192, 256, 512, 619, 1024}, // dim - {16}, // k + {1, 3, 7, 17, 128, 192, 512, 1024}, // dim + {16}, // k {graph_build_algo::IVF_PQ, graph_build_algo::NN_DESCENT}, {search_algo::AUTO}, {10}, @@ -908,6 +910,8 @@ inline std::vector generate_inputs() {true}, {0.995}); inputs.insert(inputs.end(), inputs2.begin(), inputs2.end()); + + // Varying team_size, graph_build_algo inputs2 = raft::util::itertools::product( {100}, {1000}, @@ -925,6 +929,7 @@ inline std::vector generate_inputs() {0.995}); inputs.insert(inputs.end(), inputs2.begin(), inputs2.end()); + // Varying graph_build_algo, itopk_size inputs2 = raft::util::itertools::product( {100}, {1000}, @@ -942,6 +947,7 @@ inline std::vector generate_inputs() {0.995}); inputs.insert(inputs.end(), inputs2.begin(), inputs2.end()); + // Varying n_rows, host_dataset inputs2 = raft::util::itertools::product({100}, {10000, 20000}, @@ -959,7 +965,8 @@ inline std::vector generate_inputs() {0.985}); inputs.insert(inputs.end(), inputs2.begin(), inputs2.end()); - // a few PQ configurations + // A few PQ configurations. + // Varying dim, vq_n_centers inputs2 = raft::util::itertools::product( {100}, {10000}, @@ -987,11 +994,12 @@ inline std::vector generate_inputs() } } - // refinement options + // Refinement options + // Varying host_dataset, ivf_pq_search_refine_ratio inputs2 = raft::util::itertools::product({100}, {5000}, - {32, 64}, + {64}, {16}, {graph_build_algo::IVF_PQ}, {search_algo::AUTO}, @@ -1006,21 +1014,22 @@ inline std::vector generate_inputs() {1.0f, 2.0f, 3.0f}); inputs.insert(inputs.end(), inputs2.begin(), inputs2.end()); - inputs2 = raft::util::itertools::product( - {100}, - {1000}, - {1, 3, 5, 7, 8, 17, 64, 128, 137, 192, 256, 512, 619, 1024}, // dim - {10}, - {graph_build_algo::IVF_PQ}, - {search_algo::AUTO}, - {10}, - {0}, // team_size - {64}, - {1}, - {cuvs::distance::DistanceType::L2Expanded}, - {false}, - {false}, - {0.995}); + // Varying dim, adding non_owning_memory_buffer_flag + inputs2 = + raft::util::itertools::product({100}, + {1000}, + {1, 5, 8, 64, 137, 256, 619, 1024}, // dim + {10}, + {graph_build_algo::IVF_PQ}, + {search_algo::AUTO}, + {10}, + {0}, // team_size + {64}, + {1}, + {cuvs::distance::DistanceType::L2Expanded}, + {false}, + {false}, + {0.995}); for (auto input : inputs2) { input.non_owning_memory_buffer_flag = true; inputs.push_back(input); From 916c46927a454617853a34e65ce008aa0453a33e Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Thu, 23 Jan 2025 07:15:53 -0600 Subject: [PATCH 2/5] Update cpp/test/neighbors/ann_cagra.cuh --- cpp/test/neighbors/ann_cagra.cuh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/test/neighbors/ann_cagra.cuh b/cpp/test/neighbors/ann_cagra.cuh index 9e72e0f6e1..1ce99ec4d0 100644 --- a/cpp/test/neighbors/ann_cagra.cuh +++ b/cpp/test/neighbors/ann_cagra.cuh @@ -999,7 +999,7 @@ inline std::vector generate_inputs() inputs2 = raft::util::itertools::product({100}, {5000}, - {64}, + {32, 64}, {16}, {graph_build_algo::IVF_PQ}, {search_algo::AUTO}, From cb79e838df01a5fee4dff9d143d0d32bc5145fe6 Mon Sep 17 00:00:00 2001 From: Tamas Bela Feher Date: Thu, 23 Jan 2025 18:40:53 +0100 Subject: [PATCH 3/5] Test CAGRA addnode and filtering on a limeted set of inputs, reduce test combinations --- cpp/test/neighbors/ann_cagra.cuh | 175 +++++++++++++++++- .../ann_cagra/test_float_uint32_t.cu | 6 +- .../ann_cagra/test_int8_t_uint32_t.cu | 6 +- .../ann_cagra/test_uint8_t_uint32_t.cu | 6 +- 4 files changed, 177 insertions(+), 16 deletions(-) diff --git a/cpp/test/neighbors/ann_cagra.cuh b/cpp/test/neighbors/ann_cagra.cuh index 1ce99ec4d0..4e7aa9bbbe 100644 --- a/cpp/test/neighbors/ann_cagra.cuh +++ b/cpp/test/neighbors/ann_cagra.cuh @@ -876,15 +876,15 @@ class AnnCagraFilterTest : public ::testing::TestWithParam { inline std::vector generate_inputs() { // TODO(tfeher): test MULTI_CTA kernel with search_width > 1 to allow multiple CTA per queries - // Varying dim, k, graph_build_algo, search_algo, max_queries + // Charge graph dim, search algo and max_query parameter std::vector inputs = raft::util::itertools::product( {100}, {1000}, - {1, 17}, - {1, 16}, // k - {graph_build_algo::IVF_PQ, graph_build_algo::NN_DESCENT}, + {1, 8, 17}, + {16}, // k + {graph_build_algo::NN_DESCENT}, {search_algo::SINGLE_CTA, search_algo::MULTI_CTA, search_algo::MULTI_KERNEL}, - {0, 1, 100}, // query size + {0, 10}, // query size {0}, {256}, {1}, @@ -893,12 +893,30 @@ inline std::vector generate_inputs() {true}, {0.995}); - // Varying dim, graph_build_algo + // Fixed dim, and changing neighbors and query size (output matrix size) auto inputs2 = raft::util::itertools::product( + {1, 100}, + {1000}, + {8}, + {1, 16}, // k + {graph_build_algo::NN_DESCENT}, + {search_algo::SINGLE_CTA, search_algo::MULTI_CTA, search_algo::MULTI_KERNEL}, + {0}, // query size + {0}, + {256}, + {1}, + {cuvs::distance::DistanceType::L2Expanded}, + {false}, + {true}, + {0.995}); + inputs.insert(inputs.end(), inputs2.begin(), inputs2.end()); + + // Varying dim and build algo. + inputs2 = raft::util::itertools::product( {100}, {1000}, - {1, 3, 7, 17, 128, 192, 512, 1024}, // dim - {16}, // k + {1, 3, 5, 7, 8, 17, 64, 128, 137, 192, 256, 512, 1024}, // dim + {16}, // k {graph_build_algo::IVF_PQ, graph_build_algo::NN_DESCENT}, {search_algo::AUTO}, {10}, @@ -950,7 +968,7 @@ inline std::vector generate_inputs() // Varying n_rows, host_dataset inputs2 = raft::util::itertools::product({100}, - {10000, 20000}, + {10000}, {32}, {10}, {graph_build_algo::AUTO}, @@ -1038,6 +1056,143 @@ inline std::vector generate_inputs() return inputs; } -const std::vector inputs = generate_inputs(); +inline std::vector generate_addnode_inputs() +{ + // changing dim + std::vector inputs = + raft::util::itertools::product({100}, + {1000}, + {1, 8, 17, 64, 128, 137, 512, 1024}, // dim + {16}, // k + {graph_build_algo::NN_DESCENT}, + {search_algo::AUTO}, + {10}, + {0}, + {64}, + {1}, + {cuvs::distance::DistanceType::L2Expanded}, + {false}, + {true}, + {0.995}); + + // testing host and device datasets + auto inputs2 = + raft::util::itertools::product({100}, + {10000}, + {32}, + {10}, + {graph_build_algo::AUTO}, + {search_algo::AUTO}, + {10}, + {0}, // team_size + {64}, + {1}, + {cuvs::distance::DistanceType::L2Expanded}, + {false, true}, + {false}, + {0.985}); + inputs.insert(inputs.end(), inputs2.begin(), inputs2.end()); + + // a few PQ configurations + inputs2 = raft::util::itertools::product( + {100}, + {10000}, + {192, 1024}, // dim + {16}, // k + {graph_build_algo::IVF_PQ}, + {search_algo::AUTO}, + {10}, + {0}, + {64}, + {1}, + {cuvs::distance::DistanceType::L2Expanded}, + {false}, + {true}, + {0.6}); // don't demand high recall without refinement + for (uint32_t pq_len : {2}) { // for now, only pq_len = 2 is supported, more options coming soon + for (uint32_t vq_n_centers : {100}) { + for (auto input : inputs2) { + vpq_params ps{}; + ps.pq_dim = input.dim / pq_len; + ps.vq_n_centers = vq_n_centers; + input.compression.emplace(ps); + inputs.push_back(input); + } + } + } + + return inputs; +} + +inline std::vector generate_filtering_inputs() +{ + // Charge graph dim, search algo + std::vector inputs = raft::util::itertools::product( + {100}, + {1000}, + {1, 8, 17}, + {16}, // k + {graph_build_algo::NN_DESCENT}, + {search_algo::SINGLE_CTA, search_algo::MULTI_CTA, search_algo::MULTI_KERNEL}, + {0}, // query size + {0}, + {256}, + {1}, + {cuvs::distance::DistanceType::L2Expanded}, + {false}, + {true}, + {0.995}); + + // Fixed dim, and changing neighbors and query size (output matrix size) + auto inputs2 = raft::util::itertools::product( + {1, 100}, + {1000}, + {8}, + {1, 16}, // k + {graph_build_algo::NN_DESCENT}, + {search_algo::SINGLE_CTA, search_algo::MULTI_CTA, search_algo::MULTI_KERNEL}, + {0}, // query size + {0}, + {256}, + {1}, + {cuvs::distance::DistanceType::L2Expanded}, + {false}, + {true}, + {0.995}); + inputs.insert(inputs.end(), inputs2.begin(), inputs2.end()); + + // a few PQ configurations + inputs2 = raft::util::itertools::product( + {100}, + {10000}, + {256}, // dim + {16}, // k + {graph_build_algo::IVF_PQ}, + {search_algo::AUTO}, + {10}, + {0}, + {64}, + {1}, + {cuvs::distance::DistanceType::L2Expanded}, + {false}, + {true}, + {0.6}); // don't demand high recall without refinement + for (uint32_t pq_len : {2}) { // for now, only pq_len = 2 is supported, more options coming soon + for (uint32_t vq_n_centers : {100}) { + for (auto input : inputs2) { + vpq_params ps{}; + ps.pq_dim = input.dim / pq_len; + ps.vq_n_centers = vq_n_centers; + input.compression.emplace(ps); + inputs.push_back(input); + } + } + } + + return inputs; +} +const std::vector inputs = generate_inputs(); +const std::vector inputs_addnode = generate_addnode_inputs(); +const std::vector inputs_filtering = generate_filtering_inputs(); } // namespace cuvs::neighbors::cagra diff --git a/cpp/test/neighbors/ann_cagra/test_float_uint32_t.cu b/cpp/test/neighbors/ann_cagra/test_float_uint32_t.cu index ca188d1320..640657ccb8 100644 --- a/cpp/test/neighbors/ann_cagra/test_float_uint32_t.cu +++ b/cpp/test/neighbors/ann_cagra/test_float_uint32_t.cu @@ -32,7 +32,9 @@ TEST_P(AnnCagraFilterTestF_U32, AnnCagra) { this->testCagra(); } INSTANTIATE_TEST_CASE_P(AnnCagraTest, AnnCagraTestF_U32, ::testing::ValuesIn(inputs)); INSTANTIATE_TEST_CASE_P(AnnCagraAddNodesTest, AnnCagraAddNodesTestF_U32, - ::testing::ValuesIn(inputs)); -INSTANTIATE_TEST_CASE_P(AnnCagraFilterTest, AnnCagraFilterTestF_U32, ::testing::ValuesIn(inputs)); + ::testing::ValuesIn(inputs_addnode)); +INSTANTIATE_TEST_CASE_P(AnnCagraFilterTest, + AnnCagraFilterTestF_U32, + ::testing::ValuesIn(inputs_filtering)); } // namespace cuvs::neighbors::cagra diff --git a/cpp/test/neighbors/ann_cagra/test_int8_t_uint32_t.cu b/cpp/test/neighbors/ann_cagra/test_int8_t_uint32_t.cu index 4aa03afd58..32f6289fe5 100644 --- a/cpp/test/neighbors/ann_cagra/test_int8_t_uint32_t.cu +++ b/cpp/test/neighbors/ann_cagra/test_int8_t_uint32_t.cu @@ -30,7 +30,9 @@ TEST_P(AnnCagraFilterTestI8_U32, AnnCagra) { this->testCagra(); } INSTANTIATE_TEST_CASE_P(AnnCagraTest, AnnCagraTestI8_U32, ::testing::ValuesIn(inputs)); INSTANTIATE_TEST_CASE_P(AnnCagraAddNodesTest, AnnCagraAddNodesTestI8_U32, - ::testing::ValuesIn(inputs)); -INSTANTIATE_TEST_CASE_P(AnnCagraFilterTest, AnnCagraFilterTestI8_U32, ::testing::ValuesIn(inputs)); + ::testing::ValuesIn(inputs_addnode)); +INSTANTIATE_TEST_CASE_P(AnnCagraFilterTest, + AnnCagraFilterTestI8_U32, + ::testing::ValuesIn(inputs_filtering)); } // namespace cuvs::neighbors::cagra diff --git a/cpp/test/neighbors/ann_cagra/test_uint8_t_uint32_t.cu b/cpp/test/neighbors/ann_cagra/test_uint8_t_uint32_t.cu index b8e2a6b770..53f804be6e 100644 --- a/cpp/test/neighbors/ann_cagra/test_uint8_t_uint32_t.cu +++ b/cpp/test/neighbors/ann_cagra/test_uint8_t_uint32_t.cu @@ -30,7 +30,9 @@ TEST_P(AnnCagraFilterTestU8_U32, AnnCagra) { this->testCagra(); } INSTANTIATE_TEST_CASE_P(AnnCagraTest, AnnCagraTestU8_U32, ::testing::ValuesIn(inputs)); INSTANTIATE_TEST_CASE_P(AnnCagraAddNodesTest, AnnCagraAddNodesTestU8_U32, - ::testing::ValuesIn(inputs)); -INSTANTIATE_TEST_CASE_P(AnnCagraFilterTest, AnnCagraFilterTestU8_U32, ::testing::ValuesIn(inputs)); + ::testing::ValuesIn(inputs_addnode)); +INSTANTIATE_TEST_CASE_P(AnnCagraFilterTest, + AnnCagraFilterTestU8_U32, + ::testing::ValuesIn(inputs_filtering)); } // namespace cuvs::neighbors::cagra From e3423e62f16f7326801b6e86880c9121ab103fb8 Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Fri, 24 Jan 2025 17:50:44 -0600 Subject: [PATCH 4/5] Remove extra test. --- cpp/test/neighbors/ann_cagra.cuh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/test/neighbors/ann_cagra.cuh b/cpp/test/neighbors/ann_cagra.cuh index 4ff0eb3934..4aab89626f 100644 --- a/cpp/test/neighbors/ann_cagra.cuh +++ b/cpp/test/neighbors/ann_cagra.cuh @@ -996,7 +996,7 @@ inline std::vector generate_inputs() {0}, {64}, {1}, - {cuvs::distance::DistanceType::L2Expanded, cuvs::distance::DistanceType::InnerProduct}, + {cuvs::distance::DistanceType::L2Expanded}, {false}, {true}, {0.6}); // don't demand high recall without refinement From 4809576d44a0c18d42f5bc9ce114d5611dac44ff Mon Sep 17 00:00:00 2001 From: "Artem M. Chirkin" <9253178+achirkin@users.noreply.github.com> Date: Mon, 27 Jan 2025 08:29:34 +0100 Subject: [PATCH 5/5] Remove InnerProduct tests for compressed dataset cpp/test/neighbors/ann_cagra.cuh (not supported) --- cpp/test/neighbors/ann_cagra.cuh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/test/neighbors/ann_cagra.cuh b/cpp/test/neighbors/ann_cagra.cuh index 4aab89626f..cab91c6982 100644 --- a/cpp/test/neighbors/ann_cagra.cuh +++ b/cpp/test/neighbors/ann_cagra.cuh @@ -1173,7 +1173,7 @@ inline std::vector generate_filtering_inputs() {0}, {64}, {1}, - {cuvs::distance::DistanceType::L2Expanded, cuvs::distance::DistanceType::InnerProduct}, + {cuvs::distance::DistanceType::L2Expanded}, {false}, {true}, {0.6}); // don't demand high recall without refinement