パフォーマンスFAQ
IVFインデックスのnlist
、nprobe
の設定方法を教えてください。
nlist
の設定はシナリオによって異なります。経験則として、nlist
の推奨値は4 × sqrt(n)
で、n
はセグメント内のエンティティの総数です。
各セグメントのサイズはdatacoord.segment.maxSize
パラメータによって決定され、デフォルトでは 512 MB に設定されている。セグメント内のエンティティの総数 n は、datacoord.segment.maxSize
を各エンティティのサイズで割ることで推定できる。
nprobe
の設定は、データセットとシナリオに固有であり、精度とクエリパフォーマンスのトレードオフを伴います。実験を繰り返して理想的な値を見つけることをお勧めします。
以下のグラフは、sift50mデータセットとIVF_SQ8インデックスで実行したテストの結果です。nlist
/nprobe
の異なるペアのリコールとクエリのパフォーマンスを比較しています。
精度テスト パフォーマンステスト
なぜ小さいデータセットではクエリに時間がかかるのか?
クエリー操作はセグメントに対して行われる。インデックスがあると、セグメントへのクエリにかかる時間が短縮される。セグメントがインデックス化されていない場合、Milvusは生データに対して総当り検索を行うため、クエリ時間が大幅に増加します。
そのため、インデックスが作成されていない小さなデータセット(コレクション)に対するクエリには通常時間がかかる。これはセグメントのサイズがrootCoord.minSegmentSizeToEnableindex
で設定されたインデックス構築のしきい値に達していないためである。create_index()
を呼び出すと、Milvusは閾値に達しているがまだ自動的にインデックスが作成されていないセグメントに強制的にインデックスを作成し、クエリのパフォーマンスを大幅に向上させることができます。
CPU使用率に影響を与える要因は何ですか?
Milvusがインデックスを構築したり、クエリを実行したりすると、CPU使用率が増加します。一般的に、インデックス構築はシングルスレッドで実行されるAnnoyを使用する場合を除き、CPUを集中的に使用します。
クエリを実行する場合、CPU使用率はnq
とnprobe
の影響を受けます。nq
とnprobe
が小さい場合、同時実行性は低く、CPU使用率は低く保たれる。
データの挿入と検索を同時に行うと、クエリのパフォーマンスに影響しますか?
挿入操作に CPU が集中することはありません。しかし、新しいセグメントがインデックス構築のしきい値に達していない可能性があるため、milvusは総当たり検索に頼り、クエリ性能に大きな影響を与えます。
rootcoord.minSegmentSizeToEnableIndex
パラメータはセグメントのインデックス構築しきい値を決定し、デフォルトでは1024行に設定されています。詳細はシステム構成を参照してください。
VARCHARフィールドにインデックスを作成すると削除速度が向上しますか?
VARCHARフィールドにインデックスを作成すると、"Delete By Expression "操作を高速化できますが、特定の条件下でのみ可能です:
- INVERTEDインデックス:INVERTED インデックス:このインデックスは、プライマリ・キーでない VARCHAR フィールドの
IN
または==
式に役立ちます。 - トライ・インデックス:このインデックスは、主キーでないVARCHARフィールドに対する接頭辞クエリ(例えば、
LIKE prefix%
)に役立ちます。
しかし、VARCHARフィールドにインデックスを付けてもスピードは上がりません:
- IDによる削除:VARCHARフィールドが主キーの場合。
- 関連性のない式:VARCHARフィールドが削除式の一部でない場合。
まだ質問がありますか?
できます:
- GitHubでMilvusをチェックしてください。気軽に質問したり、アイデアを共有したり、他の人を助けたりしてください。
- Slackチャンネルに参加して、オープンソースコミュニティに参加してください。