🚀 Experimente o Zilliz Cloud, o Milvus totalmente gerenciado, gratuitamente—experimente um desempenho 10x mais rápido! Experimente Agora>>

milvus-logo
LFAI

Novas funcionalidades

  • News
May 20, 2021
milvus

O Milvus é um projeto contínuo de software de código aberto (OSS) focado na construção da base de dados vetorial mais rápida e fiável do mundo. As novas funcionalidades do Milvus v1.1.0 são as primeiras de muitas actualizações que estão para vir, graças ao apoio a longo prazo da comunidade open-source e ao patrocínio da Zilliz. Este artigo do blogue aborda as novas funcionalidades, melhorias e correcções de erros incluídas no Milvus v1.1.0.

Saltar para:


Novas funcionalidades

Como qualquer projeto OSS, Milvus é um trabalho perpétuo em progresso. Esforçamo-nos por ouvir os nossos utilizadores e a comunidade open-source para dar prioridade às funcionalidades mais importantes. A última atualização, Milvus v1.1.0, oferece as seguintes novas funcionalidades:

Especificar partições com get_entity_by_id() chamadas de método

Para acelerar ainda mais a pesquisa de semelhança de vectores, o Milvus 1.1.0 suporta agora a obtenção de vectores a partir de uma partição especificada. Geralmente, o Milvus suporta a consulta de vectores através de IDs de vectores especificados. No Milvus 1.0, chamar o método get_entity_by_id() pesquisa toda a coleção, o que pode ser demorado para grandes conjuntos de dados. Como podemos ver no código abaixo, GetVectorsByIdHelper utiliza uma estrutura FileHolder para percorrer e encontrar um vetor 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) { 

No entanto, esta estrutura não é filtrada por nenhuma partição em FilesByTypeEx(). Em Milvus v1.1.0, é possível para o sistema passar nomes de partições para o loop GetVectorsIdHelper para que o FileHolder contenha apenas segmentos de partições especificadas. Por outras palavras, se souber exatamente a que partição pertence o vetor para uma pesquisa, pode especificar o nome da partição numa chamada ao método get_entity_by_id() para acelerar o processo de pesquisa.

Não só fizemos modificações no código que controla as consultas do sistema ao nível do servidor Milvus, como também actualizámos todos os nossos SDK (Python, Go, C++, Java e RESTful) adicionando um parâmetro para especificar nomes de partições. Por exemplo, em pymilvus, a definição de get_entity_by_id def get_entity_by_id(self, collection_name, ids, timeout=None) é alterada para def get_entity_by_id(self, collection_name, partition_tags=None, ids, timeout=None).


Especificar partições com delete_entity_by_id() chamadas de método

Para tornar a gestão de vectores mais eficiente, o Milvus v1.1.0 suporta agora a especificação de nomes de partições quando se elimina um vetor numa coleção. No Milvus 1.0, os vectores de uma coleção só podem ser eliminados por ID. Ao chamar o método delete, o Milvus irá procurar todos os vectores da coleção. No entanto, é muito mais eficiente analisar apenas as partições relevantes quando se trabalha com conjuntos de dados massivos de milhões, biliões ou mesmo triliões de vectores. Semelhante ao novo recurso para especificar partições com chamadas de método get_entity_by_id(), foram feitas modificações no código do Milvus usando a mesma lógica.


Novo método release_collection()

Para libertar a memória que o Milvus utilizava para carregar colecções em tempo de execução, foi adicionado um novo método release_collection() no Milvus v1.1.0 para descarregar manualmente colecções específicas da cache.


Melhorias

Embora as novas funcionalidades estejam na moda, também é importante melhorar o que já temos. O que se segue são actualizações e outras melhorias gerais em relação ao Milvus v1.0.


Melhoria do desempenho da chamada do método get_entity_by_id()

O gráfico abaixo é uma comparação do desempenho da pesquisa vetorial entre o Milvus v1.0 e o Milvus v1.1.0:

CPU: Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
Tamanho do ficheiro de segmento = 1024 MB
Contagem de linhas = 1.000.000
Dim = 128

Número de ID da consultav 1.0.0v1.1.0
109 ms2 ms
100149 ms19 ms


Hnswlib atualizado para v0.5.0

O Milvus adopta várias bibliotecas de índices amplamente utilizadas, incluindo Faiss, NMSLIB, Hnswlib e Annoy para simplificar o processo de escolha do tipo de índice correto para um determinado cenário.

A Hnswlib foi actualizada da v0.3.0 para a v0.5.0 no Milvus 1.1.0 devido a um erro detectado na versão anterior. Além disso, a atualização da Hnswlib melhora o desempenho de addPoint() na construção de índices.

Um desenvolvedor Zilliz criou um pull request (PR) para melhorar o desempenho da Hnswlib durante a construção de índices no Milvus. Veja PR #298 para detalhes.

O gráfico abaixo é uma comparação do desempenho da addPoint() entre a Hnswlib 0.5.0 e o PR proposto:

CPU: Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
Conjunto de dados: sift_1M (contagem de linhas = 1000000, dim = 128, espaço = L2)

0.5.0PR-298
M = 16, ef_construction = 100274406 ms265631 ms
M = 16, ef_construction = 200522411 ms499639 ms


Desempenho melhorado da formação de índices FIV

A criação de um índice inclui treinamento, inserção e gravação de dados no disco. O Milvus 1.1.0 melhora a componente de formação da construção de índices. O gráfico abaixo é uma comparação do desempenho do treinamento do índice FIV entre o Milvus 1.0 e o Milvus 1.1.0:

CPU: Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
Conjunto de dados: 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


Correcções de erros

Também corrigimos alguns erros para tornar o Milvus mais estável e eficiente na gestão de conjuntos de dados vectoriais. Veja Problemas corrigidos para mais detalhes.

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

Continue Lendo