TairVectorは、Tairベースの社内データ構造で、ベクターの高性能なリアルタイム保存と検索を提供します。 このトピックでは、TairVectorのパフォーマンスをテストする方法について説明します。 また、Alibaba Cloudが取得したテスト結果も提供します。
TairVectorは、近似最近傍 (ANN) 探索アルゴリズムをサポートする。 TairVectorは、非構造化データとパーソナライズされたレコメンデーションエンジンのセマンティック検索に使用できます。 詳細については、「ベクター」をご参照ください。
テストの説明
テスト環境
インスタンス: Redis 6.0と互換性があり、ストレージ容量が16 GBのTair DRAMベースのインスタンス。
テストの実行に使用されるサーバー:
Tairインスタンスと同じ仮想プライベートクラウド (VPC) にデプロイされ、VPCを介してTairインスタンスに接続されているElastic Compute Service (ECS) インスタンス。
Linuxオペレーティングシステム。
Python (バージョン3.7以降) の開発環境。
テストデータ
Sift-128-euclidean
、Gist-960-euclidean
、グローブ200角度
、およびディープ画像96角度
のデータセットを使用して、階層的ナビゲート可能スモールワールド (HNSW) インデックス付けアルゴリズムをテストします。 Random-s-100-ユークリッド
データセットとMnist-784-euclidean
データセットを使用して、Flat Searchインデックス付けアルゴリズムをテストします。
データセット | 説明 | ベクトル次元 | ベクトルの数 | クエリ数 | データ量 | 距離式 |
Texmexデータセットとスケール不変特徴変換 (SIFT) アルゴリズムを使用して生成される画像特徴ベクトル。 | 128 | 1,000,000 | 10,000 | 488 MB | L2 | |
Texmexデータセットと胃腸間質腫瘍 (GIST) アルゴリズムを使用して生成される画像特徴ベクトル。 | 960 | 1,000,000 | 1,000 | 3.57 GB | L2 | |
インターネットからのテキストデータにGloVeアルゴリズムを適用することによって生成される単語ベクトル。 | 200 | 1,183,514 | 10,000 | 902 MB | IP | |
ImageNetトレーニングデータセットを使用してGoogLeNetニューラルネットワークの出力レイヤーから抽出されるベクトル。 | 96 | 9,990,000 | 10,000 | 3.57 GB | IP | |
Random-s-100-euclidean | テストツールを使用してランダムに生成されるデータセット。 ダウンロードURLは利用できません。 | 100 | 90,000 | 10,000 | 34 MB | L2 |
MNISTデータベースからのデータセット。 | 784 | 60,000 | 10,000 | 179 MB | L2 |
テストツールとメソッド
テストサーバーに
tair-py
をインストールします。次のいずれかの方法でインストールを実行します。
pip
を使う:pip install tair
次のコードを実行します。
git clone https://github.com/alibaba/tair-py.git cd tair-py python setup.py install
ダウンロードと解凍 アン-ベンチマーク
次のコマンドを実行してAnn-benchmarksを解凍します。
tar -zxvf ann-benchmarks.tar.gz
algos.yaml
ファイルでTairインスタンスのエンドポイント、ポート番号、ユーザー名、およびパスワードを設定します。algos.yaml
ファイルを開き、tairvector
を検索して対応する設定項目を見つけ、base-args
の次のパラメーターを設定します。host: Tairインスタンスへの接続に使用されるエンドポイント。
port: Tairインスタンスへの接続に使用されるポート番号。
password: Tairインスタンスの
user:password
形式のユーザー名とパスワード。 詳細については、「Connect to a Tair instance」をご参照ください。parallelism: 同時スレッドの数。 デフォルト値: 4。
例:
{"host": "r-**** 0d7f.redis.zhangbei.rds.aliyuncs.com" 、"port": "6379" 、"password": "testaccount:Rp829dlwa" 、"parallelism": 4}
Run. py
スクリプトを実行してテストを開始します。重要run.py
スクリプトを実行すると、テスト全体が開始され、インデックスが作成され、インデックスにデータが書き込まれ、結果がクエリされて記録されます。 1つのテストデータセットでスクリプトを繰り返し実行しないでください。例:
# Run a single-threaded test by using the Sift-128-euclidean dataset and HNSW indexing algorithm. python run.py --local --runs 3 --algorithm tairvector --dataset sift-128-euclidean # Run a multi-threaded test by using the Sift-128-euclidean dataset and HNSW indexing algorithm. python run.py --local --runs 3 --algorithm tairvector --dataset sift-128-euclidean --batch # Run a single-threaded test by using the Mnist-784-euclidean dataset and Flat Search indexing algorithm. python run.py --local --runs 3 --algorithm tairvector-flat --dataset mnist-784-euclidean # Run a multi-threaded test by using the Mnist-784-euclidean dataset and Flat Search indexing algorithm. python run.py --local --runs 3 --algorithm tairvector-flat --dataset mnist-784-euclidean --batch
data_export.py
スクリプトを実行し、結果をエクスポートします。例:
# Single thread. python data_export.py --output out.csv # Multiple threads. python data_export.py --output out.csv --batch
テスト結果
HNSWインデックス
書き込みパフォーマンス
このテストでは、8つのスレッドが同時にTairインスタンスにデータを書き込みます。 書き込みスループットに注意してください。
次の図は、
ef_construct
が500に設定されている場合の、Mパラメータの異なる値でのHNSWインデックス付けアルゴリズムの書き込みパフォーマンスを示しています。 Mパラメータは、グラフインデックス構造内の各レイヤ上の出力ネイバーの最大数を指定する。 HNSWインデクシングアルゴリズムの書き込み性能は、Mパラメータの値に反比例して低下する。ANNクエリのパフォーマンス
シングルスレッドANNクエリのレイテンシとマルチスレッド同時クエリのスループットに注意してください。
シングルスレッドANNクエリのレイテンシ
次の図は、
ef_construct
が500に設定され、Mとef_search
が異なる値に設定されている場合の、TairVectorのシングルスレッドANNクエリのレイテンシを示しています。 シングルスレッドANNクエリのレイテンシは、トラバースするデータ量を指定するef_search
の値に比例して増加します。 レイテンシが高いほど、リコール率は高くなります。 詳細については、このトピックの「リコール率」セクションをご参照ください。マルチスレッドクエリのスループット
次の図は、
ef_construct
が500に設定され、M
が24に設定され、ef_search
が異なる値に設定されている場合の、シングルスレッドクエリと4スレッド同時クエリのスループットを示しています。
リコール率
HNSWインデックスと特定のパラメーター設定を使用したクエリのリコール率は密接に関連しています。 以下の図は、異なるデータセットに対するMおよび
ef_search
の異なる値での上位10個の再現率を示す。 クエリの待ち時間は、Mとef_search
の値に比例して増加します。 詳細については、このトピックの「ANNクエリのパフォーマンス」を参照してください。説明ビジネスニーズに基づいて関連するパラメーターを変更し、クエリパフォーマンスとリコール率のバランスを取ることができます。
メモリ効率
メモリ効率は、インデックスメモリ使用量のベクトルの元のサイズに対する比率であるメモリ増幅率を示します。 次の図は、Mパラメーターのさまざまな値でのTairVectorのメモリ増幅率を示しています。 HNSWインデックスのメモリ使用量は、Mパラメーターの値に比例してのみ増加します。 ベクトルのメモリ使用量は、ベクトルの次元に比例して増加する。 ベクトルのメモリ使用量が増加するにつれて、総メモリ空間に対するインデックスメモリ使用量の比率は減少する。 この場合、メモリ増幅率が低下する。
FLATインデックス
書き込みパフォーマンス
次の図は、FLATインデックスの書き込みスループットを示しています。
ANNクエリのパフォーマンス
次の図は、FLATインデックスを使用したシングルスレッドおよびマルチスレッドANNクエリのスループットを示しています。
メモリ効率
次の図は、TairVectorのFLATインデックスのメモリ増幅率を示しています。 データセットの全体サイズが他のデータセットの全体サイズよりも小さいため、Random-s-100-euclideanデータセットのメモリ増幅率は比較的高い。