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 las estrategias clave de optimización del rendimiento para MongoDB Vector Search y cómo las utilizamos para crear nuestro benchmark. Para aprender a interpretar esta guía, consulte Cómo utilizar este punto de referencia.

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 reseñas de Amazon 2023, un conjunto masivo de datos de comercio electrónico que contiene 571.54millones de reseñas en 33 categorías de productos, que representan interacciones desde mayo 1996 hasta septiembre 2023. Con aproximadamente 48.2 millones de artículos únicos cubiertos por estas reseñas, proporciona datos multimodales completos que incluyen reseñas de usuarios (calificaciones, texto, votos de utilidad), metadatos de artículos (descripciones, precio, imágenes) y gráficos de interacción usuario-artículo. Analizamos subconjuntos del conjunto de datos de artículos (5.5millones y 15.3millones) que contienen títulos y descripciones, y utilizamos la inteligencia artificial de Voyage. voyage-3-large modelo para incrustarlos utilizando 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.

En esta sección se describen varios factores que afectan el rendimiento de MongoDB Vector Search y cómo configuramos nuestro punto de referencia 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 reduce el uso de memoria en 32veces. Las comparaciones de vectores binarios implican el cálculo de la distancia de Hamming y requieren incluso menos tiempo de cálculo que los vectores enteros y menos recursos. Sin embargo, la pérdida de precisión de la búsqueda es tan significativa al pasar de vectores float a vectores binarios que, para compensarla, añadimos un paso de repunte, lo que aumenta la latencia. En el momento de la consulta, los numCandidates primeros resultados acumulados durante la búsqueda se reordenan según sus vectores de fidelidad completa en el disco antes de generar los limit primeros 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 filtradas como sin filtrar, contra el gran conjunto de datos indexados:

# 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 escala con Nodos de Búsqueda Dedicados, los cuales gestionan los cálculos vectoriales independientemente de la carga de trabajo primaria de la base de datos y aprovechan eficientemente instancias de hardware dedicadas. Todas las pruebas se realizaron utilizando un clúster base M20, pero, dependiendo del tipo de prueba, reconfiguramos los Nodos de búsqueda utilizados para adaptarse mejor a nuestro caso de prueba. Todas las pruebas se realizaron utilizando Nodos de búsqueda en AWS us-east-1, con una instancia EC2 también en us-east-1 realizando solicitudes. Hay tres tipos de nodos de búsqueda que puedes provisionar en AWS, los cuales 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

Opción rentable para cargas de trabajo que aprovechan la cuantificació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-almacenamiento optimizado 32 GB, 843 GB, 4 vCPU

$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-almacenamiento optimizado 32 GB, 843 GB, 4 vCPU

$1.04/hr

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

5.1, 155.04 GB

S30-alto-cpu 8 GB 213 GB 4 vCPUs

$0.24/hr

Para el gran conjunto de datos, aprovechamos una función adicional llamada compresión vectorial, que reduce la huella de cada vector en la colección de origen en aproximadamente un 60%. Esto acelera el paso dentro de una consulta cuando los ID se hidratan en la colección de origen, y es un paso recomendado para todas las cargas de trabajo grandes.

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

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