Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Descripción general de la evaluación comparativa (benchmark) de MongoDB Vector Search

Esta página explica estrategias clave de optimización del rendimiento para MongoDB Vector Search y cómo las utilizamos para crear nuestro benchmark. Para aprender cómo interpretar esta guía, consulta Cómo utilizar este Benchmark.

Información sobre el conjunto de datos y la configuración para nuestro punto de referencia.

Para nuestro punto de referencia, utilizamos el Conjunto de datos de revisiones de Amazon 2023, un conjunto de datos masivo de comercio electrónico que contiene 571.54millones de reseñas en 33 categorías de productos, que representa las interacciones de mayo de 1996 a septiembre de 2023. Con aproximadamente 48.2 millones de ítems únicos cubiertos por estas revisiones, proporciona datos multimodales enriquecidos que incluyen revisiones de usuarios (calificaciones, texto, votos de utilidad), metadatos del ítem (descripciones, precio, imágenes) y grafos de interacción usuario-ítem. Examinamos subconjuntos del conjunto de datos de artículos (5.5M y 15.3M) que contienen títulos y descripciones, y utilizamos la IA de Voyage voyage-3-large modelo para integrarlos usando la siguiente lógica:

source = "Item: Title: " + record["title"] + " Description: " + record["description"]
source_embedding = vo.embed(source, model="voyage-3-large", input_type="document", output_dimension=2048)

La calidad del resultado para los filtros se determina calculando la similitud de Jaccard (intersection / expected number of results) utilizando los resultados de un ANN query y los correspondientes resultados float exactos ENN para la misma entrada de texto y el mismo número de vectores solicitados. Recuperación se calcula encontrando la intersección promedio entre 50 consultas de muestra que podrían hacerse a un conjunto de datos de comercio electrónico.

Nota

Para ver el código fuente utilizado para la evaluación comparativa, así como el código utilizado para incrustar el conjunto de datos fuente, consulta Repositorio de pruebas de rendimiento.

Esta sección describe varios factores que tienen un impacto en el rendimiento de MongoDB Vector Search y cómo configuramos nuestro benchmark para probarlos.

La cuantización reduce la precisión de las incrustaciones vectoriales para disminuir el uso de memoria y mejorar la velocidad de búsqueda, con compensaciones en la precisión de la búsqueda.

La cuantización escalar convierte los vectores de punto flotante de 32bits en enteros de 8bits, logrando una reducción de 4x del uso de la memoria. Las comparaciones de vectores enteros requieren menos tiempo de cálculo en comparación con los vectores flotantes y menos recursos, pero pueden incurrir en una penalización en la precisión de la búsqueda.

La cuantificación binaria convierte vectores en representaciones de 1bits, lo que logra una reducción 32x en el uso de memoria. Las comparaciones de vectores binarios implican calcular la distancia de Hamming y requieren aún menos tiempo de cálculo en comparación con vectores int y menos recursos. Sin embargo, la penalización en la precisión de búsqueda al pasar de vectores float a vectores binarios es tan significativa que, para compensarlo, añadimos un paso de repuntuación, lo que incrementa la latencia. En el momento de la query, los numCandidates superiores acumulados durante la búsqueda se reordenan según sus vectores de fidelidad completa en el disco antes de obtener los primeros limit resultados.

Utilizamos el modelo voyage-3-large de Voyage IA para incrustar los conjuntos de datos de vectores de tamaño medio (5.5M) y grande (15.3M) conjuntos de datos de vectores. Elegimos este modelo de incrustación por su excelente rendimiento en muchos benchmarks IR y por haber sido entrenado considerando tanto el Aprendizaje en Representación Matrioska como la cuantización. Por lo tanto, se desempeña bien en dimensiones bajas con cuantización habilitada, incluso con altos volúmenes de vectores.

Aprovechamos la indexación en vistas para producir campos adicionales que dividen las primeras N dimensiones del vector de dimensiones de origen 2048 para producir 1024, 512 y 256 vectores de dimensiones e indexarlos como lo haríamos con el campo de origen.

Nota

Debes utilizar la versión 8.1 o posterior de MongoDB para crear un índice de búsqueda vectorial en una vista.

De manera similar a las diferentes representaciones en cada posición, las diferentes dimensiones afectan la capacidad de representación de cada vector. Por lo tanto, puedes lograr una mayor precisión con vectores de 2048dimensiones en comparación con vectores de 256dimensiones, especialmente cuando se mide frente a una línea base de ENN de coma flotante de 2048dimensiones.

Además de requerir más almacenamiento y memoria, los vectores de mayor dimensionalidad son algo más lentos de consultar en comparación con los vectores de menor dimensionalidad, pero esto se mitiga significativamente ya que MongoDB Vector Search aprovecha las instrucciones SIMD al realizar comparaciones vectoriales.

También creamos una definición de índice separada sobre la colección que contiene todos los artículos 15.3M, lo que incluye filtros en dos campos para habilitar consultas prefiltradas contra este conjunto de datos.

Ejecutamos consultas de búsqueda vectorial, tanto sin filtro como con filtro, en el gran conjunto de datos indexado:

# unfiltered query
query = [
{
"$vectorSearch": {
"index": "large_vector_index",
"path": "embedding",
"queryVector": embedding.tolist(),
"limit": k,
"numCandidates": candidates,
}
},
{
"$project": {"embedding": 0}
}
]
# filtered query
query = [
{
"$vectorSearch": {
"index": "large_vector_index",
"path": "embedding",
"queryVector": embedding.tolist(),
"limit": k,
"numCandidates": candidates,
"filter": {"$and": [{'price': {'$lte': 1000}}, {'category': {'$eq': "Pet Supplies"}}]}
}
},
{
"$project": {"embedding": 0}
}
]

Nota

Ambos patrones de query excluyen los campos de incrustación en la salida utilizando la etapa $project. Esto siempre se recomienda para reducir la latencia a menos que necesites incorporaciones en tus resultados.

El rendimiento de MongoDB Vector Search se escala con Search Nodes dedicados, que manejan los cálculos vectoriales por separado de la carga de trabajo principal de la base de datos y hacen un uso eficiente de las instancias de hardware dedicadas. Todas las pruebas se realizaron con un M20 clúster base, pero dependiendo del tipo de prueba, reconfiguramos los Search Nodes utilizados para que se ajustaran mejor a nuestro caso de prueba. Todas las pruebas se ejecutaron con Search Nodes en AWS 1us-east-, con una2 instancia EC también en us-east-1 realizando solicitudes. Hay tres tipos de Search Nodes que puede aprovisionar en AWS, que varían en términos de disco, RAM y vCPU disponibles:

Tipo de nodo
Perfil de recurso
Uso recomendado

Low-CPU

Baja relación disco a memoria (~6:1), baja vCPU

Un buen punto de partida para muchas cargas de trabajo de vectores que no aprovechan la cuantización.

High-CPU

Alta proporción de disco a memoria (~25:1), vCPU alta

Opción de alto rendimiento para cargas de trabajo con QPS alto o cargas de trabajo que aprovechan la cuantización

Optimizado para almacenamiento

Relación de disco a memoria alta (~25:1), bajo vCPU

Elección rentable para cargas de trabajo que aprovechan la cuantización

Un vector flotante de 768dimensiones ocupa aproximadamente3kb de espacio en el disco. Este requisito de recursos escala linealmente con la cantidad de vectores y la cantidad de dimensiones de cada vector: 1M 768d vectores ocupa ~3GB; 1M 1536d ocupa ~6gb.

Utilizando la cuantización, producimos vectores de representación que se mantienen en memoria a partir de los vectores de fidelidad completa almacenados en disco. Esto reduce la cantidad de memoria requerida por 3.75veces para la cuantización escalar y 24veces para la cuantización binaria, pero incrementa la cantidad de disco necesaria para almacenar los vectores sin cuantizar y cuantizados.

La vectorial de 768d cuantificada escalar de 1 requiere 0.8KB de memoria (3/3.75) y aproximadamente3.8KB de disco (3 + 3/3.75). Teniendo en cuenta estas opciones de hardware y los requisitos de recursos para la cuantificación, seleccionamos los siguientes niveles de búsqueda de nodos para los diferentes casos de prueba:

Caso de prueba
Recursos requeridos (RAM, almacenamiento)
Search Node Tier RAM, disk, vCPUs
Precio para 2x nodos

Conjunto de datos medio (5.5M vectores, todas las dimensiones), cuantificación escalar

22, 104.5 GB

S50- 32 GB, 843 GB 4 vCPUs optimizadas para almacenamiento

$1.04/hr

Conjunto de datos medio (5.5M vectores, todas las dimensiones), cuantificación binaria

3.43, 104.5 GB

S30-alto-cpu 8 GB 213 GB 4 vCPUs

$0.24/hr

Conjunto de datos grande (15.3M vectores, 2048d), cuantificación escalar

32.64, 155.04 GB

S50- 32 GB, 843 GB 4 vCPUs optimizadas para almacenamiento

$1.04/hr

Conjunto de datos grande (15.3M vectores, 2048d), cuantización binaria

5.1, 155.04 GB

S30-alto-cpu 8 GB 213 GB 4 vCPUs

$0.24/hr

Para el conjunto de datos grande, aprovechamos una funcionalidad adicional llamada compresión vectorial, que reduce la huella de cada vector en la colección fuente en aproximadamente un 60%. Esto acelera el paso dentro de una query cuando los ID son hidratados en la colección fuente, y este es un paso recomendado para todas las cargas de trabajo grandes.

Evaluamos no solo la latencia de query en serie, sino también el rendimiento total/QPS cuando se emiten solicitudes 10 y 100 de manera simultánea.

Nota

El mecanismo recomendado para gestionar un mayor rendimiento es escalar horizontalmente el número de nodos de búsqueda, lo cual no se midió en estas pruebas.

Evaluamos el impacto de particionar nuestro clúster y la colección en el campo _id sobre el rendimiento del sistema, centrando el análisis en la concurrencia de solicitudes de 10 y 100 para el índice binario cuantificado grande.

Volver

Benchmark de rendimiento

En esta página