Robocikowo>ROBOCIKOWO
Wyszukiwanie

DiskANN

2019AktywnyOpublikowano: 20 maja 2026Aktualizacja: 20 maja 2026Opublikowany
DiskANN to algorytm przybliżonego wyszukiwania najbliższych sąsiadów (ANN) opracowany przez Microsoft Research, który pozwala indeksować i przeszukiwać miliardy wektorów osadzonych na jednym serwerze, trzymając większość indeksu (graf Vamana) na dysku SSD zamiast w RAM.
Kluczowa innowacja
Wydajne wyszukiwanie ANN miliardów wektorów na pojedynczym węźle z indeksem trzymanym głównie na SSD, dzięki grafowi Vamana zaprojektowanemu pod minimalną liczbę odczytów dyskowych.
Kategoria
Wyszukiwanie
Poziom abstrakcji
Building block
Poziom operacji
RetrievalDaneInferencja
Zastosowania
Wyszukiwanie semantyczne na miliardach embeddingówSkalowanie RAG poza limity RAM (single-node billion-scale)Wektorowe bazy danych (Azure Cosmos DB, Milvus)Rekomendacje treści / produktów w dużych katalogachDeduplikacja i wykrywanie niemal-duplikatów na ogromnych korpusachWyszukiwanie podobnych obrazów (image-to-image)ANN dla embeddingów multimodalnych (tekst + obraz + audio)

Jak działa

Indeksowanie: (1) budowana jest graf Vamana — każdy węzeł to wektor, krawędzie łączą go z R wybranymi sąsiadami; budowa jest iteracyjna, z parametrem alpha (>1.0) decydującym o tym, jak agresywnie dodawane są długie „skróty" między odległymi klastrami. (2) Pełne wektory i listy sąsiedztwa zapisywane są na SSD w układzie zoptymalizowanym pod 4 KB strony, tak by jedna strona zawierała zarówno wektor węzła, jak i jego sąsiadów. (3) W RAM trzyma się skompresowane (Product Quantization) wersje wszystkich wektorów oraz mały „cache" węzłów wokół punktów wejścia. Zapytanie: (a) startuje z medoida grafu, (b) na każdym kroku odczytuje ze SSD listę sąsiadów aktualnego węzła i ich pełne wektory, ale kandydatów do rozszerzenia frontu wybiera się za pomocą tanich obliczeń PQ z RAM, (c) frontier jest utrzymywany w priority queue rozmiaru L (search list size), (d) wyszukiwanie kończy się gdy żaden z R najbliższych kandydatów nie poprawia odległości. Wariant FreshDiskANN dodaje warstwę „delta" w RAM dla świeżych wstawień i okresowo scala ją z indeksem na SSD, umożliwiając aktualizacje bez przebudowy całości.

Rozwiązany problem

Dokładne k-NN w przestrzeniach o setkach lub tysiącach wymiarów jest niewykonalne na zbiorach rzędu miliardów rekordów, a klasyczne ANN-grafy (HNSW) wymagają, by cały indeks zmieścił się w RAM, co dla 10⁹ wektorów oznacza setki GB do TB pamięci na pojedynczym węźle. DiskANN rozwiązuje ten problem ekonomiczny: pozwala uzyskać porównywalne recall i latency, trzymając indeks na dużo tańszym SSD i tylko niewielką część w RAM, dzięki czemu jeden serwer obsłuży miliardy wektorów zamiast całego klastra.

Komponenty

Vamana graphIndeks sąsiedztwa

Skierowany graf sąsiedztwa o ustalonym maksymalnym stopniu R, budowany iteracyjnie z parametrem alpha sterującym długością skrótów między klastrami; przechowywany na SSD razem z wektorami.

PQ compressed vectors (in-memory)Tani estymator dystansu

Wszystkie wektory są kompresowane przez Product Quantization do kilkudziesięciu bajtów na wektor i trzymane w RAM, by szybko szacować odległości przy wyborze kandydatów do rozszerzenia frontu.

Oficjalna

SSD storage layoutTrwała pamięć grafu i pełnych wektorów

Strony 4 KB pakują wektor węzła i jego listę sąsiadów razem, tak że jedno żądanie I/O zwraca wszystko, czego potrzebuje krok wyszukiwania.

Beam search with priority queue (L)Algorytm zapytania

Wyszukiwanie utrzymuje priority queue rozmiaru L (search list size) — większe L = wyższy recall, kosztem latency i większej liczby odczytów SSD.

FreshDiskANN delta indexObsługa aktualizacji

Opcjonalna warstwa w RAM dla świeżych wstawień/usunięć, okresowo scalana z indeksem na SSD, umożliwia mutowalne kolekcje bez pełnej przebudowy.

Oficjalna

Implementacja

Pułapki implementacyjne
Użycie HDD zamiast NVMe SSDKrytyczna

DiskANN jest zaprojektowany pod losowe odczyty 4 KB z bardzo niskim opóźnieniem. Na HDD lub wolnym SATA SSD latency wzrasta o 1–2 rzędy wielkości i algorytm przestaje być konkurencyjny.

Rozwiązanie:Wymagać NVMe SSD klasy datacenter; mierzyć p99 IOPS przy 4 KB random read pod load.
Zbyt mała kolejka L → niski recallWysoka

L kontroluje rozmiar frontiera. Wartości <50 dramatycznie obniżają recall na trudnych zbiorach (>1M wektorów, wysoki D).

