Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
20 changes: 12 additions & 8 deletions src/VecSim/algorithms/svs/svs_tiered.h
Original file line number Diff line number Diff line change
Expand Up @@ -655,21 +655,25 @@ class TieredSVSIndex : public VecSimTieredIndex<DataType, float> {
uncompletedJobs(this->allocator) {
const auto &tiered_svs_params = tiered_index_params.specificParams.tieredSVSParams;

this->trainingTriggerThreshold =
tiered_svs_params.trainingTriggerThreshold == 0
? SVS_VAMANA_DEFAULT_TRAINING_THRESHOLD
: std::min(tiered_svs_params.trainingTriggerThreshold, SVS_MAX_TRAINING_THRESHOLD);

// If flatBufferLimit is not initialized (0), use the default update threshold.
const size_t flat_buffer_bound = tiered_index_params.flatBufferLimit == 0
? SVS_DEFAULT_UPDATE_THRESHOLD
? SVS_VAMANA_DEFAULT_UPDATE_THRESHOLD
: tiered_index_params.flatBufferLimit;

this->updateTriggerThreshold =
tiered_svs_params.updateTriggerThreshold == 0
? SVS_DEFAULT_UPDATE_THRESHOLD
? SVS_VAMANA_DEFAULT_UPDATE_THRESHOLD
: std::min({tiered_svs_params.updateTriggerThreshold, flat_buffer_bound,
SVS_DEFAULT_UPDATE_THRESHOLD});
static_cast<size_t>(SVS_VAMANA_DEFAULT_UPDATE_THRESHOLD)});

const size_t default_training_threshold = this->GetSVSIndex()->isCompressed()
? SVS_VAMANA_DEFAULT_TRAINING_THRESHOLD
: this->updateTriggerThreshold;

this->trainingTriggerThreshold =
tiered_svs_params.trainingTriggerThreshold == 0
? default_training_threshold
: std::min(tiered_svs_params.trainingTriggerThreshold, SVS_MAX_TRAINING_THRESHOLD);

this->updateJobWaitTime = tiered_svs_params.updateJobWaitTime == 0
? SVS_DEFAULT_UPDATE_JOB_WAIT_TIME
Expand Down
2 changes: 0 additions & 2 deletions src/VecSim/algorithms/svs/svs_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@

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

Expand Down
2 changes: 2 additions & 0 deletions src/VecSim/vec_sim_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ extern "C" {
// it might be good to implement a utility to compute default threshold based on index parameters
// DEFAULT_BLOCK_SIZE is used to round the training threshold to FLAT index blocks
#define SVS_VAMANA_DEFAULT_TRAINING_THRESHOLD (10 * DEFAULT_BLOCK_SIZE) // 10 * 1024 vectors
// Default batch update threshold for SVS index.
#define SVS_VAMANA_DEFAULT_UPDATE_THRESHOLD (1 * DEFAULT_BLOCK_SIZE) // 1 * 1024 vectors
#define SVS_VAMANA_DEFAULT_SEARCH_WINDOW_SIZE 10
// NOTE: No need to have SVS_VAMANA_DEFAULT_SEARCH_BUFFER_CAPACITY
// as the default is determined by the search_window_size
Expand Down
62 changes: 46 additions & 16 deletions tests/unit/test_svs_tiered.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,18 +60,19 @@ template <typename index_type_t>
class SVSTieredIndexTest : public ::testing::Test {
public:
using data_t = typename index_type_t::data_t;
static const size_t defaultTrainingThreshold = 1024;
static const size_t defaultUpdateThreshold = 16;
static const size_t TestsDefaultTrainingThreshold = 1024;
static const size_t TestsDefaultUpdateThreshold = 16;

protected:
TieredSVSIndex<data_t> *CastToTieredSVS(VecSimIndex *index) {
return reinterpret_cast<TieredSVSIndex<data_t> *>(index);
}

TieredIndexParams CreateTieredSVSParams(VecSimParams &svs_params,
tieredIndexMock &mock_thread_pool,
size_t training_threshold = defaultTrainingThreshold,
size_t update_threshold = defaultUpdateThreshold) {
TieredIndexParams
CreateTieredSVSParams(VecSimParams &svs_params, tieredIndexMock &mock_thread_pool,
size_t training_threshold = TestsDefaultTrainingThreshold,
size_t update_threshold = TestsDefaultUpdateThreshold,
size_t update_job_wait_time = SVS_DEFAULT_UPDATE_JOB_WAIT_TIME) {
trainingThreshold = training_threshold;
updateThreshold = update_threshold;
svs_params.algoParams.svsParams.quantBits = index_type_t::get_quant_bits();
Expand All @@ -85,7 +86,8 @@ class SVSTieredIndexTest : public ::testing::Test {
.primaryIndexParams = &svs_params,
.specificParams = {.tieredSVSParams =
TieredSVSParams{.trainingTriggerThreshold = training_threshold,
.updateTriggerThreshold = update_threshold}}};
.updateTriggerThreshold = update_threshold,
.updateJobWaitTime = update_job_wait_time}}};
}

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

