ベクトル・データベースにおけるメモリ効率のための積量子化の利用
実践的な例を通して、積量子化の複雑さと実用的な実装を探る。
シリーズ全体を読む
- 非構造化データ入門
- ベクトルデータベースとは?その仕組みとは?
- ベクトルデータベースについて: ベクトルデータベース、ベクトル検索ライブラリ、とベクトル検索プラグインの比較
- Milvusベクトルデータベース入門
- Milvus Quickstart:五分間だけでMilvus ベクトルデータベースをインストール
- ベクトル類似検索入門
- ベクター・インデックスの基本について知っておくべきすべてのこと
- スカラー量子化と積量子化
- 階層的航行可能小世界(HNSW)
- おおよその最近接者 ああ(迷惑)
- プロジェクトに適したベクトルインデックスの選択
- DiskANNとヴァマナアルゴリズム
- データの完全性を守る:ベクターデータベースにおけるバックアップとリカバリ
- AIにおける高密度ベクトル:機械学習におけるデータの可能性の最大化
- ベクターデータベースとクラウドコンピューティングの統合:現代のデータ課題に対する戦略的ソリューション
- 初心者のためのベクターデータベース導入ガイド
- ベクトル・データベースにおけるデータの完全性の維持
- 行と列からベクトルへ:データベース技術の進化の旅
- ソフトマックス活性化関数の解読
- ベクトル・データベースにおけるメモリ効率のための積量子化の利用
- ベクターデータベースにおける検索性能のボトルネックを発見する方法
- ベクターデータベースの高可用性の確保
- Locality Sensitive Hashingのマスター:包括的なチュートリアルと使用例
- ベクターライブラリ vs ベクターデータベース:どちらが適しているか?
- 微調整テクニックでGPT 4.xのポテンシャルを最大限に引き出す
- マルチクラウド環境におけるベクターデータベースの展開
- ベクトル埋め込み入門:ベクトル埋め込みとは何か?
#はじめに
今日、データサイエンスと機械学習は、組織や企業の業務効率化を推進する上で重要な役割を担っている。あらゆるデータサイエンスの取り組みの中核には、データの保存と検索を効率的に管理するという差し迫った課題がある。
ベクターデータベースは、複雑で高次元のデータセットの複雑さを扱うために構築されており、データポイントは埋め込みによってベクターとして変換され保存される。これらのベクトルは、数十から数千に及ぶ多次元にまたがることができ、多様なデータ構造に対応することができる。ベクトルデータベースは、検索拡張世代(RAG)やレコメンダーシステムのような多くのユースケースに恩恵をもたらし、類似性メトリクスに基づく合理的な検索操作を可能にする。
しかし、ベクトルデータベースは、大規模なデータセットを処理する際に、メモリ使用量が多く、クエリの検索速度が遅いなど、多くの課題がある。しかし、特にProduct Quantization (PQ)のような技術によって、これらのハードルに対処するための前進がなされている。このアプローチにより、メモリ要件が90%削減され、スケーラブルで効率的、かつコスト効率の高いベクトルデータベースを展開するための基礎が築かれた。
コーヒーでも飲みながら、積量子化の複雑さと実践的な実装について、実践的な例を通して探っていきます。
積量子化とは何か?
積量子化(PQ)は、高次元のデータベクトルを最小限の情報損失でコンパクトな表現に圧縮する技術です。これは、PCAのような従来の次元削減手法に対して大きな優位性をもたらします。では、積量子化はどのように機能するのでしょうか?以下はその主なステップです。
ステップ1:ベクトルを部分空間に分割する
高次元のベクトルを、同じ大きさの、より小さく管理しやすい部分空間に分割します。例えば、128次元のベクトルは、それぞれ8次元を含む16の部分空間に分割できます。
ステップ2:部分ベクトルの量子化と符号化
これらの部分空間はそれぞれ別々に量子化される。量子化とは、それぞれの部分空間における有限の参照点セットにベクトルをマッピングすることである。これらの参照点は通常、K-meansのようなクラスタリング・アルゴリズムから計算されたセントロイドである。元の値は、最も近いセントロイドのインデックスで置き換えられる。各インデックスは元のベクトルよりも大幅に少ないメモリしか必要としないため、このアプローチはデータサイズを大幅に削減する。
ステップ3:量子化の積
最も近いセントロイドを見つけ、そのインデックスを割り当てることを、すべてのサブベクトルについて繰り返します。各サブベクトルのインデックスを連結し、最終的な圧縮表現を得る。各サブスペースのインデックスに対応する参照点を組み合わせることで、情報の損失を最小限に抑えながら、元のベクトルの近似版を検索することができる。
図1-積量子化の仕組み](https://assets.zilliz.com/Fig_1_How_does_product_quantization_work_241c80b4cb.png)
なぜ類似検索に積量子化を使うのか?
積の量子化は、以下のような大規模データセットでのベクトル検索操作において、多面的な利点をもたらします:
検索速度の高速化:** PQは、ベクトルデータベースが高次元のベクトル全体ではなく、コンパクトなコードのみを比較する必要があるため、類似検索をより高速に実行することを可能にします。このアプローチは、レコメンデーション、画像検索、および同様のタスクのシステムで広く使用されている最近傍検索において特に有益である。
メモリフットプリントの削減**:PQは、元のデータ点をより小さなインデックスに置き換えることで、ベクトルの保存に必要なメモリを大幅に削減します。これは、数百万から数十億の高次元データポイントを含む膨大なデータセットを扱う際に非常に重要です。
スケーラビリティ:*** PQデータの圧縮された性質は、リソースに制約のあるシステムや、高速な応答時間が重要なリアルタイム・アプリケーションにおいて、より大きなデータセットの保存と検索を可能にします。
PQは、データポイント間の類似性関係を保持することに重点を置いているため、PCAのような従来の手法の制限に悩まされることはありません。
積量子化は、複雑な機械学習モデルや大規模なデータ分析タスクをサポートします。精度とメモリ使用量の適切なトレードオフを提供し、多くの最新のAIやデータ駆動型アプリケーションに不可欠です。主な使用例としては、レコメンダー・システム、顔認識システム、不正行為を防止するための異常検知などがあります。
製品量子化の課題
すべてのコインには表と裏がある。積の量子化はベクトル探索における革新的な量子化アプローチですが、同時に課題も伴います。
1.精度の損失: ベクトルの量子化は本質的に情報の損失につながります。近似は、いくつかの類似したベクトルが量子化誤差のために異なるとみなされる可能性があることを意味し、クエリ結果の再現率と精度に影響を与える。
2.部分空間とコードブックの選択:最適な部分空間の数とコードブックのサイズ(各部分空間のセントロイドの数)を決定することは難しいことです。ベクトルを非常に小さな部分空間に分割すると、ベクトルは大幅に圧縮されますが、精度が著しく低下する可能性があります。
3.**特にデータセットの次元とサイズが大きくなるにつれて、量子化器のトレーニング(k-meansクラスタリングのような)は計算集約的になります。このプロセスを効率的に拡張することは、実用的なアプリケーションにとって極めて重要である。
4.コストの管理: ベクトルのエンコードとデコードにかかる計算コストは、リアルタイムの応答が重要な場合、クエリー速度に影響を与える可能性がある。
研究者は、これらの課題に対処し、PQのロバスト性を向上させる技術を開発している。例えば、継続的なデータの取り込みに基づいてコードブックを動的に調整することで、より正確な量子化を行うことができる。マルチスレッドのような並列処理技術は、PQに関連する計算コストを相殺するために使用される。
実験結果:積量子化の実際
積量子化を使用する前に、そのテクニックをどのように評価するかを理解することが不可欠である。ベクトル・データベースにおけるPQを評価する際には、メモリ節約量、データ検索時の呼び出し精度、コストなど、いくつかの点に留意する必要があります。
このセクションでは、ベクトルデータベース用のオープンソースベンチマークツールであるVectorDBBenchを使用して、さまざまなベクトルデータベースのパフォーマンスを検証します。
VectorDBBenchはデータ専門家が様々なベクトルデータベースを比較し、最適解を見つけるためのツールです。このツールには、実際のテストシナリオとOpenAIとCohereの公開データセットが含まれています。レイテンシ・メトリクス、QPS(1秒あたりのクエリー数)、Cost-Performance Ratio(1QPSあたりのコスト)、100万クエリーあたりのコストなど、包括的なパフォーマンス分析レポートを提供します。例えば、このベンチマーク結果によると、Zilliz Cloud(フルマネージドのMilvus)は、Pineconeよりも10倍以上高いQPSスコアを示しています。
パフォーマンス比較-Zilliz CloudとPineconeの比較](https://assets.zilliz.com/Performance_comparison_Zilliz_Cloud_vs_Pinecone_529539a654.png)
性能比較:Zilliz CloudとPineconeの比較。
Zilliz Cloud:8つのパフォーマンス最適化CU
Pinecone:1つのp2(パフォーマンス最適化)ポッドと8つのノード
_データセット:OpenAI、1536次元、50万ベクトル
データセットによるPQのベンチマーク
このセクションでは、PythonのMilvusを使って、あなたのデータセットでProduct Quantization (PQ)をベンチマークする方法を説明します。始める前に、Milvusがインストールされていることを確認してください。詳細はMilvusインストールドキュメントをご参照ください。
Milvusをインストールしたら、Milvusと必要なPythonクライアントをインストールします。Milvusクライアントは pip-install
してください。
pip install pymilvus
次のステップはデータセットの準備である。ベンチマーク結果を歪める可能性のあるノイズや外れ値を除去するためにデータをクリーンアップします。データセットは特徴としてベクトルを持つ必要があります。各データ(画像やテキスト文書など)は数値ベクトルに変換する必要があります。ランダムな値でサンプルデータセットを合成することもできます。
npとしてnumpyをインポートする。
# 単純な1000個の128次元ベクトルを生成する
dataset = np.random.random((1000, 128)).tolist()
Milvus接続をセットアップし、PQ設定でコレクションを構成します。ベクトルをどのように部分空間に分割するかを決めます。部分空間の数(M)と各部分空間の次元(K)は、圧縮と精度の両方に影響する重要な要素です。
from pymilvus import コレクションスキーマ(CollectionSchema)、フィールドスキーマ(FieldSchema)、データタイプ(DataType)、コレクション(Collection
# Milvus サーバに接続
from pymilvus import connections
connections.connect("default", host='127.0.0.1', port='19530')
# ベクトルを格納するコレクションのスキーマを定義する
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True)、
フィールドスキーマ(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128)
]
schema = CollectionSchema(fields, description="Test collection with PQ")
# PQを有効にしてコレクションを作成する
コレクション名 = "vector_search_collection"
コレクション = コレクション(name=コレクション名, schema=schema, using="default")
# PQでインデックスを構成する
index_params = {
"metric_type":"L2",
「index_type":"IVF_PQ"、
「params":params": {"nlist":100, "m":16, "nbits":8 }# m'は副量子化器の数であり、'nbits'は各低次元ベクトルが格納されるビット数である。
}
collection.create_index(field_name="embedding", index_params=index_params)
データを挿入し、パフォーマンスを測定するためにクエリを実行する:
# データをMilvusに挿入する
mr = collection.insert([データセット])
# 検索を行う
search_params = {"metric_type":"L2", "params":{"nprobe":10}}
results = collection.search(dataset[:10], "embedding", search_params, limit=3)
print(results)
結果を評価し、必要であればパラメータを調整し、再度テストする。再現率が満足できない場合は、部分空間の数や部分空間ごとの次元を調整することを検討する。量子化の粒度を上げると、メモリ使用量が増え、クエリ時間が遅くなる可能性がありますが、その代償として想起率を向上させることができます。
# 検索を再実行する
results = collection.search(dataset[:10], "embedding", search_params, limit=3)
print(results)
結果に基づいてアプローチを改良し続ける。ベンチマークは多くの場合、効率と精度の最適なバランスを見つけるための反復プロセスです。これらのコードサンプルはMilvusでPQをベンチマークするための基本的なフレームワークを提供します。設定と結果は、常に特定のデータセットとユースケースの要件で検証してください。
製品量子化のヒントとベストプラクティス
1.**小さな部分空間から始め、必要に応じて徐々に増やす。
2.クラスタ品質: 量子化ステップで高品質のクラスタリングを確保します。不十分なクラスタは近似の品質を著しく低下させます。
3.ハードウェアの利用:利用可能な場合は、特に大規模なデータセットを処理する際に、ハードウェアアクセラレーション(GPUなど)を使用する。
4.並列処理:Milvusの並列処理機能を利用し、量子化器のトレーニングやクエリーフェーズを高速化する。
ベクトル探索におけるPQの応用](https://assets.zilliz.com/Applications_of_PQ_in_vector_search_394932f11f.png)
結論
積量子化(PQ)は、類似検索に対する革新的なアプローチである。検索精度を大きく損なうことなくデータをコンパクトな表現に圧縮することで、PQは企業や研究者が既存のハードウェアでより大きなデータセットを管理し、パフォーマンスを維持しながらコストを削減することを可能にします。Milvusは、効率的なベクトル検索のための積量子化をサポートする先進的なオープンソースのベクトルデータベースです。検索機能の向上を目指すデータサイエンティストであれ、データインフラの最適化を目指す企業であれ、Milvusはお客様のアプリケーションに最適なソリューションです。