mmapを使う
メモリマッピング(Mmap)により、ディスク上の大きなファイルに直接メモリアクセスできるため、Zilliz Cloudはインデックスとデータをメモリとハードドライブの両方に保存できます。このアプローチにより、アクセス頻度に基づいてデータ配置ポリシーを最適化し、検索パフォーマンスに影響を与えることなくコレクションのストレージ容量を拡張できます。このページでは、Zilliz Cloudがmmapを使用して高速かつ効率的なデータストレージと取得を可能にする方法を理解するのに役立ちます。
この機能はまだパブリックプレビュー中です。この機能に関する問題が発生した場合は、Zilliz Cloudサポートにお問い合わせください。
異なるプランを持つソースクラスタとターゲットクラスタ間でデータを移行または復元する場合、ソースコレクションのMmap設定はターゲットクラスタに移行されません。ターゲットクラスタのMMAP設定を手動で再構成してください。
概要について
Zilliz Cloudは、ベクトル埋め込みとそのメタデータを整理するためにコレクションを使用し、コレクション内の各行はエンティティを表します。下の左図に示すように、ベクトルフィールドにはベクトル埋め込みが格納され、スカラーフィールドにはメタデータが格納されます。特定のフィールドにインデックスを作成し、コレクションをロードすると、Zilliz Cloudは作成されたインデックスとすべてのフィールドからの生データをメモリにロードします。
Zilliz Cloudクラスターはメモリを大量に消費するデータベースシステムであり、利用可能なメモリ体格がコレクションの容量を決定します。データ体格がメモリ容量を超える場合、大量のデータを含むフィールドをメモリにロードすることは不可能であり、これはAI駆動型アプリケーションの通常の場合です。
このような問題を解決するために、Zilliz Cloudはmmapを導入して、コレクション内のホットデータとコールドデータのロードをバランスさせます。上の右図に示すように、Zilliz Cloudはベクトルインデックスのみをメモリにロードし、容量最適化されたCUを使用しているZilliz Cloudクラスターを使用している場合は、コレクションをロードするときにすべてのフィールドとスカラーインデックスの生データをメモリマップします。
左の図と右の図のデータ配置手順を比較することで、左の図のメモリ使用量が右の図よりもはるかに高いことがわかります。mmapが有効になっている場合、メモリにロードされるはずのデータはハードドライブにオフロードされ、オペレーティングシステムのページキャッシュにキャッシュされ、メモリフットプリントが減少します。ただし、キャッシュヒットの失敗はパフォーマンスの低下につながる可能性があります。詳細については、この記事を参照してください。
グローバルmmap戦略
次の表は、さまざまな階層のクラスターに対するグローバルmmap戦略を示しています。
Mmapターゲット | 専用クラスター | フリー&サーバーレスクラスタ | |
---|---|---|---|
Performance-optimized | キャパシティ最適化 | ||
スカラー場の生データ | 無効と変更可能 | 有効および変更可能 | 有効および変更不可 |
スカラー場指数 | 無効と変更可能 | 有効および変更可能 | 有効および変更不可 |
ベクトルデータ | 有効および変更可能 | 有効および変更可能 | 有効および変更不可 |
ベクトル場インデックス | 無効および変更不可 | 無効および変更不可 | 有効および変更不可 |
専用 クラスターでPerformance-optimizedCUを使用する場合、Zilliz Cloudはベクトルフィールドの生データに対してのみmmapを有効にし、スカラーフィールドの生データとすべてのフィールドインデックスをメモリにロードします。検索やクエリ中のメタデータフィルタリングと取得のパフォーマンスを確保するために、グローバル設定を保持することをお勧めします。ただし、メタデータフィルタリングに関与しないフィールドや出力フィールドとして使用されないフィールドに対しては、引き続きmmapを有効にすることができます。
専用クラスターでCapacity-OptimizedCUを使用する場合、Zilliz Cloudは自動インデックスのためにベクトルフィールドインデックスのmmapを無効にし、スカラーフィールドとすべてのフィールド生データのインデックスをメモリマップして、最大ストレージ容量を確保します。メタデータフィルタリング条件で使用される一部のフィールドの生データまたは出力フィールドにリストされている生データが大きすぎてハードドライブに残されると、応答が遅くなったりネットワークジッターが発生する場合は、これらのフィールドのmmapを無効にして検索パフォーマンスを向上させることを検討できます。
Zilliz Cloudは、FreeクラスタとServerlessクラスタで、すべてのフィールドの生データとインデックスのmmapを有効にし、システムキャッシュを最大限に活用し、ホットデータのパフォーマンスを向上させ、コールドデータのコストを削減します。
コレクション固有のmmap設定
You need to release a collection to make changes to the mmap settings and load it again to make the changes tothe mmap settings take effect.特定のフィールド、フィールドインデックス、またはコレクションに対してmmapを設定できます。
mmap設定を変更する際は注意してください。不適切なmmap設定は以下の問題を引き起こす可能性があります:
専用クラスターperformance-optimized場合、検索やクエリ中にスカラーフィールドを高速に取得するために、すべてのスカラーフィールドの生データとベクトルインデックスがデフォルトでメモリにロードされます。デフォルトのmmap設定を変更すると、パフォーマンスが低下する可能性があります。
容量最適化された専用クラスターでは、最大ストレージ容量を確保するために、ベクトルインデックスのみがデフォルトでメモリにロードされます。デフォルトのmmap設定を変更すると、メモリ不足(OOM)の問題によりロードエラーが発生する場合があります。
特定のフィールド用にmmapを設定する
小さなperformance-optimizedCUを持つ専用クラスターを使用していて、データセット内のフィールドの生データが大きい場合は、mmapを有効にしてコレクションにフィールドを追加することを検討してください。
次の例では、performance-optimized専用クラスターに接続することを前提としており、フィールドを追加しながらdoc_chunkという名前のVarCharフィールドでmmapを有効にする方法を示します。
from pymilvus import MilvusClient
CLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT"
TOKEN="YOUR_TOKEN"
client = MilvusClient(
uri=CLUSTER_ENDPOINT,
token=TOKEN
)
schema = MilvusClient.create_schema()
# Disable mmap on a field upon creating the schema for a collection
schema.add_field(
field_name="doc_chunk",
datatype=DataType.INT64,
max_length=512,
mmap_enabled=False,
)
# Disable mmap on an existing field
# The following assumes that you have a collection named `my_collection`
client.alter_collection_field(
collection="my_collection",
field_name="doc_chunk",
properties={"mmap.enable": True}
)
上記のスキーマを使用して作成されたコレクションをロードすると、Zilliz Cloudはdoc_chunkフィールドの生データをメモリマップします。フィールドのmmap設定を変更するには、コレクションを解放し、変更後に再度コレクションをロードする必要があることに注意してください。
スカラーインデックス用にmmapを設定する
メタデータフィルタリングに関与するスカラーフィールド、または出力フィールドとして使用されるスカラーフィールドについては、他のスカラーフィールドをハードドライブに保持しながらメモリにロードすることを検討してください。
次の例では、容量が最適化された専用クラスターへの接続を前提としており、titleという名前のVarCharフィールドのインデックスでmmapを無効にしてすばやく取得する方法を示します。
# Add a varchar field
schema.add_field(
field_name="title",
datatype=DataType.VARCHAR,
max_length=512
)
index_params = MilvusClient.prepare_index_params()
# Create index on the varchar field with mmap settings
index_params.add_index(
field_name="title",
index_type="INVERTED"
params={ "mmap.enabled": "false" }
)
# Change mmap settings for an index
# The following assumes that you have a collection named `my_collection`
client.alter_index_properties(
collection_name="my_collection",
index_name="title",
properties={"mmap.enabled": True}
)
上記のインデックスパラメータを使用して作成されたコレクションをロードすると、Zilliz Cloudはタイトルフィールドのインデックスをメモリにロードします。フィールドのmmap設定を変更するには、コレクションをリリースし、変更後に再度コレクションをロードする必要があることに注意してください。