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.
Files changed (77) hide show
  1. vectordb_bench/__init__.py +1 -0
  2. vectordb_bench/backend/cases.py +45 -1
  3. vectordb_bench/backend/clients/__init__.py +47 -0
  4. vectordb_bench/backend/clients/api.py +2 -0
  5. vectordb_bench/backend/clients/aws_opensearch/aws_opensearch.py +104 -40
  6. vectordb_bench/backend/clients/aws_opensearch/cli.py +52 -15
  7. vectordb_bench/backend/clients/aws_opensearch/config.py +27 -7
  8. vectordb_bench/backend/clients/hologres/cli.py +50 -0
  9. vectordb_bench/backend/clients/hologres/config.py +121 -0
  10. vectordb_bench/backend/clients/hologres/hologres.py +365 -0
  11. vectordb_bench/backend/clients/lancedb/lancedb.py +1 -0
  12. vectordb_bench/backend/clients/milvus/cli.py +29 -9
  13. vectordb_bench/backend/clients/milvus/config.py +2 -0
  14. vectordb_bench/backend/clients/milvus/milvus.py +1 -1
  15. vectordb_bench/backend/clients/oceanbase/cli.py +1 -0
  16. vectordb_bench/backend/clients/oceanbase/config.py +3 -1
  17. vectordb_bench/backend/clients/oceanbase/oceanbase.py +20 -4
  18. vectordb_bench/backend/clients/oss_opensearch/cli.py +155 -0
  19. vectordb_bench/backend/clients/oss_opensearch/config.py +157 -0
  20. vectordb_bench/backend/clients/oss_opensearch/oss_opensearch.py +582 -0
  21. vectordb_bench/backend/clients/oss_opensearch/run.py +166 -0
  22. vectordb_bench/backend/clients/pgdiskann/cli.py +45 -0
  23. vectordb_bench/backend/clients/pgdiskann/config.py +16 -0
  24. vectordb_bench/backend/clients/pgdiskann/pgdiskann.py +94 -26
  25. vectordb_bench/backend/clients/s3_vectors/config.py +41 -0
  26. vectordb_bench/backend/clients/s3_vectors/s3_vectors.py +171 -0
  27. vectordb_bench/backend/clients/tidb/cli.py +0 -4
  28. vectordb_bench/backend/clients/tidb/config.py +22 -2
  29. vectordb_bench/backend/clients/zilliz_cloud/cli.py +14 -1
  30. vectordb_bench/backend/clients/zilliz_cloud/config.py +4 -1
  31. vectordb_bench/backend/dataset.py +70 -0
  32. vectordb_bench/backend/filter.py +17 -0
  33. vectordb_bench/backend/runner/mp_runner.py +4 -0
  34. vectordb_bench/backend/runner/rate_runner.py +23 -11
  35. vectordb_bench/backend/runner/read_write_runner.py +10 -9
  36. vectordb_bench/backend/runner/serial_runner.py +23 -7
  37. vectordb_bench/backend/task_runner.py +5 -4
  38. vectordb_bench/cli/cli.py +36 -0
  39. vectordb_bench/cli/vectordbbench.py +4 -0
  40. vectordb_bench/fig/custom_case_run_test.png +0 -0
  41. vectordb_bench/fig/custom_dataset.png +0 -0
  42. vectordb_bench/fig/homepage/bar-chart.png +0 -0
  43. vectordb_bench/fig/homepage/concurrent.png +0 -0
  44. vectordb_bench/fig/homepage/custom.png +0 -0
  45. vectordb_bench/fig/homepage/label_filter.png +0 -0
  46. vectordb_bench/fig/homepage/qp$.png +0 -0
  47. vectordb_bench/fig/homepage/run_test.png +0 -0
  48. vectordb_bench/fig/homepage/streaming.png +0 -0
  49. vectordb_bench/fig/homepage/table.png +0 -0
  50. vectordb_bench/fig/run_test_select_case.png +0 -0
  51. vectordb_bench/fig/run_test_select_db.png +0 -0
  52. vectordb_bench/fig/run_test_submit.png +0 -0
  53. vectordb_bench/frontend/components/check_results/filters.py +1 -4
  54. vectordb_bench/frontend/components/check_results/nav.py +2 -1
  55. vectordb_bench/frontend/components/concurrent/charts.py +5 -0
  56. vectordb_bench/frontend/components/int_filter/charts.py +60 -0
  57. vectordb_bench/frontend/components/streaming/data.py +7 -0
  58. vectordb_bench/frontend/components/welcome/welcomePrams.py +42 -4
  59. vectordb_bench/frontend/config/dbCaseConfigs.py +142 -16
  60. vectordb_bench/frontend/config/styles.py +4 -0
  61. vectordb_bench/frontend/pages/concurrent.py +1 -1
  62. vectordb_bench/frontend/pages/custom.py +1 -1
  63. vectordb_bench/frontend/pages/int_filter.py +56 -0
  64. vectordb_bench/frontend/pages/streaming.py +16 -3
  65. vectordb_bench/interface.py +5 -1
  66. vectordb_bench/metric.py +7 -0
  67. vectordb_bench/models.py +39 -4
  68. vectordb_bench/results/S3Vectors/result_20250722_standard_s3vectors.json +2509 -0
  69. vectordb_bench/results/getLeaderboardDataV2.py +23 -2
  70. vectordb_bench/results/leaderboard_v2.json +200 -0
  71. vectordb_bench/results/leaderboard_v2_streaming.json +128 -0
  72. {vectordb_bench-1.0.4.dist-info → vectordb_bench-1.0.7.dist-info}/METADATA +40 -8
  73. {vectordb_bench-1.0.4.dist-info → vectordb_bench-1.0.7.dist-info}/RECORD +77 -51
  74. {vectordb_bench-1.0.4.dist-info → vectordb_bench-1.0.7.dist-info}/WHEEL +0 -0
  75. {vectordb_bench-1.0.4.dist-info → vectordb_bench-1.0.7.dist-info}/entry_points.txt +0 -0
  76. {vectordb_bench-1.0.4.dist-info → vectordb_bench-1.0.7.dist-info}/licenses/LICENSE +0 -0
  77. {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["task_config"]
286
- db = DB(task_config["db"])
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,