🚀 Prueba Zilliz Cloud, el Milvus completamente gestionado, gratis—¡experimenta un rendimiento 10 veces más rápido! Prueba Ahora>>

milvus-logo
LFAI
  • Home
  • Blog
  • DiskANN, una solución ANNS basada en disco con alta recuperación y alto QPS en un conjunto de datos a escala de miles de millones.

DiskANN, una solución ANNS basada en disco con alta recuperación y alto QPS en un conjunto de datos a escala de miles de millones.

  • Engineering
September 24, 2021
Zilliz

Chengming Li, Ingeniero de I+D de Zilliz, se licenció en Informática por la SouthEast University. Su interés actual se centra en los problemas de ANNS en datos de alta dimensión, incluyendo soluciones basadas en grafos y cuantificación.

"DiskANN: Fast Accurate Billion-point Nearest Neighbor Search on a Single Node" es un artículo publicado en NeurIPS en 2019. El documento presenta un método de vanguardia para realizar la construcción de índices y la búsqueda en el conjunto de datos a escala de mil millones utilizando una sola máquina con solo 64 GB de RAM y un SSD lo suficientemente grande. Además, satisface los tres requisitos de ANNS (Approximate Nearest Neighbor Search) en el conjunto de datos a gran escala: alta recuperación, baja latencia y alta densidad (número de nodos en una sola máquina). Este método construye un índice basado en grafos en un conjunto de datos a gran escala de miles de millones de SIFT-1B utilizando una sola máquina con 64 GB de RAM y una CPU de 16 núcleos, alcanzando 5000 QPS (consultas por segundo) con más del 95 % de recall@1, y una latencia media inferior a 3 ms.

Autores

Suhas Jayaram Subramanya: Antiguo empleado del Instituto de Investigación de Microsoft India, estudiante de doctorado de la CMU. Sus principales intereses de investigación son la informática de alto rendimiento y los algoritmos de aprendizaje automático para datos a gran escala.

Devvrit: Asistente de investigación de posgrado en la Universidad de Texas en Austin. Sus intereses de investigación son la informática teórica, el aprendizaje automático y el aprendizaje profundo.

Rohan Kadekodi: Estudiante de doctorado en la Universidad de Texas. Su dirección de investigación es el sistema y el almacenamiento, incluyendo principalmente el almacenamiento persistente, el sistema de archivos y el almacenamiento kV.

Ravishankar Krishaswamy: Investigador principal del instituto de investigación indio de Microsoft. Doctor por la CMU. La dirección de investigación es el algoritmo de aproximación basado en grafos y clustering.

Harsha Vardhan Simhadri: Investigador principal del instituto de investigación indio de Microsoft. Doctor por la CMU. En el pasado estudió algoritmos paralelos y sistemas en tiempo de ejecución. Ahora su principal trabajo es desarrollar nuevos algoritmos y escribir modelos de programación.

Motivaciones

La mayoría de los principales algoritmos de ANNS hacen concesiones entre el rendimiento de la creación de índices, el rendimiento de la búsqueda y la recuperación. Los algoritmos basados en grafos, como HNSW y NSG, son actualmente los métodos más avanzados en términos de rendimiento de búsqueda y recuperación. Dado que el método de indexación basado en grafos residentes en memoria ocupa demasiada memoria, es relativamente difícil indexar y buscar en un conjunto de datos a gran escala utilizando una sola máquina con recursos de memoria limitados.

