メインコンテンツまでスキップ
に最終更新

ANN のリソース見積もりガイド

ベクトル検索(ANN)のワークロードでは、通常、ディスク容量より先にメモリと CPU が制約になります。この記事では、本番運用を始める前に Apache Doris のベクトル検索クラスタの構成を計画できるよう、実用的なリソース見積もり方法を説明します。

クイックナビゲーション​

見積もりの概要​

見積もりは、通常、次の順序で行います。

  1. インデックスのメモリを見積もる: データ規模、インデックスタイプ、量子化モードから、メモリに常駐するインデックスのサイズを求めます。
  2. CPU コア数を見積もる: 目標 QPS とレイテンシーを踏まえ、メモリ容量との比率から CPU コア数を決めます。
  3. 安全マージンを確保する: クエリ実行、ベクトル以外の列へのアクセス、コンパクションに必要な余裕を残します。

ANN のリソース特性​

通常の OLAP インデックスと比べ、ANN には次のようなリソース使用上の特徴があります。

リソース項目特性
構築時の CPU使用率が高く、データ取り込み時に CPU への負荷が大きくなります。
構築時のメモリセグメントが大きすぎると、メモリ不足によって単一インデックスの構築に失敗する場合があります。
クエリ実行時のメモリ高性能なクエリ処理には、通常、インデックスをできるだけメモリに常駐させる必要があります。
クエリ実行時の CPU高 QPS のシナリオでは、十分な数の CPU コアが必要です。

Doris は、メモリ使用量を減らすために sq8、sq4、pq の三つの量子化モードをサポートします。量子化には通常、次のトレードオフがあります。

  • データ取り込みが遅くなる: エンコード処理の負荷が増えます。
  • クエリが遅くなる可能性がある: デコードや再構築の処理負荷が増えます。
  • 再現率が低下する可能性がある: 非可逆エンコードによって誤差が生じます。

見積もりに必要な入力項目​

見積もりを始める前に、次の情報を用意してください。

入力項目説明
ベクトルの次元数 D単一のベクトルの float 型の次元数。例: 768。
総行数 Nインデックスを作成するベクトルの総数。
インデックスタイプhnsw / ivf / ivf_on_disk
量子化モードflat / sq8 / sq4 / pq
max_degreeHNSW のみ。グラフの隣接ノード数を制御します。デフォルトは 32。
目標 QPS とレイテンシーCPU コア数の見積もりに使用します。

HNSW のメモリ見積もり​

デフォルトパラメータでの経験式​

デフォルトの max_degree=32 では、次の式を使用します。

HNSW_FLAT_Bytes ~= 1.3 * D * 4 * N

ここで、各項目の意味は次のとおりです。

  • D * 4 * N は、float32 ベクトルの元のメモリ使用量です。
  • 1.3 は、HNSW のグラフ構造による追加のオーバーヘッド(約 0.3 倍)を表します。

max_degree を調整する場合​

max_degree が大きいほど、グラフ構造のオーバーヘッドも増えます。次のように比例させて計算します。

HNSW_factor   ~= 1 + 0.3 * (max_degree / 32)
HNSW_FLAT_Bytes ~= HNSW_factor * D * 4 * N

量子化によるメモリ削減量の概算​

量子化モードメモリ比率(FLAT 比)
sq8約 1/4
sq4約 1/8
pq通常は sq4 に近い(例: pq_m=D/2, pq_nbits=8)

ivf_on_disk に関する注意事項​

ivf_on_disk は、IVF の学習およびクエリパラメータのモデル(nlist / ivf_nprobe)を再利用しますが、転置リスト本体をディスクに保存し、キャッシュを介してクエリを処理します。容量計画では、まず以下の IVF の見積もりを「すべてがメモリに常駐する場合」の上限として扱い、次にメモリに常駐させたいホットデータのサイズに基づいて ann_index_ivf_list_cache_limit を別途計画できます。

クイックリファレンス(D=768、max_degree=32)​

行数FLATSQ8SQ4PQ (m=384, nbits=8)
1M4 GB1 GB0.5 GB0.5 GB
10M40 GB10 GB5 GB5 GB
100M400 GB100 GB50 GB50 GB
1B4000 GB1000 GB500 GB500 GB
10B40000 GB10000 GB5000 GB5000 GB

