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

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

最終更新日:Dec 05, 2024

TairVectorは、Tair (Enterprise Edition) の社内データ構造で、ベクターの高性能なリアルタイム保存と検索を提供します。 このトピックでは、TairVectorのパフォーマンスをテストする方法について説明し、Alibaba Cloudが取得したテスト結果を提供します。

TairVectorは、近似最近傍 (ANN) 探索アルゴリズムをサポートする。 TairVectorは、非構造化データとパーソナライズされたレコメンデーションのセマンティック検索に使用できます。 詳細については、「ベクター」をご参照ください。

テストの説明

データベーステスト環境

項目

説明

リージョンとゾーン

中国 (張家口) リージョンのゾーンA

ストレージタイプ

Redis 6.0を実行するDRAMベースのインスタンス

エンジンバージョン

6.2.8.2

インスタンスアーキテクチャ

クラスターモードが無効になっている標準のマスターレプリカアーキテクチャ。 詳細については、「標準アーキテクチャ」をご参照ください。

インスタンスタイプ

tair.rdb.16g. インスタンスタイプは、テスト結果に些細な影響を与えます。

クライアントテスト環境

  • Tair (Redis OSS-compatible) インスタンスと同じ仮想プライベートクラウド (VPC) にデプロイされたElastic Compute Service (ECS) インスタンスが作成され、VPCを介して Tair (Redis OSS-compatible) インスタンスに接続されます。

  • 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

コイン

深いイメージ-96-角度

ImageNetトレーニングデータセットを使用してGoogLeNetニューラルネットワークの出力レイヤーから抽出されるベクトル。

96

9,990,000

10,000

3.57 GB

コイン

Random-s-100-euclidean

ImageNetトレーニングデータセットを使用してGoogLeNetニューラルネットワークの出力レイヤーから抽出されるベクトル。

100

90,000

10,000

34 MB

L2

Mnist-784-euclidean

手書きの数字のModified National Institute of Standards and Technology (MNIST) データベースからのデータセット。

784

60,000

10,000

179 MB

L2

テストツールとメソッド

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

    次のコマンドを実行してhiredisをインストールします。

    pip install tair hiredis
  2. ダウンロードと解凍 Ann-benchmarks.

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

    tar -zxvf ann-benchmarks.tar.gz
  3. のエンドポイント、ポート番号、ユーザー名、およびパスワードを設定します。テアインスタンスのalgos.yamlファイルを作成します。

    algos.yamlファイルを開き、tairvectorを検索して関連する設定項目を見つけ、base-argsの次のパラメーターを設定します。

    • url: Tairインスタンスのエンドポイント、ユーザー名、パスワード。 形式: redis:// user:password @ host:port

    • parallelism: 同時スレッドの数。 デフォルト値: 4。 デフォルト値を使用することを推奨します。

    例:

    {"url": "redis://testaccount:Rp829dlwa@r-bp18uownec8it5****.redis.rds.aliyuncs.com:6379", "parallelism": 4}
  4. を実行します。Run therun.pyテストを開始するためのスクリプト。

    重要

    run.pyスクリプトを実行すると、テスト全体が開始され、インデックスが作成され、インデックスにデータが書き込まれ、結果がクエリされて記録されます。 単一のデータセットでスクリプトを繰り返し実行しないでください。

    例:

    # Run a multi-threaded test by using the Sift-128-euclidean dataset and HNSW indexing algorithm. 
    python run.py --local --runs 3 --algorithm tairvector-hnsw --dataset sift-128-euclidean --batch
    # 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

    組み込みのwebフロントエンドを使用してテストを実行することもできます。 例:

    # Install the Streamlit dependency in advance. 
    pip3 install streamlit
    # Start the web frontend. Then, you can enter http://localhost:8501 in your browser. 
    streamlit run webrunner.py
  5. を実行します。Run thedata_export.pyスクリプトを作成し、結果をエクスポートします。

    例:

    # Multiple threads.
    python data_export.py --output out.csv --batch

テスト結果

