「ベクターデータベースのベンチマークには、ストリーミングワークロードを使用してください」
美容とファッションの専門家がおくる、情報満載で鮮やかな記事
静的なワークロードが不十分である理由と、ストリーミングワークロードを使用してHNSWLIBとDiskANNを比較した結果について学んだこと
ベクトルデータベースは高次元ベクトルの検索用に構築されています。現在では、GPTやCLIPなどのディープニューラルネットによって生成される埋め込みベクトルが、テキストの一部、画像、または音声トラックなどのデータポイントを表すために使用されています。埋め込みベクトルは、検索エンジン、レコメンデーションシステム、チャットボットなどの多くのアプリケーションで使用されます。ベクトルデータベースには、余弦距離やユークリッド距離といった距離関数によるトップネイバーの高速検索をサポートする、近似最近隣接(ANN)インデックスが使用されます。100万個のベクトルのインデックスのレイテンシは2〜10ミリ秒であり、インデックスサイズに対して亜線形的に(つまりO(log n))スケールします。
このポストでは、現在のANNインデックスの評価方法のいくつかの問題点を指摘し、新しい評価方法を提案します。このポストは、埋め込みベクトルのANNインデックスに焦点を当てており、ベクトルデータベースのスタートアップ企業であるPinecone、Zilliz、Qdrant、およびWeaviateが埋め込みインデックスと検索をコアサービスとして提供している分野について注目しています。
1. 静的なワークロードベンチマークは不十分です。
ANNインデックスを評価する標準的な方法は、静的なワークロードベンチマークを使用することです。これは固定のデータセットと固定のクエリセットで構成されています。
静的なワークロードベンチマークは、まず固定のデータセットからANNインデックスを構築し、その後、異なるパラメータ設定で固定のクエリセットを複数回実行し、各最小精度レベルで最大のクエリスループットを測定します。同様の手順を各ANNインデックスに対して実行した後、ベンチマークは以下のようなプロットを生成します:
上記のプロットは、glove-100-angularという静的なワークロードを使用して異なるANNインデックスを比較しています。このワークロードには単語の埋め込みが含まれています。
この評価アプローチは、5年前に始まったann-benchmarksプロジェクトによって普及しました。現在、多くのベクトルデータベースは、テックブログでこのアプローチを使用してパフォーマンスを測定しています。 QdrantベンチマークやTimescaleベンチマークを参照してください。
静的ワークロードのベンチマークは、結果が理解しやすく、同じグラフを使用して異なるインデックスアルゴリズム間の精度とクエリパフォーマンスのトレードオフを比較することができるため、有用です。
ただし、これはANNインデックスの完全な評価ではありませんので、プロジェクトでANNインデックスを選択する際にはこの結果だけに基づいては選択しないでください。これは、再現率の精度とクエリパフォーマンスに過度に重点を置いており、インデックスパフォーマンスやメモリ使用量などの他の重要な要素をスキップしています。
インデックスパフォーマンスを反映すべきです。
インデックスのスループットは、ANNインデックスが新しいデータポイントを受け入れる速度を測定します。クエリスループットと同様に、通常は再現率の精度と逆相関します。以下のグラフは、HNSWLIBとDiskANN Vamanaのインデックスのインデックススループットと再現率の関係を示しています。
このグラフは、以前の再現率-QPSグラフに似ていますが、このグラフからは、より高い再現率がインデックスパフォーマンスのトレードオフでもあることがわかります。ただし、インデックスパフォーマンスとクエリパフォーマンスの両方に興味がある場合、このグラフはまだ不十分です。なぜなら、静的ベンチマークはインデックスとクエリを分離するため、再現率パフォーマンストレードオフが行われている余裕の範囲を示していないからです。
多くのANNインデックスは、一度に複数のベクトルを追加する点インデックスよりも最適化されたバルクインデックスAPIをサポートしています。例えば、クラスタベースのANNインデックスは、一括ですべてのベクトルのクラスタを作成します。静的ワークロードのベンチマークでは、インデックスとクエリのワークロードが分離されているため、現実的ではないバルクインデックスが推奨されます。
インデックスに関連するもう1つの問題は、プロダクト量子化(PQ)です。多くのANNインデックスは、速度を向上させるためにPQや他の形式のベクトル圧縮を使用しています。静的ワークロードのベンチマークでは、ANNインデックスがクエリフェーズの前に最適化された圧縮コードブックを構築することができますが、そのような最適なコードブックは実際には実現できない場合があります。
メモリ使用量は重要です。
人気のあるANNインデックスのほとんどはインメモリであり、主要なデータ構造が揮発性のストレージ(DRAM)にあり、クエリが提供されます。したがって、メモリ効率とそのパフォーマンスおよび再現率のトレードオフを測定することは重要です。例えば、この研究論文では、HNSWの1億のポイントのメモリ使用量が490 GB、NSGは303 GBであり、再現率とクエリパフォーマンスの面ではHNSWがわずかにNSGを凌駕しています。ANNインデックスのベンチマークを行う際には、このようなトレードオフに重点をおくべきです。
それでも、静的ベンチマークだけではメモリの効率的な詳細な情報を得ることは困難です。その理由はいくつかあります。ひとつには、ANNインデックスアルゴリズムは、後続のインデックスパフォーマンスの割に非常にコンパクトな読み取り最適化されたインデックスを作成できます。もうひとつの理由は、ワークロードが純粋なインデックスまたは純粋なクエリのみをキャプチャしており、新しいデータが常に到着するQ&Aエンジンやチャットボットなどの実際のシナリオでより頻繁に発生するミックスをカバーしていないためです。
データの分布は時間とともに変化します。
静的ベンチマークでは、データとクエリのセットは変更されません。これは、データとクエリは時間とともに変化するユーザーの関心によって駆動されるため、現実的ではありません。データとクエリセットが常に固定されている場合、最良のインデックスはすべてのクエリ結果を記憶するキャッシュです。最近のANNインデックスの研究(例:FreshDiskANN)では、分布外のクエリパフォーマンスを計測することが始まりました。これは大きな進歩です。
削除についてはどうですか?
ANNインデックスでは、削除APIが標準になりつつありますが、どの静的ベンチマークもこれを測定していません。削除を処理できることは重要です。なぜなら、チャットボットなどの新たなAI関連アプリケーションシナリオでは、データが常に追加および変更されるオンライントランザクション処理(OLTP)データベースに似た運用ストレージとしてANNインデックスが使用されるからです。
2.ストリーミングワークロードはさらに多くの情報を提供します。
ANNインデックスが次のAPIをサポートしている場合:
- Insert(ID, ベクトル)
- Query(ベクトル)
- Delete(ID)
かつ使用シナリオが静的なデータとクエリ以外の場合(すべてのシナリオに当てはまりますね?)、ストリーミングワークロードベンチマークはANNインデックスの特性と特定の使用シナリオに対するパフォーマンスをより深く理解するのに役立ちます。
ストリーミングワークロードベンチマークは、データストリーム(InsertおよびDelete API呼び出しのシーケンスに対応)とクエリストリーム(Query API呼び出しのシーケンス)の2つのストリームで構成されます。これは、Kafkaのような実際のストリーミングシステムを使用するか、静的なベンチマークで使用されるデータセットとクエリセットに似たポインタのシーケンスを持つランブックを使用して実現できます。
上記の図は、NeurIPS 23′ Big ANN Benchmarksで使用されるストリーミングワークロードベンチマークの例です。具体的には、ランブックの各ステップがベクトルのバッチに対応しているため、操作は並列で実行されます。このアプローチには以下の利点があります:
- 柔軟性:ワークロードパターンとデータ分布の変更は、異なるストリーミングワークロードとしてモデル化でき、異なるランブックにコンパイルされます。
- リアル:インデックスとクエリは交互に実行されるため、ANNインデックスは将来の挿入に適応する必要があります。また、メモリプロファイルは実際のワークロードをより正確に反映します。
- シンプルな解析:パフォーマンスは、インデックスとクエリのスループットではなく、総合スループットを使用して説明できるため、再現性とパフォーマンスのトレードオフを簡単に可視化できます。
- 完全性:挿入および削除操作も評価されます。
このブログ記事では、上記の(4)について詳しく掘り下げ、ストリーミングワークロードベンチマークを使用した新しい洞察を紹介します。
再現性の安定性を比較:HNSW vs. Vamana
ストリーミングワークロードベンチマークを実行する際に、収集する重要なメトリックの1つは、各クエリ操作の再現性です。私たちは、異なるインデックスのセットアップ(パラメータ、アルゴリズムなど)を比較し、時間の経過に伴う再現性の安定性を見て、特定の使用シナリオに適したインデックスを選択することができます。
私は、DiskANNのVamanaとさまざまなHNSWの実装の再現性の安定性を、NeurIPS 23′ Big ANN Benchmarksの最終ランブックで定義されたストリーミングワークロードで計測しました。
VamanaとHNSWについての背景情報:両者はともにグラフANNインデックスであり、埋め込みを扱うことに特化しています。グラフANNインデックスでは、各ベクトルはノードであり、クエリはグラフのトラバーサルとして実行されます。メモリ使用量を制限しながら、任意のノードから任意のノードへの高速なトラバーサルを保証するために、方向付けられた辺が選択的に構築されます。インプレースの削除中、削除されたノードの受信隣接ノードごとに、グラフANNインデックスはエッジ修復を実行し、方向付けられたグラフ構造を維持します。
私たちが使用する最初のHNSWの実装は、HNSWLIBを基にしたもので、Delete APIを追加するために「repairConnectionsForUpdate」という修復アルゴリズムを使用しています。このアイデアは、修復するノードを「再挿入」し、すべてのレベルでの彼の出力ノードを更新することです。以下の図は、VamanaとHNSWの再現率を時間経過で示したものです。
ヴァーマナの最大度合いパラメータを40(R = 40
)に設定し、HNSWのベースレイヤーの最大度合いも40(M = 20, M0 = 40
)に設定したことに注意してください。したがって、彼らはほぼ同じメモリを使用するはずです。
このグラフから明らかなように、デリートはリコールに逆効果をもたらし、連続したデリートの間にリコールが単調に減少します。比較すると、HNSWはVamanaよりもデリートにより大きく影響を受けます。
私たちが使用する2番目のHNSW実装は、HNSWLIBのエッジ修復アルゴリズムをVamanaのものに置き換えますが、これはかなり異なります。Vamanaのエッジ修復アルゴリズムのアイデアは、削除されたノードの入力近傍を削除されたノードの出力近傍に接続することであり、最大度制約を維持するために剪定ステップを適用します。この場合、HNSWの元の剪定アルゴリズムを使用します。これは、HNSWLIBによってgetNeighborsByHeuristic2
という関数で実装されています。
すべてのパラメータが同じままの場合、HNSWLIBのエッジ修復アルゴリズムをVamanaのものに変更することで、HNSWのリコールの安定性がすぐに改善されました。
さらに一歩踏み込んで、HNSWのエッジ剪定アルゴリズムをVamanaのものに変更しましょう。これにより、HNSWインデックスはVamanaのものとほぼ同じになりますが、複数のレイヤーを持っています。このインデックスを「マルチレイヤーヴァーマナ」と呼びます。
HNSWのリコールは、似たようなメモリを使用しながら、現在はわずかにVamanaよりも高くなっていることがわかります。私はどこにでもこの観察結果を見つけることはありませんでした。さらに、図にはパフォーマンスが表示されていませんが、Vamanaの剪定アルゴリズムに切り替えると、著しい遅延が発生することに気づきました。
結論として、ストリーミングワークロードベンチマークを使用して、異なるエッジ修復および剪定アルゴリズムに関する新しい知見を発見することができました。次の論理的なステップは、これらのアルゴリズムのパフォーマンスへの影響を調査することであり、私はストリーミングワークロードベンチマークを使用してこれを行うことができます。
3. 結論
要約すると、このブログ記事では、静的ワークロードベンチマークはANNインデックスの実際の評価には不十分であり、代わりにより優れたストリーミングワークロードベンチマークを説明しました。また、特定のストリーミングワークロードを使用して、HNSWとVamanaインデックスの新しい比較を明らかにしました。NeurIPS 23′ Big ANN Benchmarksのチームに感謝します!彼らはこのブログ記事で使用したストリーミングワークロードをオープンソース化しています。
ベクトルデータベースのためにTPC-CとTPC-Hが必要です。
ベンチマーキングにはまだ多くの作業が必要です。ANNインデックスはベクトルデータベースの中核機能であり、これまでに3億5000万ドル以上の資金を集めています。しかし、これらの多くは、実際の使用シナリオを反映しなくなった時代遅れのアプローチを使用してパフォーマンスを測定しているままです。データベースシステムは90年代と2000年代初頭に同様の段階を経験しました。そのときには、TPC-CやTPC-Hなどの標準ベンチマークが開発され、現在でも使用されています。ベクトルデータベースにもこのようなものが必要です。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles