On-Disk-Index
In diesem Artikel wird ein Algorithmus zur Indexierung auf der Festplatte namens DiskANN vorgestellt. DiskANN basiert auf Vamana-Graphen und ermöglicht eine effiziente Suche in großen Datenbeständen.
Um die Abfrageleistung zu verbessern, können Sie für jedes Vektorfeld einen Indextyp angeben.
Voraussetzungen
Um DiskANN zu verwenden, beachten Sie, dass
- DiskANN standardmäßig deaktiviert ist. Wenn Sie einen In-Memory-Index einem On-Disk-Index vorziehen, sollten Sie diese Funktion deaktivieren, um eine bessere Leistung zu erzielen.
- Um sie zu deaktivieren, können Sie in Ihrer milvus-Konfigurationsdatei
queryNode.enableDiskinfalseändern. - Um sie wieder zu aktivieren, können Sie
queryNode.enableDiskauftruesetzen.
- Um sie zu deaktivieren, können Sie in Ihrer milvus-Konfigurationsdatei
- 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:
- Bei einer Milvus-Einzelinstanz 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 ausgeführt werden.
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
PQCodeBugetGBRatio: 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 aber 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 |
PQCodeBugetGBRatio | 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.