1次元を8bitで持てば再現率94.8%、容量は元の12.5%でした。
4bitまで縮めると容量は6.3%になりますが、再現率は42.7%まで落ちます。
索引は再現率を下げます。下げ幅は縮め方で決まり、途中から急に落ちます。
Milvusでは、索引を使うと再現率が下がります。公式はさらに、索引を使うと通常は再現率が下がる(影響はごくわずかだが、それでも意味を持つ)と述べています。
どれだけ下がるのか。持ち方を粗くして実際に測って比べました。
登録 20,000件(64次元)・上位10件・問い合わせ 200回
元の大きさ 1件あたり 512 バイト(64次元 × 8バイト)
1次元あたり 1件の大きさ 全体の大きさ 再現率 元に対する比
2bit 16B 0.3 MB 6.0% 3.1%
4bit 32B 0.6 MB 42.7% 6.3%
8bit 64B 1.2 MB 94.8% 12.5%
参考: 元のまま持つと全体で 9.8 MB
8bitなら再現率94.8%で、容量は元の12.5%です。8分の1に縮めて、ほとんど落ちていません。
4bitにすると容量は半分になりますが、再現率は42.7%です。半分にした代償が大きく出ました。
8bitから4bitで52.1ポイント、4bitから2bitで36.7ポイント落ちます。1段目の落ち幅がいちばん大きいという結果でした。
つまり縮める判断は、8bitで止めるかどうかがいちばん大きな分かれ目になります。
縮め方そのものの仕組みは直積量子化の記事で扱いました。
容量を半分にすると、再現率は半分どころではなく落ちる。
Moreover, using an index typically lowers the recall rate (though the effect is negligible, it still matters).原文Milvus 公式ドキュメント「Index Explained」 この内容の有効期限2027-02-18
組に分けて近い組だけを見ます。見る組の数を増やすと、再現率と時間が同時に伸びます。
Milvusの組に分ける索引は、記憶の効率と探索の速さを釣り合わせます。公式は組に分ける索引は、データを塊へ分けることで、記憶の効率と探索の性能を釣り合わせると述べています。
見る組の数でどう変わるのか。実際に探して数えました。
登録 20,000件(64次元)・上位10件・問い合わせ 200回 全探索 1回あたり 5403 マイクロ秒 組の数 見る組 再現率 走査件数 1回あたり 全探索比 64組 1組 34.1% 319件 107 μs 50.5倍 64組 4組 88.2% 1,261件 445 μs 12.1倍 64組 8組 100.0% 2,484件 915 μs 5.9倍 64組 16組 100.0% 4,897件 1768 μs 3.1倍
1組だけなら50.5倍の速さですが、再現率は34.1%です。3件に2件を取りこぼします。
8組まで見れば100.0%になり、それでも5.9倍の速さでした。
16組まで見ると走査は4,897件に増えますが、再現率は8組と同じ100.0%です。
つまり8組から先は、時間だけが2倍になって得るものがありません。止める位置を測って決めることになります。
この形はIVFの記事で扱っていて、組の数と見る数の組み合わせで決まります。
IVF indexes balance memory efficiency with search performance by partitioning data into clusters.原文Milvus 公式ドキュメント「Index Explained」 この内容の有効期限2027-02-18
前もって作る時間がかかります。問い合わせの回数が少ないと、その時間を取り戻せません。
Milvusの索引には、作るための費用があります。公式は索引は探索を速くするが、前処理の時間、場所、そして探索中の記憶を余分に必要とすると述べています。
その時間はどれくらいで取り戻せるのか。実際に作って測りました。
64次元・上位10件・問い合わせ 200回。件数を変えて比べる
近似のほうは 1点あたりの枝 8本・探索の幅 64 で組み立てる
件数 全探索1回 索引を作る 近似1回 近似の再現率 追い抜くまでの問い合わせ
200件 30 μs 6 ms 31 μs 11.5% 追い抜かない
1,000件 168 μs 164 ms 94 μs 9.3% 2,201回
5,000件 987 μs 4823 ms 171 μs 7.2% 5,916回
20,000件 5364 μs 106193 ms 257 μs 9.3% 20,795回
2万件では、索引を作るのに106秒かかりました。取り戻すには20,795回の問い合わせが要ります。
200件では、そもそも近似のほうが遅くなりました。追い抜きません。
この時間は、データを入れ替えるたびに払います。頻繁に入れ替える用途では、回数が積み上がります。
だから見るのは登録件数だけではありません。問い合わせの回数と、作り直しの頻度の両方です。
3つの計測はいずれも手元で書いた模型で、実際のMilvusを動かしたものではありません。近似探索の実装は単純な近傍グラフで、実際の製品より再現率が低く出ています。索引を作る時間も総当たりで枝を選んでいるため、実際よりずっと遅い値です。縮め方も1次元ずつ区切る簡単な方式で、実装によって再現率は変わります。ここで見せているのは、縮めたときの再現率の落ち方が直線ではないという点と、見る組を増やしても効かなくなる位置があるという点の2つです。
An index speeds up the search, but incurs additional preprocessing time, space, and RAM during the search.原文Milvus 公式ドキュメント「Index Explained」 この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る