Muchas aplicaciones requieren respuestas rápidas de los RNA basados en la distancia euclidiana en el conjunto de datos a escala de miles de millones. A continuación se presentan dos soluciones principales:

  1. Índice invertido + cuantización: agrupar el conjunto de datos en M particiones y comprimir el conjunto de datos utilizando esquemas de cuantización como PQ (Product Quantization). Esta solución produce una baja recuperación debido a la pérdida de precisión causada por la compresión de los datos. Aumentar el topk ayuda a mejorar la recuperación, mientras que el QPS disminuiría en consecuencia.
  2. Dividir e indexar: dividir el conjunto de datos en varios fragmentos independientes y crear un índice en memoria para cada fragmento. Cuando lleguen las solicitudes de consulta, la búsqueda se realizará en los índices de cada fragmento y los resultados se devolverán tras la fusión. Esta solución provoca la sobreexpansión de la escala del conjunto de datos, por lo que se necesitan más máquinas debido a la restricción de recursos de memoria en una sola máquina, lo que conduce a un QPS bajo.

Ambas soluciones mencionadas anteriormente están limitadas por la restricción de memoria de una sola máquina. Este artículo propone el diseño de un mecanismo de indexación residente en SSD para resolver este problema. El reto de la indexación residente en SSD es reducir el número de accesos aleatorios al disco y el número de peticiones de acceso al disco.

Aportaciones

Este artículo presenta un esquema ANNS residente en SSD llamado DiskANN, que puede soportar de forma efectiva la búsqueda en conjuntos de datos a gran escala. Este esquema se basa en un algoritmo basado en grafos que se presenta en este trabajo: Vamana. Entre las aportaciones de este trabajo se incluyen:

  1. DiskANN puede indexar y buscar en un conjunto de datos a escala de miles de millones de dimensiones en una sola máquina con 64 GB de RAM, proporcionando más de un 95% de recall@1 con latencias inferiores a 5 milisegundos.
  2. Se propuso un nuevo algoritmo basado en grafos llamado Vamana con un radio de búsqueda menor que los de NSG y HNSW para minimizar el número de accesos al disco.
  3. Vamana puede trabajar en memoria y su rendimiento no es inferior al de NSG y HNSW.
  4. Los índices Vamana más pequeños construidos sobre particiones solapadas del gran conjunto de datos pueden fusionarse en un solo grafo sin perder conectividad.
  5. Vamana puede combinarse con esquemas de cuantificación como PQ. La estructura del grafo y los datos originales se almacenan en el disco, mientras que los datos comprimidos se guardan en la memoria.

Vamana

Este algoritmo es similar a la idea de NSG[2][4] (para los que no entiendan NSG, pueden consultar la Referencia [2], y si no quieren leer papers, pueden consultar la Referencia [4]). Su principal diferencia radica en la estrategia de recorte. Para ser precisos, se ha añadido un interruptor alfa a la estrategia de recorte de la NSG. La idea principal de la estrategia de recorte de la NSG es que la elección de los vecinos del punto objetivo sea lo más diversa posible. Si el nuevo vecino está más cerca de un vecino del punto objetivo que del punto objetivo, no necesitamos añadir este punto al conjunto de puntos vecinos. En otras palabras, para cada vecino del punto objetivo, no puede haber otros puntos vecinos dentro del radio circundante dist (punto objetivo, punto vecino). Esta estrategia de recorte controla eficazmente el grado de salida del gráfico y es relativamente radical. Reduce la huella de memoria del índice, mejora la velocidad de búsqueda, pero también reduce la precisión de la búsqueda. La estrategia de recorte de Vamana consiste en controlar libremente la escala de recorte mediante el parámetro alfa. El principio de funcionamiento consiste en multiplicar la dist (punto vecino, punto candidato) en la condición de recorte por un parámetro alfa (no inferior a 1). Sólo cuando la dist (punto objetivo, cierto punto candidato) es mayor que la distancia de referencia ampliada se adopta la estrategia de recorte, aumentando la tolerancia de exclusión mutua entre vecinos del punto objetivo.

