VectorDBBenchの最速のオープンソース ベクトル データベースとして、Milvus は高パフォーマンスのニーズを持つユーザーに適切に対応できます。同時に、一部のユーザーはオフライン サービスに Milvus を使用しており、一部のユーザーはパフォーマンス要件に敏感ではないため、同じ仕様のインスタンスではより低コストでより多くのデータを処理する必要があることにも気づきました。データの。
そこで、Milvus 2.3 では、MMap 機能を追加しました。MMap を有効にすると、同じ仕様のインスタンスでより多くのデータを処理できるようになり、同時に必要なメモリ サイズがディスクに転送され、したがって、コストが大幅に削減されます。
Milvus 2.3 では、milvus.yaml を変更することで MMap 関数を開始できます。構成項目の下に新しい項目をqueryNode
追加し、その値を任意の有効なパスに設定します。mmapDirPath
次に、MMap について詳しく見てみましょう。
01.MMapとは何ですか?
MMap (Memory-mapped files) は、オペレーティング システムのファイルとメモリ間のマッピングを実装するテクノロジです。MMap を通じて、ファイルの内容をプロセスのアドレス空間に直接マッピングできるため、ファイルの内容を明示的なファイルの読み取りまたは書き込み操作を行わずに、メモリの連続領域として扱われます。MMap は、ファイルにアクセスするための効率的かつ便利な方法を提供します。これは、大きなファイルを扱う場合や、ファイルの内容へのランダム アクセスが必要な場合に特に役立ちます。
簡単な C 言語の例は次のとおりです。
void* map = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, offset)
マップポインタを介して後続のデータを読み込む場合は、fd に対応するファイルの内容が直接読み込まれます。読み取り領域がメモリ内にない場合、オペレーティング システムは対応するページと隣接するページをページ キャッシュにキャッシュし、アクセス頻度の低いページはスワップ アウトされる可能性があります。
Milvus で MMap を有効にすると、データはメモリに直接ロードされなくなります。クエリが発生すると、データはディスクからメモリに動的にロードされ、システムは使用頻度の低いデータも動的に削除します。Milvus クエリ クラスター内のデータはすべて不変であるため、データがメモリから削除されると、ディスクへの書き込みは発生しません。
02.性能、コスト、システム上限
ベクトル データを保存する必要があるため、ベクトル データベースにはより多くのメモリ容量が必要になります。限られたメモリでより多くのデータを処理したいが、パフォーマンスにはそれほど敏感ではないユーザーは、MMap 機能を使用できます。システムは負荷と使用状況に基づいて一部のデータをメモリから削除し、同じメモリ容量でより多くのデータを処理できるようにします。
空間と時間のバランスを探る
世界には無料のランチはなく、MMap の価格はパフォーマンスです。弊社のテストによると、メモリが十分にある場合、ウォームアップ後にデータはすべてメモリ内にあり、この時点ではシステムのパフォーマンスが大幅に低下することはありません。データ量が増加し続けると、パフォーマンスは徐々に低下します。したがって、パフォーマンスを重視しないユーザーのみが MMap 機能を使用することをお勧めします。
ご存知のとおり、データのアクセス パターンはパフォーマンスに大きな影響を与える可能性があります。Milvus の MMap 関数は、パフォーマンスに対する局所性の影響を考慮するために最善を尽くします。データ部分については、通常、フィルタリングおよび読み取り中にアクセスされ、順次アクセスされるため、スカラー データは順番にディスクに直接書き込まれます。可変長型については、さらに最適化を行いました。以下の図に示すように、3 つの文字列は次のとおりです。
-
ベクター
-
データベース
-
カイト
可変長型はフラット化されて連続領域に書き込まれ、データのインデックスを付けるためにメモリ内にオフセット配列を維持します。これにより、データ アクセスの局所性が保証され、各可変長データを個別に保存するオーバーヘッドも排除されます。
ベクトルインデックスの場合、より詳細な最適化が必要です。最も一般的に使用される HNSW を例に挙げると、HNSW は 2 つの部分に分けることができます。
-
グラフ内の点間の接続を格納する隣接リスト
-
生のベクトルデータ
ベクトル自体は比較的大きく、通常は連続した数百または数千の float32 であるため、単一のベクトル自体にアクセスすると局所性を利用できます。隣接リストのアクセス パターンは、クエリ プロセス中に比較的ランダムです。通常、ベクトル データは隣接リストよりもはるかに大きいため、ベクトル データに対してのみ MMap を実行することにしましたが、隣接リストはメモリ内に保持され、大量のメモリを節約しながらパフォーマンスが大幅に低下しないようにします。
ゼロコピー
MMap がシステムによって処理されるデータ量の上限を増やすには、まず、データ読み込みプロセス全体におけるピーク メモリ使用量が実際のデータ量よりもはるかに低いことを確認する必要があります。Milvus の以前のバージョンでは、QueryNode はデータのロード時にすべてのデータを読み取り、データはプロセス全体でコピーされていました。MMap 機能の開発中に、このプロセスをストリーミング プロセスに変更し、多くの不要なコピーを削除し、データ読み込みプロセス中のメモリのオーバーヘッドを大幅に削減しました。
これらの最適化の後、MMap はシステムの機能の上限を真に向上させることができ、テスト後、Milvus 2.3 で MMap をオンにすると、Milvus は約 2 倍のデータ量を処理できるようになります。
現在、MMap 機能はまだベータ版ですが、将来的にはシステム全体のメモリ使用量のさらなる最適化を行い、単一ノードでより多くのデータをサポートできるようにする予定です。同時に、使用方法でより多くの反復が行われ、よりきめ細かい制御がサポートされ、コレクション、さらにはフィールドの読み込みモードが動的に変更されます。
-
Milvus または Zilliz 製品の使用に問題がある場合は、WeChat アシスタント「zilliz-tech」をコミュニケーション グループに追加できます。
-
最新情報を知るために、WeChat 公開アカウント「Zilliz」をフォローしてください。