Skip to content

Commit ee075bc

Browse files
[8.2] [MOD-11784] [MOD-11785] use updateTriggerThreshold as training TH for non- compressed svs tired index (#798)
* [MOD-11784] [MOD-11785] use updateTriggerThreshold as training TH for non- compressed svs tired index (#795) * use updateTriggerThreshold for training TH for non- compression index in svs tired index * * Renamed `SVS_DEFAULT_UPDATE_THRESHOLD` → `SVS_VAMANA_DEFAULT_UPDATE_THRESHOLD` * Exposed `SVS_VAMANA_DEFAULT_UPDATE_THRESHOLD` to `vec_sim_common.h` to allow usage in RedisSearch. * fix test * apply review suggetion (cherry picked from commit 4f58e35) * remov is multi --------- Co-authored-by: meiravgri <[email protected]> Co-authored-by: meiravgri <[email protected]>
1 parent a35de4f commit ee075bc

File tree

4 files changed

+57
-26
lines changed

4 files changed

+57
-26
lines changed

src/VecSim/algorithms/svs/svs_tiered.h

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -594,21 +594,25 @@ class TieredSVSIndex : public VecSimTieredIndex<DataType, float> {
594594
uncompletedJobs(this->allocator) {
595595
const auto &tiered_svs_params = tiered_index_params.specificParams.tieredSVSParams;
596596

597-
this->trainingTriggerThreshold =
598-
tiered_svs_params.trainingTriggerThreshold == 0
599-
? SVS_VAMANA_DEFAULT_TRAINING_THRESHOLD
600-
: std::min(tiered_svs_params.trainingTriggerThreshold, SVS_MAX_TRAINING_THRESHOLD);
601-
602597
// If flatBufferLimit is not initialized (0), use the default update threshold.
603598
const size_t flat_buffer_bound = tiered_index_params.flatBufferLimit == 0
604-
? SVS_DEFAULT_UPDATE_THRESHOLD
599+
? SVS_VAMANA_DEFAULT_UPDATE_THRESHOLD
605600
: tiered_index_params.flatBufferLimit;
606601

607602
this->updateTriggerThreshold =
608603
tiered_svs_params.updateTriggerThreshold == 0
609-
? SVS_DEFAULT_UPDATE_THRESHOLD
604+
? SVS_VAMANA_DEFAULT_UPDATE_THRESHOLD
610605
: std::min({tiered_svs_params.updateTriggerThreshold, flat_buffer_bound,
611-
SVS_DEFAULT_UPDATE_THRESHOLD});
606+
static_cast<size_t>(SVS_VAMANA_DEFAULT_UPDATE_THRESHOLD)});
607+
608+
const size_t default_training_threshold = this->GetSVSIndex()->isCompressed()
609+
? SVS_VAMANA_DEFAULT_TRAINING_THRESHOLD
610+
: this->updateTriggerThreshold;
611+
612+
this->trainingTriggerThreshold =
613+
tiered_svs_params.trainingTriggerThreshold == 0
614+
? default_training_threshold
615+
: std::min(tiered_svs_params.trainingTriggerThreshold, SVS_MAX_TRAINING_THRESHOLD);
612616

613617
this->updateJobWaitTime = tiered_svs_params.updateJobWaitTime == 0
614618
? SVS_DEFAULT_UPDATE_JOB_WAIT_TIME

src/VecSim/algorithms/svs/svs_utils.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@
2626

2727
// Maximum training threshold for SVS index, used to limit the size of training data
2828
constexpr size_t SVS_MAX_TRAINING_THRESHOLD = 100 * DEFAULT_BLOCK_SIZE; // 100 * 1024 vectors
29-
// Default batch update threshold for SVS index.
30-
constexpr size_t SVS_DEFAULT_UPDATE_THRESHOLD = 1 * DEFAULT_BLOCK_SIZE; // 1 * 1024 vectors
3129
// Default wait time for the update job in microseconds
3230
constexpr size_t SVS_DEFAULT_UPDATE_JOB_WAIT_TIME = 100; // 0.1 ms
3331

src/VecSim/vec_sim_common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ extern "C" {
4343
// it might be good to implement a utility to compute default threshold based on index parameters
4444
// DEFAULT_BLOCK_SIZE is used to round the training threshold to FLAT index blocks
4545
#define SVS_VAMANA_DEFAULT_TRAINING_THRESHOLD (10 * DEFAULT_BLOCK_SIZE) // 10 * 1024 vectors
46+
// Default batch update threshold for SVS index.
47+
#define SVS_VAMANA_DEFAULT_UPDATE_THRESHOLD (1 * DEFAULT_BLOCK_SIZE) // 1 * 1024 vectors
4648
#define SVS_VAMANA_DEFAULT_SEARCH_WINDOW_SIZE 10
4749
// NOTE: No need to have SVS_VAMANA_DEFAULT_SEARCH_BUFFER_CAPACITY
4850
// as the default is determined by the search_window_size

tests/unit/test_svs_tiered.cpp

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,19 @@ template <typename index_type_t>
6060
class SVSTieredIndexTest : public ::testing::Test {
6161
public:
6262
using data_t = typename index_type_t::data_t;
63-
static const size_t defaultTrainingThreshold = 1024;
64-
static const size_t defaultUpdateThreshold = 16;
63+
static const size_t TestsDefaultTrainingThreshold = 1024;
64+
static const size_t TestsDefaultUpdateThreshold = 16;
6565

6666
protected:
6767
TieredSVSIndex<data_t> *CastToTieredSVS(VecSimIndex *index) {
6868
return reinterpret_cast<TieredSVSIndex<data_t> *>(index);
6969
}
7070

71-
TieredIndexParams CreateTieredSVSParams(VecSimParams &svs_params,
72-
tieredIndexMock &mock_thread_pool,
73-
size_t training_threshold = defaultTrainingThreshold,
74-
size_t update_threshold = defaultUpdateThreshold) {
71+
TieredIndexParams
72+
CreateTieredSVSParams(VecSimParams &svs_params, tieredIndexMock &mock_thread_pool,
73+
size_t training_threshold = TestsDefaultTrainingThreshold,
74+
size_t update_threshold = TestsDefaultUpdateThreshold,
75+
size_t update_job_wait_time = SVS_DEFAULT_UPDATE_JOB_WAIT_TIME) {
7576
trainingThreshold = training_threshold;
7677
updateThreshold = update_threshold;
7778
svs_params.algoParams.svsParams.quantBits = index_type_t::get_quant_bits();
@@ -85,7 +86,8 @@ class SVSTieredIndexTest : public ::testing::Test {
8586
.primaryIndexParams = &svs_params,
8687
.specificParams = {.tieredSVSParams =
8788
TieredSVSParams{.trainingTriggerThreshold = training_threshold,
88-
.updateTriggerThreshold = update_threshold}}};
89+
.updateTriggerThreshold = update_threshold,
90+
.updateJobWaitTime = update_job_wait_time}}};
8991
}
9092

9193
TieredSVSIndex<data_t> *CreateTieredSVSIndex(const TieredIndexParams &tiered_params,
@@ -101,11 +103,13 @@ class SVSTieredIndexTest : public ::testing::Test {
101103

102104
TieredSVSIndex<data_t> *
103105
CreateTieredSVSIndex(VecSimParams &svs_params, tieredIndexMock &mock_thread_pool,
104-
size_t training_threshold = defaultTrainingThreshold,
105-
size_t update_threshold = defaultUpdateThreshold) {
106+
size_t training_threshold = TestsDefaultTrainingThreshold,
107+
size_t update_threshold = TestsDefaultUpdateThreshold,
108+
size_t update_job_wait_time = SVS_DEFAULT_UPDATE_JOB_WAIT_TIME) {
106109
svs_params.algoParams.svsParams.quantBits = index_type_t::get_quant_bits();
107-
TieredIndexParams tiered_params = CreateTieredSVSParams(
108-
svs_params, mock_thread_pool, training_threshold, update_threshold);
110+
TieredIndexParams tiered_params =
111+
CreateTieredSVSParams(svs_params, mock_thread_pool, training_threshold,
112+
update_threshold, update_job_wait_time);
109113
return CreateTieredSVSIndex(tiered_params, mock_thread_pool);
110114
}
111115

@@ -128,8 +132,8 @@ class SVSTieredIndexTest : public ::testing::Test {
128132
size_t getUpdateThreshold() const { return updateThreshold; }
129133

130134
private:
131-
size_t trainingThreshold = defaultTrainingThreshold;
132-
size_t updateThreshold = defaultUpdateThreshold;
135+
size_t trainingThreshold = TestsDefaultTrainingThreshold;
136+
size_t updateThreshold = TestsDefaultUpdateThreshold;
133137
};
134138

135139
// TEST_DATA_T and TEST_DIST_T are defined in test_utils.h
@@ -2108,6 +2112,30 @@ TYPED_TEST(SVSTieredIndexTestBasic, overwriteVectorAsync) {
21082112
}
21092113
}
21102114

2115+
TYPED_TEST(SVSTieredIndexTest, testCreateWithDefaultTieredSVSParams) {
2116+
// Create TieredSVS index instance with a mock queue.
2117+
size_t dim = 4;
2118+
SVSParams params = {.type = TypeParam::get_index_type(), .dim = dim, .metric = VecSimMetric_L2};
2119+
VecSimParams svs_params = CreateParams(params);
2120+
auto mock_thread_pool = tieredIndexMock();
2121+
2122+
// Build with default specificTieredBackendInfo.svsTieredInfo params
2123+
auto *tiered_index = this->CreateTieredSVSIndex(svs_params, mock_thread_pool, 0, 0, 0);
2124+
ASSERT_INDEX(tiered_index);
2125+
2126+
VecSimIndexDebugInfo info = tiered_index->debugInfo();
2127+
// Validate tiered svs info fields
2128+
constexpr size_t expected_training_threshold =
2129+
TypeParam::get_quant_bits() == VecSimSvsQuant_NONE ? SVS_VAMANA_DEFAULT_UPDATE_THRESHOLD
2130+
: SVS_VAMANA_DEFAULT_TRAINING_THRESHOLD;
2131+
EXPECT_EQ(info.tieredInfo.specificTieredBackendInfo.svsTieredInfo.trainingTriggerThreshold,
2132+
expected_training_threshold);
2133+
EXPECT_EQ(info.tieredInfo.specificTieredBackendInfo.svsTieredInfo.updateTriggerThreshold,
2134+
SVS_VAMANA_DEFAULT_UPDATE_THRESHOLD);
2135+
EXPECT_EQ(info.tieredInfo.specificTieredBackendInfo.svsTieredInfo.updateJobWaitTime,
2136+
SVS_DEFAULT_UPDATE_JOB_WAIT_TIME);
2137+
}
2138+
21112139
TYPED_TEST(SVSTieredIndexTest, testInfo) {
21122140
// Create TieredSVS index instance with a mock queue.
21132141
size_t dim = 4;
@@ -2116,7 +2144,7 @@ TYPED_TEST(SVSTieredIndexTest, testInfo) {
21162144
VecSimParams svs_params = CreateParams(params);
21172145
auto mock_thread_pool = tieredIndexMock();
21182146

2119-
auto *tiered_index = this->CreateTieredSVSIndex(svs_params, mock_thread_pool, 1, 1);
2147+
auto *tiered_index = this->CreateTieredSVSIndex(svs_params, mock_thread_pool, 1, 1, 1);
21202148
ASSERT_INDEX(tiered_index);
21212149
auto allocator = tiered_index->getAllocator();
21222150

@@ -2145,8 +2173,7 @@ TYPED_TEST(SVSTieredIndexTest, testInfo) {
21452173
// Validate tiered svs info fields
21462174
EXPECT_EQ(info.tieredInfo.specificTieredBackendInfo.svsTieredInfo.trainingTriggerThreshold, 1);
21472175
EXPECT_EQ(info.tieredInfo.specificTieredBackendInfo.svsTieredInfo.updateTriggerThreshold, 1);
2148-
EXPECT_EQ(info.tieredInfo.specificTieredBackendInfo.svsTieredInfo.updateJobWaitTime,
2149-
SVS_DEFAULT_UPDATE_JOB_WAIT_TIME);
2176+
EXPECT_EQ(info.tieredInfo.specificTieredBackendInfo.svsTieredInfo.updateJobWaitTime, 1);
21502177
EXPECT_EQ(info.tieredInfo.specificTieredBackendInfo.svsTieredInfo.indexUpdateScheduled, false);
21512178

21522179
// Validate that Static info returns the right restricted info as well.

0 commit comments

Comments
 (0)