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

milvus-logo
LFAI

Nuevas funciones

  • News
May 20, 2021
milvus

Milvus es un proyecto de software de código abierto (OSS) centrado en la creación de la base de datos vectorial más rápida y fiable del mundo. Las nuevas características de Milvus v1.1.0 son las primeras de muchas actualizaciones que están por llegar, gracias al apoyo a largo plazo de la comunidad de código abierto y al patrocinio de Zilliz. Este artículo de blog cubre las nuevas características, mejoras y correcciones de errores incluidas en Milvus v1.1.0.

Ir a:


Nuevas funciones

Como cualquier proyecto OSS, Milvus es un trabajo perpetuo en progreso. Nos esforzamos por escuchar a nuestros usuarios y a la comunidad de código abierto para priorizar las características que más importan. La última actualización, Milvus v1.1.0, ofrece las siguientes nuevas características:

Especificar particiones con llamadas a métodos get_entity_by_id()

Para acelerar aún más la búsqueda de similitud de vectores, Milvus 1.1.0 ahora permite recuperar vectores de una partición especificada. Generalmente, Milvus soporta la consulta de vectores a través de IDs de vectores especificados. En Milvus 1.0, llamar al método get_entity_by_id() busca en toda la colección, lo que puede llevar mucho tiempo para grandes conjuntos de datos. Como podemos ver en el código siguiente, GetVectorsByIdHelper utiliza una estructura FileHolder para recorrer y encontrar un vector específico.

std::vector<meta::CollectionSchema> collection_array; 
 auto status = meta_ptr_->ShowPartitions(collection.collection_id_, collection_array); 
  
 collection_array.push_back(collection); 
 status = meta_ptr_->FilesByTypeEx(collection_array, file_types, files_holder); 
 if (!status.ok()) { 
     std::string err_msg = "Failed to get files for GetVectorByID: " + status.message(); 
     LOG_ENGINE_ERROR_ << err_msg; 
     return status; 
 } 
  
 if (files_holder.HoldFiles().empty()) { 
     LOG_ENGINE_DEBUG_ << "No files to get vector by id from"; 
     return Status(DB_NOT_FOUND, "Collection is empty"); 
 } 
  
 cache::CpuCacheMgr::GetInstance()->PrintInfo(); 
 status = GetVectorsByIdHelper(id_array, vectors, files_holder); 
