On-Disk-Index
Dieser Artikel stellt DiskANN vor, einen On-Disk-Indexierungsalgorithmus für festplattenoptimierte Vektorsuchen. DiskANN basiert auf Vamana-Graphen und ermöglicht effiziente On-Disk-Vektorsuchen in großen Datensätzen.
Um die Abfrageleistung zu verbessern, können Sie für jedes Vektorfeld einen Index-Typ angeben.
Voraussetzungen
Um DiskANN in Milvus zu verwenden, müssen Sie beachten, dass
- Die Milvus-Instanz läuft auf Ubuntu 18.04.6 oder einer späteren Version.
- Der Milvus-Datenpfad sollte auf eine NVMe-SSD gemountet werden, um die volle Leistung zu erreichen:
- Für eine eigenständige Milvus-Instanz sollte der Datenpfad /var/lib/milvus/data in dem Container sein, in dem die Instanz läuft.
- Für eine Milvus-Cluster-Instanz sollte der Datenpfad /var/lib/milvus/data in den Containern sein, in denen die QueryNodes und IndexNodes laufen.
Begrenzungen
Um DiskANN zu verwenden, müssen Sie sicherstellen, dass Sie
- Verwenden Sie nur Float-Vektoren mit mindestens 1 Dimension in Ihren Daten.
- Verwenden Sie nur Euklidische Distanz (L2), Inneres Produkt (IP) oder COSINE, um den Abstand zwischen Vektoren zu messen.
Index- und Sucheinstellungen
Parameter für den Indexaufbau
Wenn Sie einen DiskANN-Index erstellen, verwenden Sie
DISKANNals Indextyp. Es sind keine Indexparameter erforderlich.Suchparameter
Parameter Beschreibung Bereich Standardwert search_listGröße der Kandidatenliste, eine größere Größe bietet eine höhere Auffindungsrate bei verminderter Leistung. [topk, int32_max] 16
DiskANN-bezogene Milvus-Konfigurationen
DiskANN ist abstimmbar. Sie können die DiskANN-bezogenen Parameter in ${MILVUS_ROOT_PATH}/configs/milvus.yaml ändern, um die Leistung zu verbessern.
...
DiskIndex:
MaxDegree: 56
SearchListSize: 100
PQCodeBudgetGBRatio: 0.125
SearchCacheBudgetGBRatio: 0.125
BeamWidthRatio: 4.0
...
| Parameter | Beschreibung | Wertebereich | Standardwert |
|---|---|---|---|
MaxDegree | Maximaler Grad des Vamana-Graphen. Ein größerer Wert bietet eine höhere Auffindungsrate, erhöht jedoch die Größe des Index und die Zeit für den Aufbau des Index. | [1, 512] | 56 |
SearchListSize | Größe der Kandidatenliste. Ein größerer Wert erhöht den Zeitaufwand für den Aufbau des Indexes, bietet aber eine höhere Wiederfindungsrate. Setzen Sie ihn auf einen Wert kleiner als MaxDegree, es sei denn, Sie müssen die Zeit für den Indexaufbau reduzieren. | [1, int32_max] | 100 |
PQCodeBudgetGBRatio | Größenbeschränkung für den PQ-Code. Ein größerer Wert bietet eine höhere Abrufrate, erhöht aber den Speicherverbrauch. | (0.0, 0.25] | 0.125 |
SearchCacheBudgetGBRatio | Verhältnis von zwischengespeicherten Knotennummern zu Rohdaten. Ein größerer Wert verbessert die Indexerstellungsleistung bei erhöhtem Speicherbedarf. | [0.0, 0.3) | 0.10 |
BeamWidthRatio | Verhältnis zwischen der maximalen Anzahl von IO-Anfragen pro Suchiteration und der CPU-Anzahl. | [1, max(128 / CPU-Anzahl, 16)] | 4.0 |
Fehlersuche
Wie kann man mit dem
io_setup() failed; returned -11, errno=11:Resource temporarily unavailableFehler umgehen?Der Linux-Kernel bietet die Funktion Asynchronous non-blocking I/O (AIO), die es einem Prozess ermöglicht, mehrere E/A-Operationen gleichzeitig zu initiieren, ohne auf die Fertigstellung einer dieser Operationen warten zu müssen. Dies trägt zur Leistungssteigerung von Anwendungen bei, bei denen sich Verarbeitung und E/A überschneiden können.
Die Leistung kann mithilfe der virtuellen Datei
/proc/sys/fs/aio-max-nrim proc-Dateisystem eingestellt werden. Der Parameteraio-max-nrbestimmt die maximale Anzahl der zulässigen gleichzeitigen Anfragen.Der Standardwert für
aio-max-nrist65535, Sie können ihn auf10485760erhöhen.