VectorDBBenchは、主要なベクトルデータベースとクラウドサービスのベンチマーク結果を提供するツールです。本記事では、VectorDBBenchを使用してOceanBaseベクトルデータベースの性能をテストします。VectorDBBenchは、ユーザビリティを重視した設計となっており、結果の再現や新しいシステムのテストを容易に行うことができます。
準備作業
OceanBaseクラスタをV4.3.5およびそれ以降のバージョンにデプロイします。
MySQLモードテナントを作成します。テナントの作成を参照してください。
Python 3.11およびそれ以降をインストールします。例として、Condaを使用したインストールを行います。
# Condaのダウンロードとインストール mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3 rm ~/miniconda3/miniconda.sh # ターミナルの再起動、Condaの初期化 source ~/miniconda3/bin/activate conda init --all ## VectorDBBenchを実行するために必要なPython環境の新規作成と初期化 conda create -n vdb python=3.11 conda activate vdb業務テナントに接続し、HNSWベクトルインデックス検索に関連するメモリとクエリパラメータをチューニングします:
-- ob_vector_memory_limit_percentageを0%に設定します。 ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30; -- ob_query_timeoutを24時間に設定します。 SET GLOBAL ob_query_timeout = 86400000000; -- max_allowed_packetを1GBに設定します。 SET GLOBAL max_allowed_packet=1073741824; -- ddl_thread_scoreとparallel_servers_targetは、インデックス作成時の並列度を設定します ALTER SYSTEM SET ddl_thread_score = 8; -- DDL操作の並列度 SET GLOBAL parallel_servers_target = 624; -- データベースサーバーが同時に処理できるパラレルクエリの数ob_vector_memory_limit_percentage = 30は単なる例であり、実際の値はテナントのメモリとビジネス量に応じて調整してください。計算ロジックについては、ob_vector_memory_limit_percentageを参照してください。
推奨設定
テナントのリソースの設定は、以下の仕様を推奨します:
| 構成パラメータ | 値 |
|---|---|
| メモリ | 64G |
| CPU | 16C |
テスト方法
VectorDBBenchコードのクローン
注意
VectorDBBenchとOceanBaseクラスタは、異なるマシンにデプロイすることを推奨します。これにより、CPUリソースの競合を回避し、テスト結果の信頼性を高めることができます。
クローンテストツールVectorDBBenchのコードをローカルにクローンします。
git clone -b v0.1.0 https://github.com/wyfanxiao/VectorDBBench.git
依存関係のインストール
VectorDBBenchディレクトリに移動して依存関係をインストールします。
cd VectorDBBench
pip install .
テストの実行
VectorDBBenchを実行します。ここでは、HNSWインデックスとIVFインデックスの2つの例を示します。
HNSWインデックスの例
# $host、$port、$userは、実際のOceanBaseデータベース接続情報に置き換える必要があります。
vectordbbench oceanbasehnsw --host $host --port $port --user $user --database test --m 16 --ef-construction 200 --ef-search 40 --k 10 --case-type Performance768D1M --index-type HNSW
詳細なパラメータ情報は、以下のコマンドで確認できます:
vectordbbench oceanbasehnsw --help
ここでは、いくつかの一般的なオプションの説明は以下の通りです:
--num-concurrency:並列度を調整するために使用されます。 VectorDBBenchは、指定されたパラレル処理でベクトルクエリを実行し、最大のQPS (Queries Per Second、1秒あたりのクエリ数)を最終結果として選択します。--skip-drop-old/--skip-load:古いデータの削除とデータロードのステップをスキップすることを表します。コマンドラインにこれらの2つのオプションを追加すると、コマンドはベクトル検索操作のみを実行し、古いデータを削除して再度データロードすることはありません。--k:指定ベクトルクエリで返す最近傍の結果の数をKに設定します。--ef-search:HNSWクエリパラメータは、クエリ時の候補集合のサイズを表します。--index-type:指定するインデックスのタイプ。現在、HNSW、HNSW_SQ、HNSW_BQをサポートしています。
インデックスの例
vectordbbench oceanbaseivf --host $host --port $port --user $user --database test --nlist 1000 --sample_per_nlist 256 --ivf_nprobes 100 --case-type Performance768D1M --index-type IVF_FLAT
いくつかの一般的なオプションの説明は以下の通りです:
--sample_per_nlist:各クラスタ中心でサンプリングするデータ量。デフォルト値は256です。--ivf_nprobes:ベクトルインデックスの検索時に、最も近いクラスタ中心をいくつ検索するかを設定します。デフォルト値は8です。値が大きいほど再現率は高くなりますが、同時に検索時間も長くなります。--index-type:インデックスタイプを指定します。現在、IVF_FLATをサポートしています。
より多くのパラメータ情報については、以下のコマンドで確認できます。
vectordbbench oceanbaseivf --help
よくある質問
最初のテスト実行が遅いのは正常ですか?
最初のテストの実行には、AWS S3ストレージから必要なデータセットをダウンロードする必要があり、時間がかかる場合があります。これは正常な現象です。
テストコードのカスタマイズ変更はできますか?
可能です。テストコードをカスタマイズ変更した場合、pip install .を再度実行し、テストを実行する必要があります。