El proceso de indexación de Vamana es relativamente sencillo:

  1. Inicializar un grafo aleatorio;
  2. Calcular el punto de partida, que es similar al punto de navegación de NSG. En primer lugar, encontrar el centroide global y, a continuación, encontrar el punto más cercano al centroide global como punto de navegación. La diferencia entre Vamana y NSG es que la entrada de NSG ya es un grafo de vecinos más cercanos, por lo que los usuarios pueden simplemente hacer una búsqueda aproximada de vecinos más cercanos en el punto centroide directamente en el grafo de vecinos inicial. Sin embargo, Vamana inicializa un grafo de vecinos más cercanos aleatorio, por lo que los usuarios no pueden realizar una búsqueda aproximada directamente en el grafo aleatorio. Necesitan realizar una comparación global para obtener un punto de navegación como punto de partida de las iteraciones posteriores. El objetivo de este punto es minimizar el radio medio de búsqueda;
  3. Realizar la Búsqueda Aproximada del Vecino más Cercano en cada punto basándose en el grafo aleatorio de vecinos inicializado y en el punto de inicio de la búsqueda determinado en el paso 2, hacer que todos los puntos de la ruta de búsqueda sean los conjuntos de vecinos candidatos y ejecutar la estrategia de recorte de aristas utilizando alfa = 1. Al igual que en NSG, la selección del conjunto de puntos en la ruta de búsqueda a partir del punto de navegación como el conjunto de vecinos candidatos aumentará algunos bordes largos y reducirá eficazmente el radio de búsqueda.
  4. Ajuste alfa > 1 (el documento recomienda 1,2) y repita el paso 3. Considerando que el paso 3 se basa en un grafo de vecino más cercano aleatorio, el grafo es de baja calidad después de la primera iteración. Por lo tanto, se necesita otra iteración para mejorar la calidad del gráfico, que es muy importante para la tasa de recuperación.

En este artículo se comparan tres índices de grafos: Vamana, NSG y HNSW. En términos de rendimiento de indexación y consulta, Vamana y NSG están relativamente cerca, y ambos superan ligeramente a HNSW. Los datos figuran en la sección "Experimentos".

2.png 2.png

Para visualizar el proceso de construcción del índice Vamana, el artículo presenta un gráfico en el que se utilizan 200 puntos bidimensionales para simular dos rondas de iteración. En la primera fila se utiliza alfa = 1 para recortar los bordes. Se puede observar que la estrategia de recorte es relativamente radical, y se recorta un gran número de aristas. Tras aumentar el valor de alfa y relajar las condiciones de recorte, obviamente se vuelven a añadir muchas aristas. En el gráfico final, se añaden bastantes aristas largas. Puede reducir eficazmente el radio de búsqueda.

DiskANN

Un ordenador personal con sólo 64 GB de memoria no podría albergar ni mil millones de datos en bruto, por no hablar del índice construido a partir de ellos. Hay dos retos por delante: 1. ¿Cómo indexar un conjunto de datos tan grande con recursos de memoria limitados? 2. ¿Cómo calcular la distancia en la búsqueda si los datos originales no pueden cargarse en memoria?

El documento propone las siguientes soluciones:

  1. Para el primer reto: en primer lugar, dividir los datos en k clusters mediante k-means y, a continuación, asignar cada punto a los i clusters más cercanos. Generalmente, 2 es suficiente para el número i. Construir un índice Vamana basado en memoria para cada cluster, y finalmente fusionar k índices Vamana en uno.
  2. Para el segundo reto: construir índices sobre los vectores originales y consultar los vectores comprimidos. Construir índices sobre el vector original garantiza la calidad del gráfico, mientras que el vector comprimido puede cargarse en la memoria para realizar búsquedas de grano grueso. Aunque la búsqueda con los vectores comprimidos puede provocar una pérdida de precisión, la dirección general será correcta siempre que la calidad del grafo sea lo suficientemente alta. El resultado final de la distancia se calculará utilizando el vector original.

La disposición de los índices de DiskANN es similar a la de los índices de grafos generales. El conjunto de vecinos de cada punto y los datos del vector original se almacenan juntos. De este modo se aprovecha mejor la localidad de los datos.

