Novas funcionalidades
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 consulta | v 1.0.0 | v1.1.0 |
---|---|---|
10 | 9 ms | 2 ms |
100 | 149 ms | 19 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.0 | PR-298 | |
---|---|---|
M = 16, ef_construction = 100 | 274406 ms | 265631 ms |
M = 16, ef_construction = 200 | 522411 ms | 499639 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) | 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 |
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.
- Melhorias
- Correcções de erros
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