vectordb-bench 1.0.4__py3-none-any.whl → 1.0.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- vectordb_bench/__init__.py +1 -0
- vectordb_bench/backend/cases.py +45 -1
- vectordb_bench/backend/clients/__init__.py +47 -0
- vectordb_bench/backend/clients/api.py +2 -0
- vectordb_bench/backend/clients/aws_opensearch/aws_opensearch.py +104 -40
- vectordb_bench/backend/clients/aws_opensearch/cli.py +52 -15
- vectordb_bench/backend/clients/aws_opensearch/config.py +27 -7
- vectordb_bench/backend/clients/hologres/cli.py +50 -0
- vectordb_bench/backend/clients/hologres/config.py +121 -0
- vectordb_bench/backend/clients/hologres/hologres.py +365 -0
- vectordb_bench/backend/clients/lancedb/lancedb.py +1 -0
- vectordb_bench/backend/clients/milvus/cli.py +29 -9
- vectordb_bench/backend/clients/milvus/config.py +2 -0
- vectordb_bench/backend/clients/milvus/milvus.py +1 -1
- vectordb_bench/backend/clients/oceanbase/cli.py +1 -0
- vectordb_bench/backend/clients/oceanbase/config.py +3 -1
- vectordb_bench/backend/clients/oceanbase/oceanbase.py +20 -4
- vectordb_bench/backend/clients/oss_opensearch/cli.py +155 -0
- vectordb_bench/backend/clients/oss_opensearch/config.py +157 -0
- vectordb_bench/backend/clients/oss_opensearch/oss_opensearch.py +582 -0
- vectordb_bench/backend/clients/oss_opensearch/run.py +166 -0
- vectordb_bench/backend/clients/pgdiskann/cli.py +45 -0
- vectordb_bench/backend/clients/pgdiskann/config.py +16 -0
- vectordb_bench/backend/clients/pgdiskann/pgdiskann.py +94 -26
- vectordb_bench/backend/clients/s3_vectors/config.py +41 -0
- vectordb_bench/backend/clients/s3_vectors/s3_vectors.py +171 -0
- vectordb_bench/backend/clients/tidb/cli.py +0 -4
- vectordb_bench/backend/clients/tidb/config.py +22 -2
- vectordb_bench/backend/clients/zilliz_cloud/cli.py +14 -1
- vectordb_bench/backend/clients/zilliz_cloud/config.py +4 -1
- vectordb_bench/backend/dataset.py +70 -0
- vectordb_bench/backend/filter.py +17 -0
- vectordb_bench/backend/runner/mp_runner.py +4 -0
- vectordb_bench/backend/runner/rate_runner.py +23 -11
- vectordb_bench/backend/runner/read_write_runner.py +10 -9
- vectordb_bench/backend/runner/serial_runner.py +23 -7
- vectordb_bench/backend/task_runner.py +5 -4
- vectordb_bench/cli/cli.py +36 -0
- vectordb_bench/cli/vectordbbench.py +4 -0
- vectordb_bench/fig/custom_case_run_test.png +0 -0
- vectordb_bench/fig/custom_dataset.png +0 -0
- vectordb_bench/fig/homepage/bar-chart.png +0 -0
- vectordb_bench/fig/homepage/concurrent.png +0 -0
- vectordb_bench/fig/homepage/custom.png +0 -0
- vectordb_bench/fig/homepage/label_filter.png +0 -0
- vectordb_bench/fig/homepage/qp$.png +0 -0
- vectordb_bench/fig/homepage/run_test.png +0 -0
- vectordb_bench/fig/homepage/streaming.png +0 -0
- vectordb_bench/fig/homepage/table.png +0 -0
- vectordb_bench/fig/run_test_select_case.png +0 -0
- vectordb_bench/fig/run_test_select_db.png +0 -0
- vectordb_bench/fig/run_test_submit.png +0 -0
- vectordb_bench/frontend/components/check_results/filters.py +1 -4
- vectordb_bench/frontend/components/check_results/nav.py +2 -1
- vectordb_bench/frontend/components/concurrent/charts.py +5 -0
- vectordb_bench/frontend/components/int_filter/charts.py +60 -0
- vectordb_bench/frontend/components/streaming/data.py +7 -0
- vectordb_bench/frontend/components/welcome/welcomePrams.py +42 -4
- vectordb_bench/frontend/config/dbCaseConfigs.py +142 -16
- vectordb_bench/frontend/config/styles.py +4 -0
- vectordb_bench/frontend/pages/concurrent.py +1 -1
- vectordb_bench/frontend/pages/custom.py +1 -1
- vectordb_bench/frontend/pages/int_filter.py +56 -0
- vectordb_bench/frontend/pages/streaming.py +16 -3
- vectordb_bench/interface.py +5 -1
- vectordb_bench/metric.py +7 -0
- vectordb_bench/models.py +39 -4
- vectordb_bench/results/S3Vectors/result_20250722_standard_s3vectors.json +2509 -0
- vectordb_bench/results/getLeaderboardDataV2.py +23 -2
- vectordb_bench/results/leaderboard_v2.json +200 -0
- vectordb_bench/results/leaderboard_v2_streaming.json +128 -0
- {vectordb_bench-1.0.4.dist-info → vectordb_bench-1.0.7.dist-info}/METADATA +40 -8
- {vectordb_bench-1.0.4.dist-info → vectordb_bench-1.0.7.dist-info}/RECORD +77 -51
- {vectordb_bench-1.0.4.dist-info → vectordb_bench-1.0.7.dist-info}/WHEEL +0 -0
- {vectordb_bench-1.0.4.dist-info → vectordb_bench-1.0.7.dist-info}/entry_points.txt +0 -0
- {vectordb_bench-1.0.4.dist-info → vectordb_bench-1.0.7.dist-info}/licenses/LICENSE +0 -0
- {vectordb_bench-1.0.4.dist-info → vectordb_bench-1.0.7.dist-info}/top_level.txt +0 -0
vectordb_bench/metric.py
CHANGED
@@ -21,11 +21,13 @@ class Metric:
|
|
21
21
|
# for performance cases
|
22
22
|
qps: float = 0.0
|
23
23
|
serial_latency_p99: float = 0.0
|
24
|
+
serial_latency_p95: float = 0.0
|
24
25
|
recall: float = 0.0
|
25
26
|
ndcg: float = 0.0
|
26
27
|
conc_num_list: list[int] = field(default_factory=list)
|
27
28
|
conc_qps_list: list[float] = field(default_factory=list)
|
28
29
|
conc_latency_p99_list: list[float] = field(default_factory=list)
|
30
|
+
conc_latency_p95_list: list[float] = field(default_factory=list)
|
29
31
|
conc_latency_avg_list: list[float] = field(default_factory=list)
|
30
32
|
|
31
33
|
# for streaming cases
|
@@ -36,12 +38,14 @@ class Metric:
|
|
36
38
|
st_recall_list: list[float] = field(default_factory=list)
|
37
39
|
st_ndcg_list: list[float] = field(default_factory=list)
|
38
40
|
st_serial_latency_p99_list: list[float] = field(default_factory=list)
|
41
|
+
st_serial_latency_p95_list: list[float] = field(default_factory=list)
|
39
42
|
st_conc_failed_rate_list: list[float] = field(default_factory=list)
|
40
43
|
|
41
44
|
|
42
45
|
QURIES_PER_DOLLAR_METRIC = "QP$ (Quries per Dollar)"
|
43
46
|
LOAD_DURATION_METRIC = "load_duration"
|
44
47
|
SERIAL_LATENCY_P99_METRIC = "serial_latency_p99"
|
48
|
+
SERIAL_LATENCY_P95_METRIC = "serial_latency_p95"
|
45
49
|
MAX_LOAD_COUNT_METRIC = "max_load_count"
|
46
50
|
QPS_METRIC = "qps"
|
47
51
|
RECALL_METRIC = "recall"
|
@@ -49,6 +53,7 @@ RECALL_METRIC = "recall"
|
|
49
53
|
metric_unit_map = {
|
50
54
|
LOAD_DURATION_METRIC: "s",
|
51
55
|
SERIAL_LATENCY_P99_METRIC: "ms",
|
56
|
+
SERIAL_LATENCY_P95_METRIC: "ms",
|
52
57
|
MAX_LOAD_COUNT_METRIC: "K",
|
53
58
|
QURIES_PER_DOLLAR_METRIC: "K",
|
54
59
|
}
|
@@ -56,6 +61,7 @@ metric_unit_map = {
|
|
56
61
|
lower_is_better_metrics = [
|
57
62
|
LOAD_DURATION_METRIC,
|
58
63
|
SERIAL_LATENCY_P99_METRIC,
|
64
|
+
SERIAL_LATENCY_P95_METRIC,
|
59
65
|
]
|
60
66
|
|
61
67
|
metric_order = [
|
@@ -63,6 +69,7 @@ metric_order = [
|
|
63
69
|
RECALL_METRIC,
|
64
70
|
LOAD_DURATION_METRIC,
|
65
71
|
SERIAL_LATENCY_P99_METRIC,
|
72
|
+
SERIAL_LATENCY_P95_METRIC,
|
66
73
|
MAX_LOAD_COUNT_METRIC,
|
67
74
|
]
|
68
75
|
|
vectordb_bench/models.py
CHANGED
@@ -6,6 +6,9 @@ from typing import Self
|
|
6
6
|
|
7
7
|
import ujson
|
8
8
|
|
9
|
+
from vectordb_bench.backend.cases import type2case
|
10
|
+
from vectordb_bench.backend.dataset import DatasetWithSizeMap
|
11
|
+
|
9
12
|
from . import config
|
10
13
|
from .backend.cases import Case, CaseType
|
11
14
|
from .backend.clients import (
|
@@ -83,6 +86,9 @@ class CaseConfigParamType(Enum):
|
|
83
86
|
storage_layout = "storage_layout"
|
84
87
|
num_neighbors = "num_neighbors"
|
85
88
|
max_neighbors = "max_neighbors"
|
89
|
+
quantized_fetch_limit = "quantized_fetch_limit"
|
90
|
+
pq_param_num_chunks = "pq_param_num_chunks"
|
91
|
+
reranking_metric = "reranking_metric"
|
86
92
|
l_value_ib = "l_value_ib"
|
87
93
|
l_value_is = "l_value_is"
|
88
94
|
search_list_size = "search_list_size"
|
@@ -270,6 +276,21 @@ class TestResult(BaseModel):
|
|
270
276
|
b = partial.json(exclude={"db_config": {"password", "api_key"}})
|
271
277
|
f.write(b)
|
272
278
|
|
279
|
+
def get_case_config(case_config: CaseConfig) -> dict[CaseConfig]:
|
280
|
+
if case_config["case_id"] in {6, 7, 8, 9, 12, 13, 14, 15}:
|
281
|
+
case_instance = type2case[CaseType(case_config["case_id"])]()
|
282
|
+
custom_case = case_config["custom_case"]
|
283
|
+
if custom_case is None:
|
284
|
+
custom_case = {}
|
285
|
+
custom_case["filter_rate"] = case_instance.filter_rate
|
286
|
+
for dataset, size_type in DatasetWithSizeMap.items():
|
287
|
+
if case_instance.dataset == size_type:
|
288
|
+
custom_case["dataset_with_size_type"] = dataset
|
289
|
+
break
|
290
|
+
case_config["case_id"] = CaseType.NewIntFilterPerformanceCase
|
291
|
+
case_config["custom_case"] = custom_case
|
292
|
+
return case_config
|
293
|
+
|
273
294
|
@classmethod
|
274
295
|
def read_file(cls, full_path: pathlib.Path, trans_unit: bool = False) -> Self:
|
275
296
|
if not full_path.exists():
|
@@ -280,10 +301,10 @@ class TestResult(BaseModel):
|
|
280
301
|
test_result = ujson.loads(f.read())
|
281
302
|
if "task_label" not in test_result:
|
282
303
|
test_result["task_label"] = test_result["run_id"]
|
283
|
-
|
284
304
|
for case_result in test_result["results"]:
|
285
|
-
task_config = case_result
|
286
|
-
|
305
|
+
task_config = case_result.get("task_config")
|
306
|
+
case_config = task_config.get("case_config")
|
307
|
+
db = DB(task_config.get("db"))
|
287
308
|
|
288
309
|
task_config["db_config"] = db.config_cls(**task_config["db_config"])
|
289
310
|
|
@@ -296,6 +317,7 @@ class TestResult(BaseModel):
|
|
296
317
|
log.exception(f"Couldn't get class for index '{index_value}' ({full_path})")
|
297
318
|
task_config["db_case_config"] = EmptyDBCaseConfig(**raw_case_cfg)
|
298
319
|
|
320
|
+
task_config["case_config"] = cls.get_case_config(case_config=case_config)
|
299
321
|
case_result["task_config"] = task_config
|
300
322
|
|
301
323
|
if trans_unit:
|
@@ -308,6 +330,16 @@ class TestResult(BaseModel):
|
|
308
330
|
case_result["metrics"]["serial_latency_p99"] = (
|
309
331
|
cur_latency * 1000 if cur_latency > 0 else cur_latency
|
310
332
|
)
|
333
|
+
|
334
|
+
# Handle P95 latency for backward compatibility with existing result files
|
335
|
+
if "serial_latency_p95" in case_result["metrics"]:
|
336
|
+
cur_latency_p95 = case_result["metrics"]["serial_latency_p95"]
|
337
|
+
case_result["metrics"]["serial_latency_p95"] = (
|
338
|
+
cur_latency_p95 * 1000 if cur_latency_p95 > 0 else cur_latency_p95
|
339
|
+
)
|
340
|
+
else:
|
341
|
+
# Default to 0 for older result files that don't have P95 data
|
342
|
+
case_result["metrics"]["serial_latency_p95"] = 0.0
|
311
343
|
return TestResult.validate(test_result)
|
312
344
|
|
313
345
|
def display(self, dbs: list[DB] | None = None):
|
@@ -350,6 +382,7 @@ class TestResult(BaseModel):
|
|
350
382
|
max_load_dur,
|
351
383
|
max_qps,
|
352
384
|
15,
|
385
|
+
15,
|
353
386
|
max_recall,
|
354
387
|
14,
|
355
388
|
5,
|
@@ -357,7 +390,7 @@ class TestResult(BaseModel):
|
|
357
390
|
|
358
391
|
DATA_FORMAT = ( # noqa: N806
|
359
392
|
f"%-{max_db}s | %-{max_db_labels}s %-{max_case}s %-{len(self.task_label)}s"
|
360
|
-
f" | %-{max_load_dur}s %-{max_qps}s %-15s %-{max_recall}s %-14s"
|
393
|
+
f" | %-{max_load_dur}s %-{max_qps}s %-15s %-15s %-{max_recall}s %-14s"
|
361
394
|
f" | %-5s"
|
362
395
|
)
|
363
396
|
|
@@ -369,6 +402,7 @@ class TestResult(BaseModel):
|
|
369
402
|
"load_dur",
|
370
403
|
"qps",
|
371
404
|
"latency(p99)",
|
405
|
+
"latency(p95)",
|
372
406
|
"recall",
|
373
407
|
"max_load_count",
|
374
408
|
"label",
|
@@ -391,6 +425,7 @@ class TestResult(BaseModel):
|
|
391
425
|
f.metrics.load_duration,
|
392
426
|
f.metrics.qps,
|
393
427
|
f.metrics.serial_latency_p99,
|
428
|
+
f.metrics.serial_latency_p95,
|
394
429
|
f.metrics.recall,
|
395
430
|
f.metrics.max_load_count,
|
396
431
|
f.label.value,
|