Como se mencionó anteriormente, si los datos del índice se almacenan en el SSD, el número de accesos al disco y las solicitudes de lectura y escritura del disco deben reducirse tanto como sea posible para garantizar un bajo retardo en la búsqueda. Por lo tanto, DiskANN propone dos estrategias de optimización:

  1. Cache hotspot: almacenar en caché todos los puntos dentro de los saltos C desde el punto inicial en memoria. El valor de C se fija mejor entre 3 y 4.
  2. Búsqueda por haces: En pocas palabras, se trata de precargar la información de los vecinos. Cuando se busca un punto p, el punto vecino de p debe cargarse desde el disco si no está en memoria. Dado que una pequeña operación de acceso aleatorio SSD tarda aproximadamente el mismo tiempo que una operación de acceso a un único sector SSD, se puede cargar a la vez la información vecina de W puntos no accedidos. W no puede ser demasiado grande ni demasiado pequeño. Una W grande desperdiciará recursos informáticos y ancho de banda SSD, mientras que una pequeña aumentará el retraso de la búsqueda.

Experimento

El experimento consta de tres grupos:

Comparación entre índices basados en memoria: Vamana VS. NSG VS. HNSW

Conjuntos de datos: SIFT1M (128 dimensiones), GIST1M (960 dimensiones), DEEP1M (96 dimensiones) y un conjunto de datos de 1M extraído aleatoriamente de DEEP1B.

Parámetros del índice (todos los conjuntos de datos utilizan el mismo conjunto de parámetros):

HNSW:M = 128, efc = 512.

Vamana: R = 70, L = 75, alfa = 1,2.

NSG: R = 60, L = 70, C= 500.

En el documento no se facilitan los parámetros de búsqueda, que pueden coincidir con los de indexación. Para la selección de parámetros, los parámetros de NSG mencionados en el artículo se basan en los parámetros listados en el repositorio GitHub de NSG para seleccionar el grupo con mejor rendimiento. Vamana y NSG están relativamente cerca, por lo que los parámetros también se establecen cerca. Sin embargo, no se indica la razón de la selección de los parámetros de HNSW. Creemos que el parámetro M de HNSW es relativamente grande. La comparación entre índices basados en grafos podría resultar menos convincente si sus grados de salida no se fijan al mismo nivel.

Con los parámetros de indexación anteriores, el tiempo de indexación de Vamana, HNSW y NSG es de 129s, 219s y 480s respectivamente. El tiempo de indexación de NSG incluye el tiempo de construcción del grafo vecino inicial con EFANN [3].

Curva Recall-QPS:

3.png 3.png

Se puede observar en la Figura 3 que Vamana tiene un rendimiento excelente en los tres conjuntos de datos, similar al de NSG y ligeramente mejor que HNSW.

Comparación del radio de búsqueda:

En la figura 2.c, podemos ver que Vamana tiene el radio de búsqueda medio más corto con el mismo índice de recuperación que NSG y HNSW.

Comparación entre un índice construido una sola vez y un gran índice fusionado

Conjunto de datos: SIFT1B

Parámetros del índice construido una sola vez: L = 50, R = 128, alfa = 1,2. Tras 2 días de funcionamiento en una máquina DDR3 de 1800 G, el pico de memoria es de unos 1100 G, y el grado medio de salida es de 113,9.

Procedimiento de indexación basado en la fusión:

  1. Entrenar 40 clusters en el conjunto de datos utilizando kmeans;
  2. Cada punto se distribuye en los 2 clusters más cercanos;
  3. Construir un índice Vamana con L = 50, R = 64 y alfa = 1,2 para cada clúster;
  4. Fusionar los índices de cada clúster.

Este índice generó un índice de 384 GB con una media de fuera de grado de 92,1. Este índice se ejecutó durante 5 días en una máquina DDR4 de 64 GB.

Los resultados de la comparación son los siguientes (Figura 2a): 4.png 4.png

