Turbovec: GoogleのTurboQuantを使用した高性能ベクトル検索

Turbovecは、Google ResearchのTurboQuantアルゴリズムを実装した、Rustで記述されPythonバインディングを備えた高性能ベクトルインデックスです。float32の31 GBと比較して、1000万件のドキュメントコーパスを4 GBのRAMに収めるという大規模なメモリ削減を実現しながら、FAISS IndexPQFastScanを凌駕する検索速度を提供します。

コア技術の利点

Turbovecは、データに依存しない量子化アプローチを提供し、個別のトレーニングフェーズを不要にすることで、コーパスが時間の経過とともに成長する動的な環境に適しています。

メモリ効率と圧縮

Turbovecは、ベクトルの精度を2ビットまたは4ビットの表現に削減することで、大幅な圧縮を実現します。1536次元のベクトルの場合、フットプリントは6,144バイト(FP32)から384バイト(2ビット)に減少し、16倍の圧縮率を達成します。

検索パフォーマンス

Turbovecは、手書きのSIMDカーネルを使用して、異なるCPUアーキテクチャ全体でスループットを最大化します:

  • ARM: NEON SDOT/SMMLAドット積カーネルを使用して、ベクトルメジャーレイアウトを直接スコアリングします。
  • x86: 高速なルックアップと累積のために、AVX-512 VNNIおよび vpermb を採用しています。

ベンチマークは、Turbovecが測定されたすべての構成においてFAISS IndexPQFastScanを上回ることを示しており、両方のアーキテクチャにおいて4ビットで平均3.4倍の高速化、2ビットで23%の改善を達成しています。

オンラインインジェストと永続化

多くのプロダクト量子化(PQ)の実装とは異なり、Turbovecはトレーニングステップ、パラメータチューニング、またはインデックスの再構築なしでオンラインインジェストをサポートしています。sync(path)を介した増分保存メカニズムを備えており、変更されたデータのみを永続化し、呼び出しごとに単一のfsyncを使用することで、クラッシュ安全性と、インデックスのサイズに関にかわらず、追加または削除のミリ秒レベルのレイテンシを保証します。

TurboQuantの仕組み

Turbovecは、検索精度を維持しながら、超球面上での高次元方向を圧縮するためのマルチステージパイプラインを実装しています。

  1. 正規化: 各ベクトルの長さ(ノルム)を剥ぎ取り、単一のfloatとして保存することで、ベクトルを単位方向に変換します。
  2. ランダム回転: ベクトルはランダムな直交行列によって乗算されます。これにより、元のデータ分布に関係なく、すべての座標が独立して予測可能なBeta分布(高次元ではGaussianに収束)に従うようになります。
  3. 座標ごとのキャリブレーション (TQ+): 有限次元のドリフトに対処するため、TQ+はシフトとスケールを適合させ、経験的な分位数をコードブックの最も外側のセントロイドにマッピングします。これは、小さな代表的なサンプル(~1024行)を使用して一度だけ行われます。
  4. Lloyd-Maxスカラー量子化: 分布が既知であるため、平均二乗誤差を最小化するために、Lloyd-Maxアルゴリズムを使用して最適なバケット境界とセントロイドを事前に計算します。
  5. ビットパッキング: 座標は小さな整数(2ビットの場合は0-3、4ビットの場合は0-15)に変換され、バイト内に密にパッキングされます。
  6. 長さ再正規化スコアリング: 量子化によって引き起こされる内積の系統的な過小評価を修正するため、Turbovecは各ベクトルに対して補正スカラー(||v|| / ⟨u, x²⟩)を保存します。検索カーネルは、ヒープ挿入の前にこのスカラーを適用して、検索時間のストレージコストを追加することなくバイアスを排除します。

統合と使用法

Turbovecは、人気のあるAIフレームワークにおけるインメモリ・ベクトル・ストアのドロップイン・リプレイスメントとして設計されています:

  • LangChain: pip install turbovec[langchain] を介して InMemoryVectorStore を置き換えます。

  • LlamaIndex: pip install turbovec[llama-index] を介して SimpleVectorStore をを置き換えます。

  • Haystack: pip install turbovec[haystack] を介して InMemoryDocumentStore をを置き換えます。

  • Agno: pip install turbovec[agno] を介して LanceDb を置き換えます。

ハイブリッド検索

Turbovecは、allowlist(またはスロット・ビットマスク)による検索時のフィルタリングをサポートしています。SIMDカーネルは、許可されたスロットがないブロックを32ベクトルの粒度でショートサーキットし、最終的に破棄されるベクトルのスコアリングを回避することで、コストを回避します。これにより、、選択的なフィルタがフルインデックス・スキャンのフルSIMDコストを負わないようにします。

コミュニティの洞察と反論

技術的なベンチマークは素晴らしいものですが、コミュニティは、プロジェクトの起源やベクトル検索の広範な展望について、いくつかの点を指摘しています:

  • 学術的論争: 一部のユーザーは、OpenReviewのコメントや外部の執筆物において、オリジナルのTurboQuant論文に関する学術的不正の疑いがあることを指摘しており、RaBitQのような以前の著作物との重複を示唆しています。
  • ベースライン比較: 一部の批判者は、FAISSは現代のベクトルインデックス・ベンチマークにおける最先端(SoTA)のベースラインではもはやないと主張しています。
  • 代替アプローチ: 議論では、Matryoshka埋め込みや、微調整された埋め込みモデル(次元を64に削減)を使用することで、大幅なメモリ節約が可能であることも強調されており、量子化がすべてのパイプラインにおいて常に最適な道であるかという疑問を疑問を投げかけています。

Sources

関連

  • プロジェクト
  • プロジェクト
  • プロジェクト
  • Dispatch
  • プロジェクト