Búsqueda de similitudes escalable y rapidísima con la base de datos vectorial Milvus
imagen de portada
Introducción
En este artículo trataremos algunos aspectos interesantes relacionados con las bases de datos vectoriales y la búsqueda de similitudes a escala. En el mundo actual, en rápida evolución, vemos nuevas tecnologías, nuevos negocios, nuevas fuentes de datos y, en consecuencia, tendremos que seguir utilizando nuevas formas de almacenar, gestionar y aprovechar estos datos para obtener información. Los datos estructurados y tabulares se han almacenado en bases de datos relacionales durante décadas, y el Business Intelligence se nutre del análisis y la extracción de información a partir de dichos datos. Sin embargo, teniendo en cuenta el panorama actual de los datos, "más del 80-90% de los datos es información no estructurada, como texto, vídeo, audio, registros de servidores web, redes sociales, etc.". Las organizaciones han estado aprovechando el poder del aprendizaje automático y el aprendizaje profundo para tratar de extraer información de estos datos, ya que los métodos tradicionales basados en consultas pueden no ser suficientes o ni siquiera posibles. Existe un enorme potencial sin explotar para extraer información valiosa de estos datos, ¡y solo estamos empezando!
"Dado que la mayoría de los datos del mundo no están estructurados, la capacidad de analizarlos y actuar en consecuencia representa una gran oportunidad". - Mikey Shulman, Director de ML, Kensho
Los datos no estructurados, como su nombre indica, no tienen una estructura implícita, como una tabla de filas y columnas (de ahí que se denominen datos tabulares o estructurados). A diferencia de los datos estructurados, no existe una forma sencilla de almacenar el contenido de los datos no estructurados en una base de datos relacional. El aprovechamiento de los datos no estructurados para obtener información plantea tres problemas principales:
- Almacenamiento: Las bases de datos relacionales normales sirven para almacenar datos estructurados. Aunque se pueden utilizar bases de datos NoSQL para almacenar dichos datos, el procesamiento de los mismos para extraer las representaciones adecuadas para potenciar las aplicaciones de IA a escala supone una sobrecarga adicional.
- Representación: Los ordenadores no entienden el texto o las imágenes como nosotros. Sólo entienden de números y necesitamos convertir los datos no estructurados en alguna representación numérica útil, normalmente vectores o incrustaciones.
- Consulta: Los datos no estructurados no se pueden consultar directamente a partir de sentencias condicionales definidas, como ocurre con los datos estructurados en SQL. Imagínese, por ejemplo, que intenta buscar zapatos similares a partir de una foto de su par favorito. No puede utilizar valores de píxeles sin procesar para la búsqueda, ni tampoco puede representar características estructuradas como la forma, el tamaño, el estilo, el color, etc. de los zapatos. Imagínese tener que hacer esto con millones de zapatos.
Por eso, para que los ordenadores entiendan, procesen y representen datos no estructurados, solemos convertirlos en vectores densos, a menudo llamados embeddings.
Figura 1
Existe una variedad de metodologías que aprovechan especialmente el aprendizaje profundo, incluidas las redes neuronales convolucionales (CNN) para datos visuales como imágenes y Transformers para datos de texto que pueden utilizarse para transformar dichos datos no estructurados en incrustaciones. Zilliz tiene un excelente artículo que cubre diferentes técnicas de incrustación.
Ahora bien, no basta con almacenar estos vectores de incrustación. También es necesario poder consultar y encontrar vectores similares. ¿Por qué? La mayoría de las aplicaciones del mundo real se basan en la búsqueda de vectores similares para soluciones basadas en IA. Esto incluye la búsqueda visual (de imágenes) en Google, los sistemas de recomendaciones en Netflix o Amazon, los motores de búsqueda de texto en Google, la búsqueda multimodal, la desduplicación de datos y muchas más.
Almacenar, gestionar y consultar vectores a escala no es una tarea sencilla. Para ello se necesitan herramientas especializadas, y las bases de datos vectoriales son las más eficaces. En este artículo trataremos los siguientes aspectos:
- Vectores y búsqueda de similitud de vectores
- ¿Qué es una base de datos vectorial?
- Milvus - La base de datos vectorial más avanzada del mundo
- Realización de búsquedas visuales de imágenes con Milvus - Un modelo de caso de uso
Empecemos
Vectores y búsqueda de similitud de vectores
Anteriormente, establecimos la necesidad de representar datos no estructurados como imágenes y texto como vectores, ya que los ordenadores sólo pueden entender números. Normalmente utilizamos modelos de IA, más concretamente modelos de aprendizaje profundo, para convertir datos no estructurados en vectores numéricos que puedan ser leídos por las máquinas. Normalmente, estos vectores son básicamente una lista de números de coma flotante que representan colectivamente el elemento subyacente (imagen, texto, etc.).
Comprender los vectores
En el campo del procesamiento del lenguaje natural (PLN) disponemos de muchos modelos de incrustación de palabras, como Word2Vec, GloVe y FastText, que pueden ayudar a representar palabras como vectores numéricos. Con el paso del tiempo, hemos asistido a la aparición de modelos de transformación como BERT, que pueden aprovecharse para aprender vectores de incrustación contextuales y mejores representaciones de frases y párrafos enteros.
Del mismo modo, en el campo de la visión por ordenador tenemos modelos como las redes neuronales convolucionales (CNN), que pueden ayudar a aprender representaciones a partir de datos visuales como imágenes y vídeos. Con el auge de los transformadores, también tenemos transformadores de visión que pueden funcionar mejor que las CNN normales.
Figura 2
La ventaja de estos vectores es que podemos aprovecharlos para resolver problemas del mundo real, como la búsqueda visual, en la que se sube una foto y se obtienen resultados de búsqueda que incluyen imágenes visualmente similares. Google tiene esta característica muy popular en su motor de búsqueda, como se muestra en el siguiente ejemplo.
Figura 3
Este tipo de aplicaciones funcionan con vectores de datos y búsqueda de similitud vectorial. Si consideramos dos puntos en un espacio de coordenadas cartesianas X-Y. La distancia entre dos puntos se puede calcular como una simple distancia euclidiana representada por la siguiente ecuación.
figura 4
Imaginemos ahora que cada punto de datos es un vector con dimensiones D. Podríamos seguir utilizando la distancia euclídea o incluso otras métricas de distancia, como la distancia de Hamming o la distancia coseno, para averiguar la proximidad entre dos puntos de datos. Esto puede ayudar a construir una noción de cercanía o similitud que podría utilizarse como una métrica cuantificable para encontrar elementos similares dado un elemento de referencia utilizando sus vectores.
Comprensión de la búsqueda de similitud vectorial
La búsqueda por similitud vectorial, a menudo conocida como búsqueda del vecino más cercano (NN), consiste básicamente en calcular la similitud (o distancia) entre pares de un elemento de referencia (para el que queremos encontrar elementos similares) y una colección de elementos existentes (normalmente en una base de datos) y devolver los 'k' vecinos más cercanos que son los 'k' elementos más similares. El componente clave para calcular esta similitud es la métrica de similitud, que puede ser la distancia euclídea, el producto interior, la distancia coseno, la distancia hamming, etc. Cuanto menor es la distancia, más similares son los vectores.
El reto de la búsqueda exacta del vecino más próximo (NN) es la escalabilidad. Es necesario calcular N distancias (suponiendo que existan N elementos) cada vez para obtener elementos similares. Esto puede ser muy lento, especialmente si no almacena e indexa los datos en algún lugar (¡como una base de datos de vectores!). Para acelerar el cálculo, solemos aprovechar la búsqueda aproximada del vecino más cercano, que a menudo se denomina búsqueda RNA y que acaba almacenando los vectores en un índice. El índice ayuda a almacenar estos vectores de forma inteligente para permitir la recuperación rápida de vecinos "aproximadamente" similares para un elemento de consulta de referencia. Las metodologías típicas de indexación de RNA incluyen
- Transformaciones de vectores: Incluye la adición de transformaciones adicionales a los vectores, como la reducción de dimensiones (por ejemplo, PCA \ t-SNE), la rotación, etc.
- Codificación de vectores: Incluye la aplicación de técnicas basadas en estructuras de datos como Locality Sensitive Hashing (LSH), cuantificación, árboles, etc., que pueden ayudar a recuperar más rápidamente elementos similares.
- Métodos de búsqueda no exhaustiva: Se utilizan principalmente para evitar la búsqueda exhaustiva e incluyen métodos como los grafos de vecindad, los índices invertidos, etc.
Para crear cualquier aplicación de búsqueda vectorial de similitudes, se necesita una base de datos que pueda ayudar a almacenar, indexar y consultar (buscar) de forma eficiente a gran escala. Las bases de datos vectoriales.
¿Qué es una base de datos vectorial?
Ahora que ya sabemos cómo se pueden utilizar los vectores para representar datos no estructurados y cómo funciona la búsqueda vectorial, podemos combinar ambos conceptos para crear una base de datos vectorial.
Las bases de datos vectoriales son plataformas de datos escalables para almacenar, indexar y consultar vectores incrustados que se generan a partir de datos no estructurados (imágenes, texto, etc.) utilizando modelos de aprendizaje profundo.
Manejar un número masivo de vectores para la búsqueda de similitudes (incluso con índices) puede resultar muy caro. A pesar de ello, las mejores y más avanzadas bases de datos vectoriales deberían permitirte insertar, indexar y buscar entre millones o miles de millones de vectores objetivo, además de especificar un algoritmo de indexación y una métrica de similitud de tu elección.
Las bases de datos vectoriales deben satisfacer principalmente los siguientes requisitos clave para que un sistema de gestión de bases de datos robusto pueda utilizarse en la empresa:
- Escalable: Las bases de datos vectoriales deben ser capaces de indexar y ejecutar la búsqueda aproximada del vecino más próximo para miles de millones de vectores incrustados
- Fiables: Las bases de datos vectoriales deben ser capaces de gestionar fallos internos sin pérdida de datos y con un impacto operativo mínimo, es decir, ser tolerantes a fallos.
- Rápidas: Las velocidades de consulta y escritura son importantes para las bases de datos vectoriales. Para plataformas como Snapchat e Instagram, que pueden tener cientos o miles de nuevas imágenes cargadas por segundo, la velocidad se convierte en un factor increíblemente importante.
Las bases de datos vectoriales no sólo almacenan vectores de datos. También son responsables de utilizar estructuras de datos eficientes para indexar estos vectores para una recuperación rápida y soportar operaciones CRUD (crear, leer, actualizar y eliminar). Idealmente, las bases de datos vectoriales también deberían soportar el filtrado de atributos, es decir, el filtrado basado en campos de metadatos que suelen ser campos escalares. Un ejemplo sencillo sería recuperar zapatos similares a partir de los vectores de imágenes de una marca concreta. En este caso, la marca sería el atributo en función del cual se realizaría el filtrado.
Figura 5
La figura anterior muestra cómo Milvus, la base de datos vectorial de la que hablaremos en breve, utiliza el filtrado por atributos. Milvus introduce el concepto de máscara de bits en el mecanismo de filtrado para mantener vectores similares con una máscara de bits de 1 basada en la satisfacción de filtros de atributos específicos. Más detalles aquí.
Milvus - La base de datos vectorial más avanzada del mundo
Milvus es una plataforma de gestión de bases de datos vectoriales de código abierto construida específicamente para datos vectoriales a gran escala y para agilizar las operaciones de aprendizaje automático (MLOps).
figura 6
Zilliz, es la organización que está detrás de la construcción de Milvus, la base de datos vectorial más avanzada del mundo, para acelerar el desarrollo del tejido de datos de próxima generación. Milvus es actualmente un proyecto de graduación en la LF AI & Data Foundation y se centra en la gestión de conjuntos masivos de datos no estructurados para su almacenamiento y búsqueda. La eficiencia y fiabilidad de la plataforma simplifica el proceso de despliegue de modelos de IA y MLOps a escala. Milvus tiene amplias aplicaciones que abarcan el descubrimiento de fármacos, la visión por ordenador, los sistemas de recomendación, los chatbots y mucho más.
Características principales de Milvus
Milvus está repleto de características y capacidades útiles, tales como:
- Velocidades de búsqueda fulgurantes en un billón de conjuntos de datos vectoriales: La latencia media de la búsqueda y recuperación de vectores se ha medido en milisegundos en un billón de conjuntos de datos vectoriales.
- Gestión simplificada de datos no estructurados: Milvus cuenta con ricas API diseñadas para flujos de trabajo de ciencia de datos.
- Base de datos vectorial fiable y siempre activa: Las funciones integradas de replicación y failover/failback de Milvus garantizan que los datos y las aplicaciones puedan mantener la continuidad del negocio siempre.
- Altamente escalable y elástica: La escalabilidad a nivel de componente permite aumentar y reducir la escala según la demanda.
- Búsqueda híbrida: Además de vectores, Milvus admite tipos de datos como booleanos, cadenas, enteros, números de punto flotante y más. Milvus combina el filtrado escalar con una potente búsqueda de similitud vectorial (como se ve en el ejemplo anterior de similitud de zapatos).
- Estructura lambda unificada: Milvus combina el flujo y el procesamiento por lotes para el almacenamiento de datos para equilibrar la puntualidad y la eficiencia.
- Viaje en el tiempo: Milvus mantiene una línea de tiempo para todas las operaciones de inserción y eliminación de datos. Permite a los usuarios especificar marcas de tiempo en una búsqueda para recuperar una vista de datos en un punto específico en el tiempo.
- Respaldado por la comunidad y reconocido por la industria: Con más de 1.000 usuarios empresariales, más de 10.500 estrellas en GitHub y una comunidad activa de código abierto, no está solo cuando utiliza Milvus. Como proyecto de posgrado de la LF AI & Data Foundation, Milvus cuenta con apoyo institucional.
Enfoques existentes para la gestión y búsqueda de datos vectoriales
Una forma común de construir un sistema de IA basado en la búsqueda de similitud vectorial es emparejar algoritmos como la búsqueda del vecino más cercano aproximado (ANNS) con bibliotecas de código abierto como:
- Facebook AI Similarity Search (FAISS): Este marco permite la búsqueda eficiente de similitudes y la agrupación de vectores densos. Contiene algoritmos que buscan en conjuntos de vectores de cualquier tamaño, hasta los que posiblemente no quepan en la memoria RAM. Admite funciones de indexación como el multiíndice invertido y la cuantización de productos.
- Annoy de Spotify (Approximate Nearest Neighbors Oh Yeah): Este marco utiliza proyecciones aleatorias y construye un árbol para permitir ANNS a escala para vectores densos.
- ScaNN (Scalable Nearest Neighbors) de Google: Este marco realiza una búsqueda eficiente de similitudes vectoriales a escala. Consta de implementaciones que incluyen la poda del espacio de búsqueda y la cuantización para la búsqueda máxima de productos internos (MIPS).
Aunque cada una de estas bibliotecas es útil a su manera, debido a varias limitaciones, estas combinaciones de algoritmo y biblioteca no son equivalentes a un sistema completo de gestión de datos vectoriales como Milvus. A continuación analizaremos algunas de estas limitaciones.
Limitaciones de los enfoques existentes
Los enfoques existentes utilizados para la gestión de datos vectoriales, tal y como se ha comentado en la sección anterior, presentan las siguientes limitaciones:
- Flexibilidad: Los sistemas existentes suelen almacenar todos los datos en la memoria principal, por lo que no pueden ejecutarse fácilmente en modo distribuido en varias máquinas y no son adecuados para gestionar conjuntos de datos masivos.
- Tratamiento dinámico de datos: A menudo se asume que los datos son estáticos una vez introducidos en los sistemas existentes, lo que complica el procesamiento de datos dinámicos e imposibilita la búsqueda en tiempo casi real.
- Procesamiento avanzado de consultas: La mayoría de las herramientas no admiten el procesamiento avanzado de consultas (por ejemplo, filtrado de atributos, búsqueda híbrida y consultas multivectoriales), que es esencial para construir motores de búsqueda de similitudes en el mundo real que admitan el filtrado avanzado.
- Optimizaciones para computación heterogénea: Pocas plataformas ofrecen optimizaciones para arquitecturas de sistemas heterogéneos tanto en CPU como en GPU (excluyendo FAISS), lo que conlleva pérdidas de eficiencia.
Milvus intenta superar todas estas limitaciones y lo analizaremos en detalle en la siguiente sección.
La ventaja de Milvus: comprender Knowhere
Milvus intenta abordar y resolver con éxito las limitaciones de los sistemas existentes construidos sobre algoritmos ineficientes de gestión de datos vectoriales y de búsqueda de similitudes de las siguientes maneras:
- Mejora la flexibilidad ofreciendo soporte para una variedad de interfaces de aplicación (incluyendo SDKs en Python, Java, Go, C++ y RESTful APIs).
- Soporta múltiples tipos de índices vectoriales (por ejemplo, índices basados en cuantización e índices basados en grafos) y procesamiento avanzado de consultas.
- Milvus maneja datos vectoriales dinámicos utilizando un árbol de fusión estructurado en registros (árbol LSM), manteniendo la eficiencia de las inserciones y supresiones de datos y el ritmo de las búsquedas en tiempo real.
- Milvus también proporciona optimizaciones para arquitecturas informáticas heterogéneas en CPU y GPU modernas, lo que permite a los desarrolladores ajustar los sistemas a escenarios, conjuntos de datos y entornos de aplicación específicos.
Knowhere, el motor de ejecución vectorial de Milvus, es una interfaz de operaciones para acceder a servicios en las capas superiores del sistema y a bibliotecas de búsqueda de similitud vectorial como Faiss, Hnswlib, Annoy en las capas inferiores del sistema. Además, Knowhere también se encarga de la computación heterogénea. Knowhere controla en qué hardware (por ejemplo, CPU o GPU) se ejecutan las solicitudes de creación de índices y de búsqueda. Así es como Knowhere obtiene su nombre - sabiendo dónde ejecutar las operaciones. Más tipos de hardware incluyendo DPU y TPU serán soportados en futuras versiones.
Figura 7
La computación en Milvus implica principalmente operaciones vectoriales y escalares. Knowhere sólo maneja las operaciones sobre vectores en Milvus. La figura anterior ilustra la arquitectura Knowhere en Milvus. La capa inferior es el hardware del sistema. Las bibliotecas de índices de terceros están sobre el hardware. Luego Knowhere interactúa con el nodo de índice y el nodo de consulta en la parte superior a través de CGO. Knowhere no sólo amplía las funciones de Faiss, sino que también optimiza el rendimiento y tiene varias ventajas, incluyendo soporte para BitsetView, soporte para más métricas de similitud, soporte para el conjunto de instrucciones AVX512, selección automática de instrucciones SIMD y otras optimizaciones de rendimiento. Encontrará más información aquí.
Arquitectura de Milvus
La siguiente figura muestra la arquitectura general de la plataforma Milvus. Milvus separa el flujo de datos del flujo de control y se divide en cuatro capas que son independientes en términos de escalabilidad y recuperación de desastres.
Figura 8
- Capa de acceso: La capa de acceso está compuesta por un grupo de proxies sin estado y sirve como capa frontal del sistema y punto final para los usuarios.
- Servicio de coordinación: El servicio de coordinación es responsable de la gestión de los nodos de la topología del clúster, el equilibrio de carga, la generación de marcas de tiempo, la declaración de datos y la gestión de datos.
- Nodos de trabajo: El nodo trabajador, o de ejecución, ejecuta las instrucciones emitidas por el servicio coordinador y los comandos del lenguaje de manipulación de datos (DML) iniciados por el proxy. Un nodo trabajador en Milvus es similar a un nodo de datos en Hadoop o a un servidor de región en HBase.
- Almacenamiento: Es la piedra angular de Milvus, responsable de la persistencia de los datos. La capa de almacenamiento se compone de meta store, log broker y object storage.
Consulte aquí más detalles sobre la arquitectura.
Realizar búsquedas visuales de imágenes con Milvus - Un modelo de caso de uso
Las bases de datos vectoriales de código abierto como Milvus permiten a cualquier empresa crear su propio sistema de búsqueda de imágenes visuales con un número mínimo de pasos. Los desarrolladores pueden utilizar modelos de IA preentrenados para convertir sus propios conjuntos de datos de imágenes en vectores y, a continuación, aprovechar Milvus para permitir la búsqueda de productos similares por imagen. Veamos en el siguiente esquema cómo diseñar y construir un sistema de este tipo.
Figura 9
En este flujo de trabajo podemos utilizar un marco de trabajo de código abierto como towhee para aprovechar un modelo preentrenado como ResNet-50 y extraer vectores de imágenes, almacenar e indexar estos vectores con facilidad en Milvus y también almacenar una asignación de ID de imagen a las imágenes reales en una base de datos MySQL. Una vez indexados los datos, podemos cargar cualquier imagen nueva con facilidad y realizar búsquedas de imágenes a escala utilizando Milvus. La siguiente figura muestra un ejemplo de búsqueda visual de imágenes.
figura 10
Eche un vistazo al tutorial detallado que se ha abierto en GitHub gracias a Milvus.
Conclusión
Hemos cubierto una buena cantidad de terreno en este artículo. Empezamos con los retos de representar datos no estructurados, aprovechando los vectores y la búsqueda de similitud vectorial a escala con Milvus, una base de datos vectorial de código abierto. Hablamos de los detalles de la estructura de Milvus y de los componentes clave que la impulsan, así como de un plan para resolver un problema del mundo real: la búsqueda visual de imágenes con Milvus. Pruébelo y empiece a resolver sus propios problemas del mundo real con Milvus.
¿Le ha gustado este artículo? Póngase en contacto conmigo para hablar más sobre él o para darme su opinión.
Sobre el autor
Dipanjan (DJ) Sarkar es Jefe de Ciencia de Datos, Experto en Desarrollo de Google - Aprendizaje Automático, Autor, Consultor y Asesor de IA. Contacto: http://bit.ly/djs_linkedin
- Introducción
- Vectores y búsqueda de similitud de vectores
- ¿Qué es una base de datos vectorial?
- Milvus - La base de datos vectorial más avanzada del mundo
- Realizar búsquedas visuales de imágenes con Milvus - Un modelo de caso de uso
- Conclusión
- Sobre el autor
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word