すべてのプロダクト
Search
ドキュメントセンター

Vector Retrieval Service for Milvus:ストレージ最適化ディスクインデックス (DiskANN)

最終更新日:Aug 01, 2026

ベクトルデータセットが利用可能なメモリを超える場合、HNSW や IVF_FLAT などのインメモリインデックスはメモリ容量に制約され、パフォーマンスとコストの要件を同時に満たすことが困難になります。DiskANN はインデックスデータをディスクにオフロードし、データ量が利用可能なメモリ容量を超える場合でも、高い検索精度とクエリパフォーマンスを提供します。DiskANN は、数十億以上のベクトルを扱う検索シナリオに適しています。

制限事項

項目説明
インデックスの有効化コンピュートノードの [Compute Node][CU Type] が [Storage-optimized] であるクラスターでは、DiskANN がデフォルトで有効になります。その他のインスタンスでは、インデックス作成時にインデックスタイプとして DISKANN を明示的に指定できます。
デプロイメントモードのバージョン要件ディスクモードには Alibaba Cloud Milvus クラスターのバージョン 2.6.18 以降が必要です。バージョン 2.6.3 はパフォーマンスモードのみをサポートします。

仕組み

DiskANN は、Vamana グラフと RaBitQ 量子化という 2 つの技術を組み合わせ、ディスク上で効率的なベクトル検索を実現します。

Vamana グラフ

Vamana グラフは、DiskANN のディスクベース戦略における中核構造です。HNSW の多層構造とは異なり、Vamana は単層の疎グラフを使用し、2 回のプルーニングによって構築されます。このアプローチにより、グラフの接続性を維持しつつ、より長距離のエッジを導入し、検索の収束に必要なホップ数を削減します。

構築プロセスは次のとおりです。

  • 初期のランダム接続:各ベクトルはグラフ内のノードとして機能します。ノードは最初にランダムに接続されて密なネットワークを形成します。接続性を確保するために、通常はノードあたり約 500 本のエッジを持ちます。

  • 2回のプルーニングによる最適化:冗長なエッジを削除し、ノード間距離に基づいて低品質な接続をプルーニングし、高品質なエッジを優先します。ノードあたりの最大エッジ数は MaxDegree で制御されます。長距離エッジを導入してベクトル空間内の離れたデータポイントを接続し、グラフの走査を高速化するナビゲーションショートカットを作成します。グラフ構築時の近傍探索の幅は SearchListSize によって決まります。

オープンソースの DiskANN 実装では、各ノードの近傍リストとそのフル精度ベクトルが同じディスクセクターに格納されます。検索時には 1 回のディスク読み取りで近傍関係と元のベクトルの両方を取得できるため、暗黙的なリランキングが可能になりますが、検索プロセス全体では大量のシーケンシャルなディスク I/O が発生します。Alibaba Cloud Milvus は Vamana グラフインデックスをメモリ内で再編成し、検索プロセス中のディスク I/O を排除し、最終的なリランキングフェーズでのみディスクから元のベクトルを読み取ります。

RaBitQ 量子化

RaBitQ (Random Bit Quantization) はベクトルを正規化し、ハイパーキューブの頂点にマッピングします。必要なビット数は次元あたり 1 ビットのみです。これによりストレージオーバーヘッドを圧縮し、ベクトル間の近似距離計算を高速化します。

高次元空間では、ランダムなベクトル間の角度は強く集中します。ハイパーキューブの頂点にマッピングする際の量子化誤差は O(1/√d) の割合で収束します。つまり、次元が高いほど量子化誤差は小さくなります。768 次元空間では、1 ビット量子化による誤差はすでに非常に小さくなります。Alibaba Cloud Milvus は標準の 1 ビット RaBitQ を 4 ビット拡張モードに拡張し、次元あたり 4 ビットを使用して残差情報を符号化することで、圧縮率と精度のバランスを取ります。

DiskANN インデックスの有効化

手順1:メモリとインスタンスタイプの計画

次の式を使用して、必要な理論上の最小メモリを計算します。実際のメモリ使用量は理論値よりわずかに大きくなります。理論値の 1.5 倍を目安にリソースを確保してください。

