しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Cosmos DB for NoSQL の DiskANN Preview が使えるようになったので試した

以前に書いた Cosmos DB の Vector Search サポート検証の続きで、先日 Public Preview となった DiskANN を使った Vector Index を作成してみました。

DiskANN は Microsoft Research が開発した、低レイテンシかつコスト効率よく Vector Search を実行するためのアルゴリズムです。Cosmos DB には数種類の Vector Index のオプションが用意されていますが、DiskANN は用意された中で大規模なデータセット向けに最適化されています。

以下のドキュメントでも言及されていますが、Cosmos DB で他に用意されている Vector Index の種類 quantizedFlat はコンテナー内の Vector 数が 10 万以下の場合に推奨されているため、それ以上の場合は DiskANN を使うのが最適ということになります。

以前は DiskANN を使うのに申請が必要でしたが、現在は Public Preview に移行しているため Cosmos DB のコンテナー作成画面で Index Type として DiskANN が選択可能になっています。

今回は検証として、前回 Vector Search の検証に利用したのと同じデータ構造とデータセットを使って、DiskANN を利用した際の挙動を確認してみました。前回検証した内容は以下のエントリにまとまっています。

検証用の作成したコンテナーの Indexing Policy は以下のような構造です。シンプルに quantizedFlat を指定していた部分を diskANN に変更しただけです。Vector を格納するプロパティに対して excludedPaths で除外設定するのは忘れないようにしましょう。

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/contentVector/*"
        },
        {
            "path": "/\"_etag\"/?"
        }
    ],
    "vectorIndexes": [
        {
            "path": "/contentVector",
            "type": "diskANN"
        }
    ]
}

作成した Indexing Policy が以下のようになっていることを確認します。Vector Indexes は後から修正することができないので、間違うとコンテナーから作り直しになるため手間がかかります。

Vector Indexes 以外は quantizedFlatdiskANN で全く違いはありませんので、前回利用したコードを使ってこのブログのエントリを Vector 化して、全件 Cosmos DB に投入してデータを用意しました。

実際に前回と同じクエリで Vector Search を実行したところ、DiskANN では消費 RU が 21.69 RU となりました。前回は 10.3 RU でしたので DiskANN の方が 2 倍も RU を消費しています。

今回は使用したデータセットが 1500 程だったため、DiskANN が有利となる Vector 数以下となり、通常の Quantized Flat の方が性能が良かったようです。大規模なデータセットを利用して 10 万 Vector 以上に対して検索を行う場合には DiskANN が有利となると考えられます。

正直なところ 10 万 Vector 以上のデータセットを探すのが難しいので今回の検証はここまでにしますが、以下のブログを参考に環境を構築するとかなり大規模なデータセットに対して DiskANN を使って Vector Search を行うデモが体験出来るようです。

ただし必要とする RU が非常に大きいので、油断すると超高額請求につながる可能性があるため注意が必要です。個人的にはシンプルに 10 万以上になる可能性がある場合には、無条件で DiskANN を選択するというポリシーで問題ないと考えています。