En conclusión:

  1. El índice construido una sola vez es significativamente mejor que el índice basado en la fusión;
  2. El índice basado en la fusión también es excelente;
  3. El esquema de indexación basado en la fusión también es aplicable al conjunto de datos DEEP1B (Figura 2b).

Índice basado en disco: DiskANN VS. FAISS VS. IVF-OADC+G+P

IVFOADC+G+P es un algoritmo propuesto en la Referencia [5].

Este documento sólo compara DiskANN con IVFOADC+G+P, ya que la referencia [5] ha demostrado que IVFOADC+G+P es mejor que FAISS. Además, FAISS requiere recursos de GPU, que no son compatibles con todas las plataformas.

IVF-OADC+G+P parece ser una combinación de HNSW e IVF-PQ. Determina los clusters utilizando HNSW y realiza la búsqueda añadiendo algunas estrategias de poda al cluster objetivo.

El resultado se muestra en la figura 2a. Los 16 y 32 de la figura son el tamaño del libro de códigos. El conjunto de datos es SIFT1B, cuantificado por OPQ.

Detalles de la implementación del código

El código fuente de DiskANN es de código abierto en https://github.com/microsoft/DiskANN.

En enero de 2021, el código fuente de la solución de disco fue de código abierto.

A continuación se presenta principalmente el proceso de indexación y el proceso de búsqueda.

Construcción del índice

Existen 8 parámetros para crear un índice:

data_type: las opciones incluyen float/int8/uint8.

archivo_datos.bin: El archivo binario de datos original. Los dos primeros enteros del archivo representan respectivamente el número total n del vector del conjunto de datos y la dimensión dim del vector. Los últimos n bytes dim sizeof(data_type) son datos vectoriales continuos.

index_prefix_path: El prefijo de la ruta del archivo de salida. Una vez construido el índice, se generarán varios archivos relacionados con el índice. Este parámetro es el prefijo común del directorio donde se almacenan.

R: El grado máximo de salida del índice global.

L: El parámetro L del índice Vamana, el límite superior del tamaño del conjunto de candidatos.

B: El umbral de memoria en la consulta. Controla el tamaño del libro de códigos PQ, en GB.

M: El umbral de memoria cuando se construye un índice. Determina el tamaño del fragmento, en GB.

T: El número de hilos.