DBImpl::GetVectorsByIdHelper(const IDNumbers& id_array, std::vector<engine::VectorsData>& vectors, 
                              meta::FilesHolder& files_holder) { 
     // attention: this is a copy, not a reference, since the files_holder.UnMarkFile will change the array internal 
     milvus::engine::meta::SegmentsSchema files = files_holder.HoldFiles(); 
     LOG_ENGINE_DEBUG_ << "Getting vector by id in " << files.size() << " files, id count = " << id_array.size(); 
  
     // sometimes not all of id_array can be found, we need to return empty vector for id not found 
     // for example: 
     // id_array = [1, -1, 2, -1, 3] 
     // vectors should return [valid_vector, empty_vector, valid_vector, empty_vector, valid_vector] 
     // the ID2RAW is to ensure returned vector sequence is consist with id_array 
     using ID2VECTOR = std::map<int64_t, VectorsData>; 
     ID2VECTOR map_id2vector; 
  
     vectors.clear(); 
  
     IDNumbers temp_ids = id_array; 
     for (auto& file : files) { 

Sin embargo, esta estructura no está filtrada por ninguna partición en FilesByTypeEx(). En Milvus v1.1.0, es posible que el sistema pase nombres de particiones al bucle GetVectorsIdHelper para que FileHolder sólo contenga segmentos de las particiones especificadas. Dicho de otro modo, si sabe exactamente a qué partición pertenece el vector de una búsqueda, puede especificar el nombre de la partición en una llamada al método get_entity_by_id() para acelerar el proceso de búsqueda.

No sólo hemos realizado modificaciones en el código que controla las consultas del sistema a nivel del servidor Milvus, sino que también hemos actualizado todos nuestros SDK (Python, Go, C++, Java y RESTful) añadiendo un parámetro para especificar los nombres de las particiones. Por ejemplo, en pymilvus, la definición de get_entity_by_id def get_entity_by_id(self, collection_name, ids, timeout=None) se cambia a def get_entity_by_id(self, collection_name, partition_tags=None, ids, timeout=None).


Especificación de particiones con llamadas al método delete_entity_by_id()

Para que la gestión de vectores sea más eficiente, Milvus v1.1.0 admite ahora la especificación de nombres de partición al eliminar un vector de una colección. En Milvus 1.0, los vectores de una colección sólo pueden borrarse por ID. Al llamar al método de borrado, Milvus escaneará todos los vectores de la colección. Sin embargo, es mucho más eficiente escanear sólo las particiones relevantes cuando se trabaja con conjuntos de datos masivos de millones, billones o incluso trillones de vectores. De forma similar a la nueva función para especificar particiones con llamadas al método get_entity_by_id(), se han realizado modificaciones en el código de Milvus utilizando la misma lógica.


Nuevo método release_collection()

Para liberar memoria que Milvus utilizaba para cargar colecciones en tiempo de ejecución, se ha añadido un nuevo método release_collection() en Milvus v1.1.0 para descargar manualmente colecciones específicas de la caché.


Mejoras

Aunque las nuevas características suelen estar de moda, también es importante mejorar lo que ya tenemos. Lo que sigue son actualizaciones y otras mejoras generales sobre Milvus v1.0.


Mejora del rendimiento de la llamada al método get_entity_by_id()

El siguiente gráfico es una comparación del rendimiento de la búsqueda vectorial entre Milvus v1.0 y Milvus v1.1.0:

CPU: Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
Tamaño del archivo de segmento = 1024 MB
Recuento de filas = 1.000.000
Dim = 128

ID de consulta Numv 1.0.0v1.1.0
109 ms2 ms
100149 ms19 ms


Hnswlib actualizada a v0.5.0

Milvus adopta múltiples bibliotecas de índices ampliamente utilizadas, incluyendo Faiss, NMSLIB, Hnswlib y Annoy para simplificar el proceso de elección del tipo de índice adecuado para un escenario dado.

Hnswlib se ha actualizado de v0.3.0 a v0.5.0 en Milvus 1.1.0 debido a un error detectado en la versión anterior. Además, la actualización de Hnswlib mejora el rendimiento de addPoint() en la creación de índices.

Un desarrollador de Zilliz creó un pull request (PR) para mejorar el rendimiento de Hnswlib al construir índices en Milvus. Ver PR #298 para más detalles.

El siguiente gráfico es una comparación del rendimiento de addPoint() entre Hnswlib 0.5.0 y el PR propuesto:

CPU: Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
Dataset: sift_1M (row count = 1000000, dim = 128, space = L2)

0.5.0PR-298
M = 16, ef_construcción = 100274406 ms265631 ms
M = 16, ef_construcción = 200522411 ms499639 ms


Mejora del rendimiento de la formación de índices IVF

La creación de un índice incluye la formación, la inserción y la escritura de datos en el disco. Milvus 1.1.0 mejora el componente de formación de la creación de índices. El siguiente gráfico es una comparación del rendimiento de la formación de índices IVF entre Milvus 1.0 y Milvus 1.1.0:

CPU: Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
Dataset: sift_1m (row_count = 1000000, dim = 128, metric_type = L2)

v1.0.0 (ms)v1.1.0 (ms)
ivf_flat (nlist = 2048)9007981544
ivf_pq (nlist = 2048, m=16)10353597115
ivf_pq (nlist = 2048, m=32)108638104558
ivf_flat (nlist = 4096)340643310685
ivf_pq (nlist = 4096, m=16)351982323758
ivf_pq (nlist = 4096, m=32)357359330887


Corrección de errores

También hemos corregido algunos errores para que Milvus sea más estable y eficiente a la hora de gestionar conjuntos de datos vectoriales. Vea Problemas corregidos para más detalles.

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