パフォーマンスモード:

Memory = Number of vectors × (Dimension / 2 + 228) bytes

ディスクモード:

Memory = Number of vectors × (Dimension / 2) bytes

例として、1億件の 768 次元ベクトルを想定します。

デプロイメントモード理論メモリ推奨メモリ (x 1.5)推奨インスタンスタイプ
パフォーマンスモード1億 x (384 + 228) bytes ≈ 61.2 GB約 92 GB16C64G のコンピュートノード 2 台
ディスクモード1億 x 384 bytes ≈ 38.4 GB約 58 GB16C64G のコンピュートノード 1 台

手順2:ストレージ最適化クラスターの作成

Alibaba Cloud Milvus インスタンスを作成する際に、[Compute Node] の [CU Type] を [Storage-optimized] に設定します。クラスターの作成後、追加の設定は不要です。DiskANN RaBitQ インデックスタイプがデフォルトで使用されます。インデックスタイプを AUTOINDEX に設定してコレクションを作成すると、システムは基盤インデックスとして DiskANN を自動的に選択します。

インスタンスの作成手順の詳細については、「クイックスタート:Milvus インスタンスの作成」をご参照ください。

AUTOINDEX を使用する場合、describe_index はインデックスタイプとして AUTOINDEX を返し、自動的に選択された基盤インデックスは表示しません。実際に有効になっているインデックスタイプを確認するには、セグメントレベルの情報を照会します。index_name が DISKANN の場合、DiskANN が選択されていることを示します。

from pymilvus import connections, utility

connections.connect(uri="http://<endpoint>:19530", token="<user>:<password>")
for seg in utility.get_query_segment_info("<collection_name>"):
    print(seg.segmentID, seg.num_rows, seg.index_name)

手順3:デプロイメントモードの切り替え (オプション)

同じ DiskANN RaBitQ インデックスは、2 つのデプロイメントモードをサポートします。ビジネス要件に基づいて、ロードおよび検索の方法を選択してください。

デプロイメントモードロードの動作シナリオ
パフォーマンスモード (デフォルト)Vamana グラフと RaBitQ 量子化エンコーディングの両方をメモリにロードします高い QPS と低いレイテンシーが必要なオンライン検索シナリオ
ディスクモードVamana グラフはディスクに格納し、RaBitQ エンコーディングのみをメモリにロードしますQPS の低下とレイテンシーの増加を許容できるコスト重視のシナリオ

コスト削減の要件が特にない場合は、デフォルトのパフォーマンスモードを維持してください。メモリコストが主要な制約であり、クエリパフォーマンスの低下を許容できる場合にのみ、ディスクモードに切り替えてください。ディスクモードにはクラスターのバージョン 2.6.18 以降が必要です。

パフォーマンスモードがデフォルトで使用されます。デプロイメントモードの切り替えでは、インデックスの再構築は不要です。モードの切り替えは、ロードフェーズでコレクションの解放、コレクションプロパティの変更、再読み込みを行うことで完了します。

切り替え中は、コレクションが解放されて再読み込みされます。この期間、コレクションのクエリ機能は一時的に利用できません。オフピーク時間帯にこの操作を実行してください。

次の Python スクリプトを使用して切り替えを実行します。

from pymilvus import MilvusClient

CLUSTER_ENDPOINT = "http://xxx-internal.milvus.aliyuncs.com:19530"
TOKEN = "<user>:<password>"
COLLECTION_NAME = "<collection_name>"

def set_diskann_mode(mode: str):
    client = MilvusClient(uri=CLUSTER_ENDPOINT, token=TOKEN, timeout=7200)
    # 1. コレクションを解放します
    client.release_collection(COLLECTION_NAME)
    # 2. デプロイメントモードを変更します
    client.alter_collection_properties(
        COLLECTION_NAME,
        properties={"diskann.rabitq_mode": mode},
    )
    # 3. コレクションを再ロードします
    client.load_collection(COLLECTION_NAME, timeout=7200)
    client.close()

if __name__ == '__main__':
    set_diskann_mode("disk")   # ディスクモードに切り替えます
    # set_diskann_mode("perf")  # パフォーマンスモードに戻します

パラメーターの説明:

