すべてのプロダクト
Search
ドキュメントセンター

Tair (Redis® OSS-Compatible):TairVectorパフォーマンスホワイトペーパー

最終更新日:Sep 12, 2024

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-euclideanGist-960-euclideanグローブ200角度、およびディープ画像96角度のデータセットを使用して、階層的ナビゲート可能スモールワールド (HNSW) インデックス付けアルゴリズムをテストします。 Random-s-100-ユークリッドデータセットとMnist-784-euclideanデータセットを使用して、Flat Searchインデックス付けアルゴリズムをテストします。

データセット

説明

ベクトル次元

ベクトルの数

クエリ数

データ量

距離式

Sift-128-euclidean

Texmexデータセットとスケール不変特徴変換 (SIFT) アルゴリズムを使用して生成される画像特徴ベクトル。

128

1,000,000

10,000

488 MB

L2

Gist-960-euclidean

Texmexデータセットと胃腸間質腫瘍 (GIST) アルゴリズムを使用して生成される画像特徴ベクトル。

960

1,000,000

1,000

3.57 GB

L2

グローブ-200-角

インターネットからのテキストデータにGloVeアルゴリズムを適用することによって生成される単語ベクトル。

200

1,183,514

10,000

902 MB

IP

深いイメージ-96-角度

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-euclidean

MNISTデータベースからのデータセット。

784

60,000

10,000

179 MB

L2

テストツールとメソッド

  1. テストサーバーにtair-pyをインストールします。

    次のいずれかの方法でインストールを実行します。

    • pipを使う:

      pip install tair
    • 次のコードを実行します。

      git clone https://github.com/alibaba/tair-py.git
      cd tair-py
      python setup.py install
  2. ダウンロードと解凍 アン-ベンチマーク

    次のコマンドを実行してAnn-benchmarksを解凍します。

    tar -zxvf ann-benchmarks.tar.gz
  3. 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}
  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
  5. 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パラメータの値に反比例して低下する。

    図 1. Sift-128-euclidean Sift-128-euclidean

    図2. Gist-960-euclidean Gist-960-euclidean

    図3. グローブ-200-角 Glove-200-angular

    図4. 深いイメージ-96-角度 Deep-image-96-angular

  • ANNクエリのパフォーマンス

    シングルスレッドANNクエリのレイテンシとマルチスレッド同時クエリのスループットに注意してください。

    • シングルスレッドANNクエリのレイテンシ

      次の図は、ef_constructが500に設定され、Mとef_searchが異なる値に設定されている場合の、TairVectorのシングルスレッドANNクエリのレイテンシを示しています。 シングルスレッドANNクエリのレイテンシは、トラバースするデータ量を指定するef_searchの値に比例して増加します。 レイテンシが高いほど、リコール率は高くなります。 詳細については、このトピックの「リコール率」セクションをご参照ください。

      図5. Sift-128-euclidean Sift-128-euclidean

      図6. Gist-960-euclidean Gist-960-euclidean

      図7. グローブ-200-角 Glove-200-angular

      図8. 深いイメージ-96-角度 Deep-image-96-angular

    • マルチスレッドクエリのスループット

      次の図は、ef_constructが500に設定され、Mが24に設定され、ef_searchが異なる値に設定されている場合の、シングルスレッドクエリと4スレッド同時クエリのスループットを示しています。

      図9. Sift-128-euclidean Sift-128-euclidean

      図10. Gist-960-euclidean Gist-960-euclidean

      図11. グローブ-200-角 Glove-200-angular

      図12. 深いイメージ-96-角度 Deep-image-96-angular

  • リコール率

    HNSWインデックスと特定のパラメーター設定を使用したクエリのリコール率は密接に関連しています。 以下の図は、異なるデータセットに対するMおよびef_searchの異なる値での上位10個の再現率を示す。 クエリの待ち時間は、Mとef_searchの値に比例して増加します。 詳細については、このトピックの「ANNクエリのパフォーマンス」を参照してください。

    説明

    ビジネスニーズに基づいて関連するパラメーターを変更し、クエリパフォーマンスとリコール率のバランスを取ることができます。

    図13. Sift-128-euclidean Sift-128-euclidean

    図14. Gist-960-euclidean Gist-960-euclidean

    図15. グローブ-200-角 Glove-200-angular

    図16. 深いイメージ-96-角度 Deep-image-96-angular

  • メモリ効率

    メモリ効率は、インデックスメモリ使用量のベクトルの元のサイズに対する比率であるメモリ増幅率を示します。 次の図は、Mパラメーターのさまざまな値でのTairVectorのメモリ増幅率を示しています。 Memory usage of TairVectorHNSWインデックスのメモリ使用量は、Mパラメーターの値に比例してのみ増加します。 ベクトルのメモリ使用量は、ベクトルの次元に比例して増加する。 ベクトルのメモリ使用量が増加するにつれて、総メモリ空間に対するインデックスメモリ使用量の比率は減少する。 この場合、メモリ増幅率が低下する。

FLATインデックス

  • 書き込みパフォーマンス

    次の図は、FLATインデックスの書き込みスループットを示しています。 Write throughput of FLAT indexes

  • ANNクエリのパフォーマンス

    次の図は、FLATインデックスを使用したシングルスレッドおよびマルチスレッドANNクエリのスループットを示しています。 Query performance of FLAT indexes

  • メモリ効率

    次の図は、TairVectorのFLATインデックスのメモリ増幅率を示しています。 fLATデータセットの全体サイズが他のデータセットの全体サイズよりも小さいため、Random-s-100-euclideanデータセットのメモリ増幅率は比較的高い。