Rozwiązanie:Tunować L per dataset i target recall; trzymać profile dla różnych SLO (low-latency vs high-recall).
Mutacje bez FreshDiskANN → degradacja indeksuWysoka

Klasyczny DiskANN jest semi-statyczny. Częste wstawienia/usunięcia bez warstwy delta (FreshDiskANN) prowadzą do degradacji jakości grafu i konieczności pełnej przebudowy.

Rozwiązanie:Używać FreshDiskANN lub silnika (Milvus / Cosmos) który nim zarządza; planować okresowe rebuildy.
Niedoszacowanie RAM dla PQ codebooksŚrednia

Mimo że indeks jest „na dysku", PQ codebooks i wycinek frontiera muszą zmieścić się w RAM. Dla 1B wektorów × 64 B PQ to ~64 GB — nieoczywiste przy planowaniu sprzętu.

Rozwiązanie:Liczyć budżet RAM = N × b_PQ + cache; trzymać margines 1.5–2× nad teoretycznym minimum.
Brak warm-up cache → bardzo wysokie p99Średnia

Pierwsze zapytania po starcie odczytują wszystko z SSD — p99 może być 5–10× wyższe niż w stanie ustalonym, dopóki cache stron systemu plików się nie nagrzeje.

Rozwiązanie:Wprowadzić sztuczny warm-up (preload medoid + N hot queries) przed wpięciem instancji do load balancera.

Ewolucja

Oryginalny paper · 2019 · NeurIPS 2019 · Suhas Jayaram Subramanya
DiskANN: Fast Accurate Billion-point Nearest Neighbor Search on a Single Node
Suhas Jayaram Subramanya, Devvrit, Harsha Vardhan Simhadri, Ravishankar Krishnaswamy, Rohan Kadekodi
2019
Publikacja DiskANN (NeurIPS)
Punkt przełomowy

Microsoft Research prezentuje DiskANN i graf Vamana — pierwsze ANN dla miliarda wektorów na pojedynczym węźle z indeksem na SSD.

2021
FreshDiskANN — wsparcie dla aktualizacji

Rozszerzenie pozwala dodawać i usuwać wektory bez pełnej przebudowy indeksu, dzięki dwuwarstwowej architekturze RAM + SSD.

2022
DiskANN trafia do produkcyjnych baz wektorowych

Implementacje DiskANN pojawiają się w Milvus oraz w usługach Microsoft Azure (Cosmos DB, Bing).

2024
DiskANN w Azure Cosmos DB for MongoDB vCore

Microsoft ogłasza DiskANN jako domyślny silnik wektorowy dla Cosmos DB for MongoDB vCore — produkcyjne użycie na ogromnych zbiorach.

Hiperparametry (konfigurowalne osie)

Max graph degree (R)Krytyczna

Maksymalny stopień wyjściowy węzła w grafie Vamana. Większy R = wyższy recall, ale więcej miejsca na SSD i wolniejsza budowa.

32Mały indeks, niski koszt SSD.
64Domyślna wartość referencyjna.
128Wyższy recall, większy footprint.
Search list size (L)Krytyczna

Rozmiar priority queue podczas zapytania. Bezpośrednio kontroluje trade-off recall vs latency.

50Szybko, niższy recall.
100Typowy punkt pracy.
200+Wysoki recall, latency rośnie.
Vamana alphaWysoka

Parametr (>1.0) w pruningu krawędzi podczas budowy grafu — większe alpha = więcej długich „skrótów", krótsze ścieżki wyszukiwania.

1.0Brak skrótów, baseline.
1.2Typowa rekomendacja z papieru.
PQ footprint per vectorWysoka

Ile bajtów po Product Quantization przeznaczyć na jeden wektor w RAM. Kontroluje recall (większe = lepsze szacowanie odległości) vs zużycie RAM.

32 B
64 B
96 B

Złożoność obliczeniowa

Złożoność czasowa: O(log N) per query (empirical). Złożoność przestrzenna: RAM: O(N · b_PQ); SSD: O(N · (D · 4B + R · 4B)).

Wąskie gardło obliczeniowe

Random 4 KB reads from SSD

Każdy krok wyszukiwania to nowy losowy odczyt 4 KB ze SSD. Wydajność jest zdominowana przez IOPS dysku, nie przez CPU/RAM — stąd preferencja dla NVMe SSD.

Paradygmat wykonania

Tryb główny
sparse

Tylko niewielki podzbiór węzłów grafu jest odwiedzany w trakcie pojedynczego zapytania — paradygmat „sparse exploration".

Wzorzec aktywacji
subset_active

Równoległość

Poziom równoległości
fully_parallel

Każde zapytanie jest niezależne; throughput skaluje się liniowo z liczbą rdzeni CPU i liczbą równoczesnych operacji I/O obsługiwanych przez SSD.

Zakres
inferenceacross_devices

Wymagania sprzętowe

Podstawowe

Wyszukiwanie zdominowane przez kalkulacje dystansu PQ (small dot-products) i logikę grafu — idealne dla wektorowych instrukcji CPU (AVX2/AVX-512). GPU jest nieopłacalne ze względu na małe rozmiary batchów per zapytanie.

Dobry fit

Implementacje DiskANN działają na ARM (Graviton, Apple Silicon) i x86. Krytyczny jest NVMe SSD i przepustowość pamięci, nie konkretna ISA.

Ograniczony

Tensor Cores zaprojektowane pod gęste GEMM-y nie mają przewagi dla losowych odczytów i sparse traversal grafu. GPU może przyspieszyć fazę budowy indeksu, ale nie samo zapytanie.