パラメーター説明
CLUSTER_ENDPOINTMilvus インスタンスのアクセスエンドポイントです。プライベートアドレスとパブリックアドレスのいずれも使用できます。いずれの場合もポート番号 19530 を含める必要があります。
TOKENアクセス認証情報です。形式は <user>:<password> です。
COLLECTION_NAME対象コレクションの名前です。
modeデプロイメントモードの値です。disk (ディスクモード) または perf (パフォーマンスモード)。

切り替え完了後、describe_collection が返す properties 内の diskann.rabitq_mode フィールドを確認することで、現在のモードを検証できます。

パラメーター設定

DiskANN パラメーターを調整することで、特定のデータセットおよび検索ワークロードに対して、速度、精度、メモリオーバーヘッドのバランスを取ることができます。

現在のエンジンは、以下で説明する推奨値の範囲を超えるパラメーターを拒否しません。範囲外の値、または推奨される関係を満たさない値を入力してもエラーは返されませんが、再現率やクエリパフォーマンスに異常が生じる可能性があります。適用する前に、値が妥当であるかを確認してください。

インデックス構築パラメーター

次のパラメーターは、インデックスの構築方法に影響します。これらを調整すると、インデックスサイズ、構築時間、検索品質に影響します。

パラメーター説明値調整の推奨事項
MaxDegreeVamana グラフにおけるデータポイントあたりの接続 (エッジ) の最大数を制御します。整数。推奨範囲:[1, 512]。デフォルト:56値を大きくするとグラフがより密になり再現率が向上しますが、メモリ使用量と構築時間も増加します。ほとんどのシナリオでは、[10, 100] の範囲の値が推奨されます。
SearchListSizeインデックス構築中に各ノードの近傍を探索するための候補プールサイズです。グラフに追加される各ノードについて、最良候補 SearchListSize 件のリストを維持します。リストが改善しなくなると探索を停止し、上位 MaxDegree 個のノードを最終的なエッジとして選択します。整数。MaxDegree 以上である必要があります。デフォルト:100値を大きくすると、各ノードに対して真の最近傍を見つける可能性が高まり、グラフ品質と再現率が向上しますが、インデックス構築時間が大幅に増加します。MaxDegree 未満に設定するとグラフ品質が低下します。

検索パラメーター

次のパラメーターは検索動作に影響します。これらを調整すると、検索速度、レイテンシー、リソース消費に影響します。

パラメーター説明値調整の推奨事項
search_list検索中にグラフを走査する際に維持される候補プールサイズです。整数。デフォルト:100値を大きくすると真の最近傍を見つける可能性が高まり (再現率が向上)、検索レイテンシーも増加します。この値は、取得する結果数 (top_k) と同じか、わずかに大きい値に設定することを推奨します。
use_refine検索中のリランキングに元のベクトルを使用するかどうかを指定します。true に設定すると、元のベクトルを使用してリランキングし、正確な距離を取得します。false に設定すると、量子化距離のみを使用し、返される Distance 値は近似値になります。ブール値。デフォルト:true高い QPS が必要なシナリオでは、リランキングを無効にすると、再現率が一定程度低下する代わりに QPS を大幅に向上できます。特に top_k が大きいシナリオで改善効果が顕著です。
early_termination_threshold検索の早期終了しきい値です。N ステップ連続で改善が見られない場合に検索を停止します。整数。推奨範囲:(0, 200]。デフォルト:30値を大きくすると探索がより徹底され、再現率が向上します。値を小さくすると早期終了が発動しやすくなり、QPS は向上しますが再現率は低下します。

上記の検索パラメーターは、データ量が十分に大きい場合にのみ有効になります。データ量が少ないコレクションでは、ANN インデックスを経由せずに厳密検索を直接実行します。この場合、search_list、use_refine、early_termination_threshold を調整しても、再現率や返される Distance 値に目に見える影響はありません。パラメーター調整は、本番環境に近い規模のデータセットで検証してください。

コレクション内のセグメント数が多すぎると、クエリパフォーマンスに顕著な影響があります。管理コンソールまたはクライアント API を使用して定期的にコンパクションをトリガーし、セグメント数を削減してください。