Nuevas funciones
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 Num | v 1.0.0 | v1.1.0 |
---|---|---|
10 | 9 ms | 2 ms |
100 | 149 ms | 19 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.0 | PR-298 | |
---|---|---|
M = 16, ef_construcción = 100 | 274406 ms | 265631 ms |
M = 16, ef_construcción = 200 | 522411 ms | 499639 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) | 90079 | 81544 |
ivf_pq (nlist = 2048, m=16) | 103535 | 97115 |
ivf_pq (nlist = 2048, m=32) | 108638 | 104558 |
ivf_flat (nlist = 4096) | 340643 | 310685 |
ivf_pq (nlist = 4096, m=16) | 351982 | 323758 |
ivf_pq (nlist = 4096, m=32) | 357359 | 330887 |
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.
- Mejoras
- Corrección de errores
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