IVF のメモリ見積もり​

IVF は HNSW より構造上のオーバーヘッドが小さく、次の式で概算できます。

IVF_FLAT_Bytes ~= D * 4 * N

量子化した IVF のメモリ削減比率は、HNSW と同じです。

量子化モードメモリ比率(FLAT 比)
sq8約 1/4
sq4約 1/8
pq通常は sq4 に近い

クイックリファレンス(D=768)​

行数FLATSQ8SQ4PQ (m=384, nbits=8)
1M3 GB0.75 GB0.35 GB0.35 GB
10M30 GB7.5 GB3.5 GB3.5 GB
100M300 GB75 GB35 GB35 GB
1B3000 GB750 GB350 GB350 GB
10B30000 GB7500 GB3500 GB3500 GB

CPU コア数の見積もり​

高 QPS のシナリオでは、次の経験的な比率を出発点にできます。

16 cores : 64 GB   (about 1 core : 4 GB)

注: 量子化を有効にしても、CPU の必要量がインデックスのメモリ使用量と同じ比率で減るとは限りません。実際には、次の手順で見積もります。

  1. まず、FLAT 相当のワークロードに基づいて CPU を見積もります。
  2. 次に、実際の負荷テストの結果を基に、適切な水準まで段階的に減らします。

本番環境の安全マージン(メモリ使用率 100% を前提に設計しない)​

上記の式で見積もれるのは ANN インデックス自体のメモリだけで、SQL 実行全体のオーバーヘッドは含まれません。たとえば、次のクエリを考えます。

SELECT id, text, l2_distance_approximate(embedding, [...]) AS dist
FROM tbl
ORDER BY dist
LIMIT N;

TopN 遅延実体化を使用しても、実行レイヤーではベクトル以外の列やオペレーターの状態を処理するために追加のメモリが必要です。本番環境では、次のように計画することを推奨します。

  • ANN インデックスのメモリ使用量を、マシンの総メモリの約 70% 以内に抑えます。
  • 残りのメモリを、クエリ実行、コンパクション、その他のデータアクセスに充てます。

シナリオ別の推奨構成​

シナリオ推奨構成説明
十分なメモリ予算があり、性能を優先する場合HNSW + FLAT再現率とレイテンシーが最も優れています。
メモリに制約がある場合HNSW/IVF + PQ通常、SQ8/SQ4 よりバランスが取れています。
PQ パラメータの初期値pq_m = D / 2後で再現率とレイテンシーの負荷テスト結果に基づいて調整します。
クエリ性能の要件が低い場合まず CPU を少なく構成する「データ取り込み時は CPU を多く割り当て、安定した後に縮小する」方法もあります。

よくある質問​

Q1: 量子化を有効にすると、メモリ使用量はどの程度減りますか?

A: sq8 では FLAT の約 1/4、sq4 と pq(例: pq_m=D/2, pq_nbits=8)では約 1/8 になります。正確な値は HNSW のグラフ構造のオーバーヘッドにも左右されます。

Q2: 量子化によるメモリ削減と同じ比率で CPU も減らせますか?

A: 推奨しません。量子化で主に減るのはメモリ使用量で、CPU の必要量は比例して減りません。まず FLAT 相当のワークロードに基づいて CPU を見積もり、負荷テストの結果に応じて減らすことを推奨します。

Q3: max_degree を増やすとメモリ使用量はどう変わりますか?

A: HNSW のグラフ構造のオーバーヘッドは、1 + 0.3 * (max_degree / 32) に応じて増えます。たとえば、max_degree=64 の場合、係数は約 1.6 です。

Q4: ivf_on_disk 用にどの程度のメモリを計画すべきですか?

A: 上限は「IVF のすべてがメモリに常駐する場合」です。実際に常駐するサイズは ann_index_ivf_list_cache_limit によって決まり、ホットデータのサイズに基づいて別途評価できます。

Q5: メモリを 100% 使用する前提で設計してはいけないのはなぜですか?

A: ANN インデックスに加え、SQL 実行レイヤー(ベクトル以外の列やオペレーターの状態)、コンパクション、その他のデータアクセスもメモリを消費します。約 30% の余裕を確保し、インデックスのメモリ使用量を総メモリの 70% 以内に抑えることを推奨します。