Proceso de indexación (función de entrada: aux_utils.cpp::build_disk_index):

  1. Genera varios nombres de ficheros de salida según index_prefix_path.
  2. Comprobación de parámetros.
  3. Leer la meta de data_file.bin para obtener n y dim. Determinar el subespacio de libro de códigos número m de PQ según B y n.
  4. generar_pq_pivotes: Muestrea el punto central del conjunto de entrenamiento PQ usando la tasa de muestreo de p = 1500000/n uniformemente para entrenar PQ globalmente.
  5. generate_pq_data_from_pivots: Genera un libro de códigos PQ global y guarda el punto central y el libro de códigos por separado.
  6. build_merged_vamana_index: trocea el conjunto de datos original, construye índices Vamana en segmentos, y finalmente fusiona los índices en uno.
  • partition_with_ram_budget: Determinar el número de fragmentos k en función del parámetro M. Muestrear el conjunto de datos mediante kmeans, distribuyendo cada punto en dos clusters más cercanos. Fragmente el conjunto de datos, y cada fragmento produce dos archivos: un archivo de datos y un archivo de ID. El archivo ID y el archivo de datos se corresponden entre sí, y cada ID del archivo ID corresponde a un vector del archivo de datos. Los ID se obtienen numerando cada vector de los datos originales de 0 a n-1. El ID es relativamente importante y está relacionado con la fusión.
    • Muestrear globalmente de forma uniforme el conjunto de entrenamiento con una tasa de muestreo de 1500000 / n;
    • Inicializar num_parts = 3. Iterar desde 3:
      • Hacer num_parts-means++ en el conjunto de entrenamiento en el paso i;
      • Utilice una tasa de muestreo de 0,01 para muestrear un conjunto de prueba de manera uniforme a nivel mundial, y dividir el conjunto de prueba en los 2 clusters más cercanos;
      • Contar el número de puntos en cada cluster y dividirlo por la tasa de muestreo para estimar el número de puntos en cada cluster;
      • Estimar la memoria requerida por el cluster más grande en el paso 3 de acuerdo con el tamaño del índice Vamana, si no excede el parámetro M, ir al paso iii, de lo contrario num_parts ++ volver al paso 2;
    • Dividir el conjunto de datos original en archivos de grupo num_parts, cada grupo de archivos incluye archivos de datos fragmentados y archivos ID correspondientes a los datos fragmentados.
  • Cree índices Vamana por separado para todos los fragmentos del paso a y guárdelos en el disco;
  • merge_shards: fusionar num_parts shard Vamana en un índice global:
    • Leer el archivo ID de num_parts fragmentos en idmap. Este idmap equivale a establecer un mapeo hacia adelante de fragmento->id;
    • Establecer un mapeo inverso de id->fragmentos según idmap, y saber en qué dos fragmentos está cada vector;
    • Utilizar un lector con 1GB de caché para abrir los índices de num_parts slice Vamana, y utilizar un escritor con 1GB de caché para abrir el archivo de salida, listo para fusionar;
    • Colocar num_parts puntos de navegación de índice Vamana en el archivo de punto central, que se utilizará en la búsqueda;
    • Empezar a fusionar según ID de pequeño a grande, leer el conjunto de puntos vecinos de cada vector original en cada fragmento por turnos según el mapeado inverso, deduplicar, barajar, truncar y escribir en el fichero de salida. Debido a que el troceado se ordenó originalmente de forma global, y ahora la fusión también está ordenada, por lo que el ID en el índice final volcado y el ID de los datos originales tienen una correspondencia uno a uno.
    • Elimine los archivos temporales, incluidos los archivos de fragmentos, los índices de fragmentos y los archivos de ID de fragmentos.
  1. crear_disposición_disco: El índice global generado en el paso 6 sólo tiene una tabla de adyacencia compacta. Este paso sirve para alinear el índice. La tabla de adyacencia y los datos originales se almacenan juntos. Al buscar, cargue la tabla de adyacencia y lea el vector original juntos para calcular la distancia con precisión. También existe el concepto de SECTOR, cuyo tamaño por defecto es de 4096. Cada SECTOR sólo contiene 4096 / node_size piezas de información vectorial. node_size = tamaño de vector único + tamaño de tabla de adyacencia de nodo único.

  2. Por último, hacer un muestreo uniforme global de 150000 / n, guardarlo, y utilizarlo para el calentamiento en la búsqueda.

Búsqueda

Hay 10 parámetros de búsqueda:

  • tipo_índice: Las opciones incluyen Float/int8/uint8, similar al primer parámetro data_type cuando se construye un índice.
  • index_prefix_path: Consulte el parámetro index_prefix_path.
  • num_nodes_to_cache: Número de puntos calientes de la caché.
  • num_threads: Número de hilos de búsqueda.
  • beamwidth: Límite superior del número de puntos de precarga. El sistema determina si está a 0.
  • archivo_consulta.bin: Archivo del conjunto de consultas.
  • truthset.bin: Fichero del conjunto de resultados, "null" significa que no se proporciona el conjunto de resultados, el programa lo calcula por sí mismo;
  • K: topk;
  • result_output_prefix: Ruta para guardar los resultados de la búsqueda;
  • L*: Lista de parámetros de búsqueda. Se pueden añadir varios valores. Para cada L, se dará información estadística al buscar con diferentes L.