TieredSVSIndex<data_t> *
CreateTieredSVSIndex(VecSimParams &svs_params, tieredIndexMock &mock_thread_pool,
size_t training_threshold = defaultTrainingThreshold,
size_t update_threshold = defaultUpdateThreshold) {
size_t training_threshold = TestsDefaultTrainingThreshold,
size_t update_threshold = TestsDefaultUpdateThreshold,
size_t update_job_wait_time = SVS_DEFAULT_UPDATE_JOB_WAIT_TIME) {
svs_params.algoParams.svsParams.quantBits = index_type_t::get_quant_bits();
TieredIndexParams tiered_params = CreateTieredSVSParams(
svs_params, mock_thread_pool, training_threshold, update_threshold);
TieredIndexParams tiered_params =
CreateTieredSVSParams(svs_params, mock_thread_pool, training_threshold,
update_threshold, update_job_wait_time);
return CreateTieredSVSIndex(tiered_params, mock_thread_pool);
}

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

private:
size_t trainingThreshold = defaultTrainingThreshold;
size_t updateThreshold = defaultUpdateThreshold;
size_t trainingThreshold = TestsDefaultTrainingThreshold;
size_t updateThreshold = TestsDefaultUpdateThreshold;
};

// TEST_DATA_T and TEST_DIST_T are defined in test_utils.h
Expand Down Expand Up @@ -2351,6 +2355,33 @@ TYPED_TEST(SVSTieredIndexTestBasic, overwriteVectorAsync) {
}
}

TYPED_TEST(SVSTieredIndexTest, testCreateWithDefaultTieredSVSParams) {
// Create TieredSVS index instance with a mock queue.
size_t dim = 4;
SVSParams params = {.type = TypeParam::get_index_type(),
.dim = dim,
.metric = VecSimMetric_L2,
.multi = TypeParam::isMulti()};
VecSimParams svs_params = CreateParams(params);
auto mock_thread_pool = tieredIndexMock();

// Build with default specificTieredBackendInfo.svsTieredInfo params
auto *tiered_index = this->CreateTieredSVSIndex(svs_params, mock_thread_pool, 0, 0, 0);
ASSERT_INDEX(tiered_index);

VecSimIndexDebugInfo info = tiered_index->debugInfo();
// Validate tiered svs info fields
constexpr size_t expected_training_threshold =
TypeParam::get_quant_bits() == VecSimSvsQuant_NONE ? SVS_VAMANA_DEFAULT_UPDATE_THRESHOLD
: SVS_VAMANA_DEFAULT_TRAINING_THRESHOLD;
EXPECT_EQ(info.tieredInfo.specificTieredBackendInfo.svsTieredInfo.trainingTriggerThreshold,
expected_training_threshold);
EXPECT_EQ(info.tieredInfo.specificTieredBackendInfo.svsTieredInfo.updateTriggerThreshold,
SVS_VAMANA_DEFAULT_UPDATE_THRESHOLD);
EXPECT_EQ(info.tieredInfo.specificTieredBackendInfo.svsTieredInfo.updateJobWaitTime,
SVS_DEFAULT_UPDATE_JOB_WAIT_TIME);
}

TYPED_TEST(SVSTieredIndexTest, testInfo) {
// Create TieredSVS index instance with a mock queue.
size_t dim = 4;
Expand All @@ -2362,7 +2393,7 @@ TYPED_TEST(SVSTieredIndexTest, testInfo) {
VecSimParams svs_params = CreateParams(params);
auto mock_thread_pool = tieredIndexMock();

auto *tiered_index = this->CreateTieredSVSIndex(svs_params, mock_thread_pool, 1, 1);
auto *tiered_index = this->CreateTieredSVSIndex(svs_params, mock_thread_pool, 1, 1, 1);
ASSERT_INDEX(tiered_index);
auto allocator = tiered_index->getAllocator();

Expand Down Expand Up @@ -2391,8 +2422,7 @@ TYPED_TEST(SVSTieredIndexTest, testInfo) {
// Validate tiered svs info fields
EXPECT_EQ(info.tieredInfo.specificTieredBackendInfo.svsTieredInfo.trainingTriggerThreshold, 1);
EXPECT_EQ(info.tieredInfo.specificTieredBackendInfo.svsTieredInfo.updateTriggerThreshold, 1);
EXPECT_EQ(info.tieredInfo.specificTieredBackendInfo.svsTieredInfo.updateJobWaitTime,
SVS_DEFAULT_UPDATE_JOB_WAIT_TIME);
EXPECT_EQ(info.tieredInfo.specificTieredBackendInfo.svsTieredInfo.updateJobWaitTime, 1);
EXPECT_EQ(info.tieredInfo.specificTieredBackendInfo.svsTieredInfo.indexUpdateScheduled, false);

// Validate that Static info returns the right restricted info as well.
Expand Down
Loading