メインコンテンツまでスキップ
に最終更新

大規模データのパフォーマンスベンチマーク

このドキュメントでは、中規模から大規模、および億件規模のデータセットを対象に、Doris ANN Index の実環境でのロード性能とクエリ性能を示します。データ規模ごとのクエリ性能を評価し、単一ノード構成から分散構成へ円滑に拡張する方法を理解するのに役立ちます。

クイックナビゲーション​

このドキュメントを読むと、次の疑問に答えられます。

  • 数千万件のベクトルを単一の BE ノードでオンライン検索できるか。また、どの程度の QPS とレイテンシーを期待できるか。
  • 数億件のベクトルを扱う際、単一ノードのメモリが不足した場合に、複数 BE の構成でベクトルクエリを継続して提供するにはどうすればよいか。
  • ベクトルの次元数(768/1536)や距離指標(inner_product/l2_distance)によって性能はどう変わるか。
  • これらのテスト結果をどう再現するか。

テスト環境とデータセット​

デプロイ構成​

デプロイ方式BE ノード数ノードごとのスペック対象データ規模
単一ノード116C64GB数千万件
分散構成316C64GB数億件

FE と BE は別々にデプロイしています。すべてのテストで VectorDBBench ツールを使用しています。

データセットの概要​

データセットデータ量ベクトルの次元数距離指標デプロイ構成
Performance768D10M10M768inner_product単一ノード
Performance1536D5M5M1536inner_product単一ノード
Performance768D100M100M768l2_distance分散構成

単一ノードのベンチマーク(16C64GB)​

単一ノードの結果は、中規模から大規模のデータセットにおける ANN クエリ性能の基準になります。

ロード性能​

両データセットのロード指標は次のとおりです。

項目Performance768D10MPerformance1536D5M
ベクトルの次元数7681536
metric_typeinner_productinner_product
データ量10M 行5M 行
ロード時のバッチパラメータNUM_PER_BATCH=500000
--stream-load-rows-per-batch 500000
NUM_PER_BATCH=250000
--stream-load-rows-per-batch 250000
ロード時間76m41s41m
show data all56.498 GB (25.354 GB + 31.145 GB)55.223 GB (25.346 GB + 29.878 GB)

CPU 使用率:

  • Performance768D10M のロード中、CPU 使用率は全体として比較的安定していました。

    Performance768D10M のインポート時の CPU 使用率

  • Performance1536D5M はデータ量とバッチサイズが小さいため、ロード中の CPU 使用率はより頻繁に変動しました。

    Performance1536D5M のインポート時の CPU 使用率

クエリ性能​

高い再現率を維持しながら、単一ノード構成で数百 QPS に達し、クエリのレイテンシーを低く抑えられます。

主要指標​

データセットBestQPSRecall@100
Performance768D10M481.93560.9207
Performance1536D5M414.73420.9677

Performance768D10M の詳細(inner_product、10M 行)​

同時実行数QPSP95 レイテンシーP99 レイテンシー平均レイテンシー
10116.20000.09320.09330.0861
40455.94850.11020.12250.0877
80481.93560.23310.26740.1658

Performance1536D5M の詳細(inner_product、5M 行)​

同時実行数QPSP95 レイテンシーP99 レイテンシー平均レイテンシー
10144.32210.07640.08000.0693
40401.97320.12710.14040.0994
80414.73420.27720.32220.1925

CPU 使用率の監視​

コールドクエリの段階ではインデックスをメモリに読み込む必要があるため、CPU 使用率は比較的低く、システムは主に I/O を待機します。ホットクエリの段階に入ると、CPU 使用率は大幅に上昇し、100% に近づきます。

Performance768D10M のクエリ時の CPU 使用率

分散構成のベンチマーク(3 x 16C64GB)​

データ規模が単一の 16C64GB ノードで無理なく扱えるメモリ容量を超えた場合、複数 BE の構成によって水平に拡張できます。このセクションでは、Performance768D100M データセット(100M 行、768 次元)を使用し、100M 件規模でも Doris がオンラインでベクトルクエリを提供できることを示します。

ヒント

このテストは、小規模データを使った単一ノードのテストと、数値を一対一で直接比較するためのものではありません。データ量の増加に伴う性能の変化を確認するのに適しています。

ロードとインデックスの構築​

ノードごとのメモリ上限が 64GB のため、このテストではベクトルの量子化圧縮を使用してメモリ使用量を削減します。

項目値
データセットPerformance768D100M
データ量100M 行
ベクトルの次元数768
バッチパラメータNUM_PER_BATCH=500000
--stream-load-rows-per-batch 500000
インデックスパラメータ"dim"="768", "index_type"="hnsw", "metric_type"="l2_distance", "pq_m"="384", "pq_nbits"="8", "quantizer"="pq"
インデックスの構築時間4h5min
show data all198.809 GB (137.259 GB + 61.550 GB)

