🚀 Zilliz Cloudを無料で試す、完全管理型のMilvus—10倍の高速パフォーマンスを体験しよう!今すぐ試す>>

milvus-logo
LFAI

1.index_file_size

  • Engineering
February 26, 2020
milvus

Milvus設定のベストプラクティスでは、Milvus 0.6.0設定のベストプラクティスを紹介しました。今回は、Milvusクライアントにおいて、テーブルの作成、インデックスの作成、検索などの操作を行う際の主要なパラメータを設定する際のベストプラクティスについても紹介します。これらのパラメータは検索性能に影響を与えます。

1.index_file_size

テーブルを作成する際、index_file_sizeパラメータを使用して、データ格納用の単一ファイルのサイズをMB単位で指定します。デフォルトは1024です。ベクターデータをインポートする際、Milvusはデータをインクリメンタルにファイルに結合します。ファイルサイズがindex_file_sizeに達すると、このファイルは新しいデータを受け付けず、Milvusは新しいデータを別のファイルに保存します。これらはすべて生データファイルである。インデックスが作成されると、Milvusは各rawデータファイルに対してインデックスファイルを生成します。IVFLATインデックスタイプの場合、インデックスファイルのサイズは対応する生データファイルのサイズにほぼ等しくなります。SQ8インデックスの場合、インデックスファイルのサイズは対応する生データファイルの約30%である。

検索中、Milvusは各インデックスファイルを1つずつ検索します。我々の経験では、index_file_sizeを1024から2048に変更すると、検索性能は30%から50%向上する。しかし、この値が大きすぎると、大きなファイルをGPUメモリ(あるいはCPUメモリ)にロードできないことがあります。たとえば、GPU メモリが 2 GB で index_file_size が 3 GB の場合、インデックス・ファイルは GPU メモリにロードできません。通常、index_file_size を 1024 MB または 2048 MB に設定します。

次の表は、index_file_size に sift50m を使用したテストです。インデックス・タイプはSQ8です。

1-sift50m-test-results-milvus.png 1-sift50m-テスト結果-milvus.png

CPUモードでもGPUモードでも、index_file_sizeが1024 MBの代わりに2048 MBになると、検索パフォーマンスが大幅に向上することがわかる。

2.nlist nprobe

nlist パラメーターはインデックス作成に使用され、nprobe パラメーターは検索に使用されます。IVFLATとSQ8はどちらもクラスタリング・アルゴリズムを使って大量のベクトルをクラスタ(バケット)に分割します。nlist はクラスタリング中のバケットの数です。

インデックスを使って検索する場合、最初のステップはターゲット・ベクトルに最も近いバケットを一定数見つけることであり、2番目のステップはバケットからベクトル距離によって最も類似したk個のベクトルを見つけることである。nprobe はステップ1におけるバケット数である。

一般的に、nlist を増やすとバケット数が増え、クラスタリング中のバケット内のベクトル数が少なくなる。その結果、計算負荷が減少し、検索性能が向上する。しかし、類似度比較のためのベクトルが少なくなると、正しい結果が見落とされる可能性があります。

nprobe を増やすと、検索するバケットが増える。その結果、計算負荷は増加し、検索性能は悪化するが、検索精度は向上する。分布の異なるデータセットごとに状況は異なるかもしれない。nlistnprobe を設定する際には,データセットのサイズも考慮する必要がある.一般に,nlist4 * sqrt(n) とすることが推奨される.ここで n はベクトルの総数である.nprobe については、精度と効率のトレードオフを行う必要があり、試行錯誤を繰り返して値を決定するのが最良の方法である。

次の表は、nlistnprobe に対して sift50m を使用したテストです。インデックス・タイプはSQ8である。

sq8-index-test-sift50m.png sq8-index-test-sift50m.png

この表は、nlist/nprobe の異なる値を使用して、検索性能と精度を比較したものです。 CPU と GPU のテストが同様の結果を示したため、GPU の結果のみが表示されています。このテストでは、nlist/nprobe の値が同じ割合で増加すると、検索精度も増加します。nlist = 4096、nprobe が 128 のとき、Milvus は最高の検索性能を発揮します。結論として、nlistnprobe の値を決定する際には、異なるデータセットと要件を考慮して、性能と精度のトレードオフを行う必要がある。

まとめ

index_file_size:データサイズがindex_file_size より大きい場合、index_file_size の値が大きいほど、検索性能は向上する。nlistnprobe:性能と精度のトレードオフを行う必要がある。

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

続けて読む