書き込みパフォーマンスk-nearest neighbor (kNN) クエリのパフォーマンス、およびメモリ効率のテスト結果に注意を払うことを推奨します。

  • 書き込みパフォーマンス: TairVectorの書き込みパフォーマンスは、書き込みスループットに比例して向上します。

  • kNNクエリパフォーマンス: 1秒あたりのクエリ数 (QPS) はシステムパフォーマンスを反映し、リコール率は結果の精度を反映します。 典型的には、リコール率が高いほど、QPSは低くなる。 QPS比較は、再現率が同じである場合にのみ有意である。 これに関連して、試験結果は「QPS対s」で示される。 "カーブを思い出してください。 FLATインデックスの場合、リコール率は常に1であるため、QPSのみが表示されます。

  • メモリ効率: ベクターインデックスのメモリ使用量が少ないほど、TairVectorのパフォーマンスが向上します。

説明

writeとkNNクエリテストの両方に、4つの同時スレッドが含まれます。

この例では、TairVectorのパフォーマンスはfloat32とfloat16のデータ型でテストされます。 デフォルトのデータ型はfloat32です。 HNSWインデックスアルゴリズムのパフォーマンスは、AUTO_GC機能を有効にしてテストされます。

HNSWインデックス

書き込みパフォーマンス

次の図は、ef_constructが500に設定されている場合の、Mパラメータの異なる値でのHNSWインデックス付けアルゴリズムの書き込みパフォーマンスを示しています。 Mパラメータは、グラフインデックス構造内の各レイヤ上の出力ネイバーの最大数を指定する。

  • HNSWインデクシングアルゴリズムの書き込み性能は、Mパラメータの値に反比例して低下する。

  • float32データ型と比較して、float16データ型を使用すると、ほとんどの場合、HNSWインデックスアルゴリズムの書き込みパフォーマンスがわずかに低下します。

  • AUTO_GC機能を有効にすると、HNSWインデックスアルゴリズムの書き込みパフォーマンスが最大30% 向上します。

image (39).png

kNNクエリのパフォーマンス

リコール率とQPSが高いほど、kNNクエリのパフォーマンスは向上します。 したがって、曲線が右上隅に近いほど、HNSWインデックス付けアルゴリズムの性能が向上する。

以下の図は、「QPS対s」を示す。 HNSWインデックスが異なるデータセットで使用されるときの「曲線」を思い出してください。

  • 4つのデータセットすべてで、HNSWインデックスは99% を超える再現率を達成できます。

  • float32データ型と比較して、float16データ型を使用すると、HNSWインデックスアルゴリズムのパフォーマンスがわずかに低下します。 これら2つのデータ型のパフォーマンスは非常に近いです。

  • AUTO_GC機能を有効にすると、kNNクエリのパフォーマンスが大幅に低下します。 したがって、大量のデータを削除する場合にのみ、AUTO_GC機能を有効にすることをお勧めします。

image (46).png

パラメーター設定がkNNクエリのパフォーマンスにどのように影響するかを視覚的に示すために、次の図は、QPSと再現率がMとef_searchの値でどのように変化するかを示しています。 この例では、Sift-128-euclideanデータセットとfloat32データ型が使用され、AUTO_GC機能は無効になっています。

Mおよびef_searchの値が増加するにつれて、QPSは減少し、再現率は増加する。

説明

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

2.jpg

メモリ効率

HNSWインデックスのメモリ使用量は、Mパラメーターの値に比例してのみ増加します。

次の図は、異なるデータセット間のHNSWインデックスのメモリ使用量を示しています。

  • float32データ型と比較して、float16データ型はメモリ使用量を40% 以上大幅に削減できます。

  • AUTO_GC機能を有効にすると、メモリ使用量がわずかに増加します。

    説明

    ベクトルの次元とメモリ容量の予算に基づいて、Mパラメーターの適切な値を決定できます。 特定の精度の低下を受け入れることができる場合は、float16データ型を使用してメモリ容量を節約することをお勧めします。

3.jpg

FLATインデックス

書き込みパフォーマンス

次の図は、2つのデータセット間のFLATインデックスの書き込みスループットを示しています。

float32データ型と比較して、float16データ型を使用すると、FLATインデックスの書き込みパフォーマンスが約5% 低下します。

image (43).png

kNNクエリのパフォーマンス

次の図は、2つのデータセット間のFLATインデックスのkNN QPSを示しています。

float32データ型と比較して、float16データ型を使用すると、FLATインデックスのkNNクエリのパフォーマンスが約10% 向上します。

image (44).png

メモリ効率

次の図は、2つのデータセット間のFLATインデックスのメモリ使用量を示しています。

float32データ型と比較して、float16データ型はメモリ使用量を40% 以上削減できます。

image (45).png