インデックス構築後のデータ分布:

  • バケットは合計 3 個
  • 各バケットには 34 個の rowset があり、各 rowset は約 1.99 GB
  • 各 rowset には 6 個の segment が含まれる

CPU 使用率: インデックス構築中、CPU 使用率は全体として約 50% で安定していました。CPU が長時間上限に達することはなく、リソースには余裕がありました。

Performance768D100M のインポート時の CPU 使用率

クエリ性能​

主要指標​

指標値
BestQPS77.6247
Recall@1000.9294

詳細(l2_distance、100M 行)​

同時実行数QPSP95 レイテンシーP99 レイテンシー平均レイテンシー
1046.58360.26280.27910.2145
2075.35790.32510.35410.2651
3077.62470.52220.57660.3860
4076.63130.70890.78540.5212

CPU 使用率の監視​

クエリの実行中は各ノードの CPU 使用率が高い水準を維持しており、クエリのワークロードが分散計算リソースを十分に活用していることがわかります。

Performance768D100M のクエリ時の CPU 使用率

主な結論​

  • 単一ノードで数千万件: 数千万件規模のベクトルデータに対して、Doris の単一ノード構成は高い再現率(>=0.92)を維持しながら、ANN クエリで数百 QPS を実現できます。
  • 分散構成で数億件: 100M 件のベクトルデータセットでは、複数 BE の構成とベクトルの量子化圧縮を組み合わせることで、オンラインでのベクトルクエリを引き続き提供できます(BestQPS は約 77、Recall@100 は約 0.93)。
  • 水平スケーラビリティ: データ規模が単一ノードのメモリ容量を超えた場合、分散構成はオンライン検索を継続するための有効な手段です。

テスト結果を読む際の注意事項​

結果を確認する際は、次の点に注意してください。

  • 距離指標の違い: 単一ノードのテストでは inner_product、分散構成のテストでは l2_distance を使用しています。絶対値を並べて直接比較することは推奨しません。
  • データ規模とインデックスパラメータの違い: テストグループ間でデータ規模やインデックスパラメータ(量子化の有無など)が異なります。結果は、データ量の増加に伴う性能の変化を確認するのに適しています。
  • コールドクエリの補正: 単一ノードの Performance768D10M テストでは、同時実行数 10 の結果からコールドクエリの影響を除いて補正しています。

再現方法​

テストには VectorDBBench ツールを使用しています。

単一ノードでの再現​

# Performance768D10M
export NUM_PER_BATCH=500000
vectordbbench doris ... --case-type Performance768D10M --stream-load-rows-per-batch 500000

# Performance1536D5M
export NUM_PER_BATCH=250000
vectordbbench doris ... --case-type Performance1536D5M --stream-load-rows-per-batch 250000

分散 3BE 構成での再現​

export NUM_PER_BATCH=500000
vectordbbench doris ... --case-type Performance768D100M --stream-load-rows-per-batch 500000

よくある質問​

Q1: 単一の 16C64GB ノードで保持できるベクトルの最大数は?

ベクトルの次元数、量子化の有無、インデックスパラメータによって異なります。このドキュメントでは、768 次元で 10M 行(約 56 GB)のデータが単一の 16C64GB ノードで安定して動作しています。データ量がさらに増える場合や次元数が高い場合は、ベクトルの量子化を有効にするか、複数 BE の分散構成を使用してください。

Q2: 分散構成のテストの QPS が単一ノードのテストより低いのはなぜですか?

両テストグループでは、距離指標、データ規模、インデックスパラメータが異なります(分散構成のテストでは PQ 量子化を有効にしています)。そのため、絶対値を直接比較することはできません。分散構成のテストは、QPS の最大化ではなく、大規模データにおける拡張性の検証を目的としています。

Q3: 100M 件のデータセットで量子化が必要なのはなぜですか?

ノードごとのメモリ上限は 64GB であり、100M 件の 768 次元ベクトルは、生データだけですでにこの容量を超えます。PQ 量子化(pq_m=384、pq_nbits=8)によりメモリ使用量を大幅に削減でき、大規模なオンライン検索が可能になります。

Q4: ロード時間にはインデックスの構築時間が含まれますか?

単一ノードのテストでは、「ロード時間」は書き込み全体にかかった時間です。インデックスは書き込み中、またはバックグラウンドの compaction 段階で構築されます。分散構成のテストでは、大規模なケースでインデックス構築のコストを評価できるよう、build index time を別に記載しています。