Proceso de búsqueda:

  1. Cargar los datos relacionados: cargar el conjunto de consultas, los datos del punto central PQ, los datos del libro de códigos, el punto de inicio de la búsqueda y otros datos, y leer el índice meta.
  2. Utilizar el conjunto de datos muestreados durante la indexación para hacer cached_beam_search, contar los tiempos de acceso de cada punto y cargar num_nodes_to_cache los puntos con mayor frecuencia de acceso a la caché.
  3. Hay una operación WARMUP por defecto. Al igual que en el paso 2, este conjunto de datos de muestra también se utiliza para realizar una búsqueda_beam_en_cache.
  4. Según el número de parámetros L indicados, cada L se ejecutará con cached_beam_search de nuevo con el conjunto de consultas, y se obtendrán estadísticas como la tasa de recuperación y el QPS. El proceso de calentamiento y los datos estadísticos de los puntos calientes no se contabilizan en el tiempo de consulta.

Acerca de cached_beam_search:

  1. Busca el candidato más cercano al punto de consulta desde el punto de partida del candidato. Aquí se utiliza la distancia PQ, y el punto de partida se añade a la cola de búsqueda.
  2. Iniciar la búsqueda:
  • A partir de la cola de búsqueda, no hay más de beam_width + 2 puntos sin visitar. Si estos puntos están en la caché, añádalos a la cola de aciertos de la caché. Si no están en la caché, añádalos a la cola de errores. Asegúrese de que el tamaño de la cola de errores no supera el ancho del haz.
  • Envía peticiones asíncronas de acceso al disco a los puntos de la cola de errores.
  • Para los puntos alcanzados por la caché, utilice los datos originales y los datos de la consulta para calcular la distancia exacta, añádalos a la cola de resultados y, a continuación, utilice PQ para calcular la distancia a los puntos vecinos que no se han visitado antes de añadirlos a la cola de búsqueda. La longitud de la cola de búsqueda está limitada por parámetros.
  • Procesa los puntos perdidos en caché en el paso a, de forma similar al paso c.
  • Cuando la cola de búsqueda está vacía, la búsqueda finaliza y se devuelve la cola de resultados topk.

Resumir

Aunque se trata de un trabajo relativamente largo, en general es excelente. Las ideas del trabajo y del código son claras: dividir un número de cubos superpuestos mediante k-means, y luego dividir los cubos para construir un índice de mapa, y finalmente fusionar los índices, que es una idea relativamente nueva. En cuanto al índice de grafos basado en memoria Vamana, se trata esencialmente de una versión de NSG inicializada aleatoriamente que puede controlar la granularidad del recorte. Al realizar consultas, aprovecha al máximo la caché + pipeline, cubre parte del tiempo de io y mejora el QPS. Sin embargo, según el artículo, incluso si las condiciones de la máquina no son extraordinarias, el tiempo de entrenamiento es de hasta 5 días, y la usabilidad es relativamente baja. En el futuro será necesario optimizar el entrenamiento. Desde el punto de vista del código, la calidad es relativamente alta y puede utilizarse directamente en el entorno de producción.

Referencias

  1. Suhas Jayaram Subramanya, Fnu Devvrit, Harsha Vardhan Simhadri, Ravishankar Krishnawamy, Rohan Kadekodi. DiskANN: Búsqueda rápida y precisa de miles de millones de puntos de vecinos más cercanos en un solo nodo. NeurIPS 2019.
  2. [Cong Fu, Chao Xiang, Changxu Wang y Deng Cai. Búsqueda rápida aproximada de vecino más cercano con los gráficos de dispersión de navegación. PVLDB, 12(5):461 - 474, 2019. doi: 10.14778/3303753.3303754]. (http://www.vldb.org/pvldb/vol12/p461-fu.pdf)
  3. Cong Fu y Deng Cai. GitHub - ZJULearning/efanna: biblioteca rápida para la búsqueda de RNA y la construcción de gráficos KNN.
  4. Motor de búsqueda para AI:高维数据检索工业级解决方案

5. Dmitry Baranchuk, Artem Babenko y Yury Malkov. Revisiting the inverted indices for billion-scale approximate nearest neighbors.

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

Sigue Leyendo