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

milvus-logo
LFAI
  • Home
  • Blog
  • Criação de uma base de dados de vectores para pesquisa de semelhanças escalável

Criação de uma base de dados de vectores para pesquisa de semelhanças escalável

  • Engineering
March 14, 2022
Xiaofan Luan

Cover image Imagem da capa

Este artigo foi escrito por Xiaofan Luan e transcrito por Angela Ni e Claire Yu.

De acordo com as estatísticas, cerca de 80%-90% dos dados mundiais não são estruturados. Alimentada pelo rápido crescimento da Internet, prevê-se uma explosão de dados não estruturados nos próximos anos. Consequentemente, as empresas precisam urgentemente de uma base de dados poderosa que as ajude a lidar melhor com esse tipo de dados e a compreendê-los. No entanto, desenvolver uma base de dados é sempre mais fácil de dizer do que de fazer. Este artigo tem como objetivo partilhar o processo de pensamento e os princípios de conceção da construção do Milvus, uma base de dados vetorial de código aberto e nativa da nuvem para pesquisa de semelhanças escalável. Este artigo também explica em pormenor a arquitetura do Milvus.

Saltar para:

Os dados não estruturados requerem uma pilha de software básica completa

À medida que a Internet cresceu e evoluiu, os dados não estruturados tornaram-se cada vez mais comuns, incluindo e-mails, documentos, dados de sensores IoT, fotos do Facebook, estruturas de proteínas e muito mais. Para que os computadores possam compreender e processar dados não estruturados, estes são convertidos em vectores utilizando técnicas de incorporação.

O Milvus armazena e indexa estes vectores e analisa a correlação entre dois vectores calculando a sua distância de semelhança. Se os dois vectores de incorporação forem muito semelhantes, isso significa que as fontes de dados originais também são semelhantes.

The workflow of processing unstructured data. O fluxo de trabalho do processamento de dados não estruturados.

Vectores e escalares

Um escalar é uma quantidade que é descrita apenas por uma medida - magnitude. Um escalar pode ser representado como um número. Por exemplo, um carro está a viajar à velocidade de 80 km/h. Aqui, a velocidade (80km/h) é um escalar. Por outro lado, um vetor é uma quantidade que é descrita em pelo menos duas medidas - magnitude e direção. Se um carro está a viajar para oeste à velocidade de 80 km/h, a velocidade (80 km/h oeste) é um vetor. A imagem abaixo é um exemplo de escalares e vectores comuns.

Scalars vs. Vectors Escalares vs. Vectores

Uma vez que a maioria dos dados importantes tem mais do que um atributo, podemos compreender melhor esses dados se os convertermos em vectores. Uma forma comum de manipularmos dados vectoriais é calcular a distância entre vectores utilizando métricas como a distância euclidiana, o produto interno, a distância de Tanimoto, a distância de Hamming, etc. Quanto mais próxima for a distância, mais semelhantes são os vectores. Para consultar eficientemente um conjunto de dados vectoriais maciço, podemos organizar os dados vectoriais criando índices sobre eles. Depois de o conjunto de dados ser indexado, as consultas podem ser encaminhadas para clusters, ou subconjuntos de dados, que têm maior probabilidade de conter vectores semelhantes a uma consulta de entrada.

Para saber mais sobre os índices, consulte Índice de vectores.

Do motor de pesquisa de vectores à base de dados de vectores

Desde o início, o Milvus 2.0 foi concebido para servir não só como um motor de busca, mas, mais importante, como uma poderosa base de dados vetorial.

Uma forma de o ajudar a compreender a diferença é fazer uma analogia entre o InnoDB e o MySQL, ou o Lucene e o Elasticsearch.

Tal como o MySQL e o Elasticsearch, o Milvus também foi construído com base em bibliotecas de código aberto, como a Faiss, a HNSW e a Annoy, que se concentram em fornecer funcionalidades de pesquisa e garantir o desempenho da pesquisa. No entanto, seria injusto reduzir o Milvus a uma mera camada sobre o Faiss, uma vez que armazena, recupera e analisa vectores e, tal como qualquer outra base de dados, também fornece uma interface padrão para operações CRUD. Para além disso, o Milvus também possui caraterísticas que incluem

  • Sharding e particionamento
  • Replicação
  • Recuperação de desastres
  • Equilíbrio de carga
  • Analisador ou optimizador de consultas

Vector database Base de dados vetorial

Para uma compreensão mais abrangente do que é uma base de dados vetorial, leia o blogue aqui.

Uma primeira abordagem nativa da nuvem

Could-native approach Abordagem nativa da nuvem

Do nada partilhado, ao armazenamento partilhado e depois a algo partilhado

As bases de dados tradicionais costumavam adotar uma arquitetura "nada partilhada", em que os nós dos sistemas distribuídos são independentes, mas ligados por uma rede. Nenhuma memória ou armazenamento é partilhado entre os nós. No entanto, o Snowflake revolucionou a indústria ao introduzir uma arquitetura de "armazenamento partilhado" em que a computação (processamento de consultas) é separada do armazenamento (armazenamento da base de dados). Com uma arquitetura de armazenamento partilhado, as bases de dados podem alcançar uma maior disponibilidade, escalabilidade e uma redução da duplicação de dados. Inspiradas pelo Snowflake, muitas empresas começaram a tirar partido da infraestrutura baseada na nuvem para a persistência de dados, utilizando simultaneamente o armazenamento local para o caching. Este tipo de arquitetura de base de dados é designado por "algo partilhado" e tornou-se a arquitetura dominante na maioria das aplicações actuais.

Para além da arquitetura "algo partilhado", o Milvus suporta o escalonamento flexível de cada componente, utilizando o Kubernetes para gerir o seu motor de execução e separando os serviços de leitura, escrita e outros serviços com microsserviços.

Base de dados como um serviço (DBaaS)

A base de dados como um serviço é uma tendência quente, uma vez que muitos utilizadores não se preocupam apenas com as funcionalidades regulares da base de dados, mas também anseiam por serviços mais variados. Isto significa que, para além das operações CRUD tradicionais, a nossa base de dados tem de enriquecer o tipo de serviços que pode fornecer, como a gestão de bases de dados, o transporte de dados, o carregamento, a visualização, etc.

Sinergia com o ecossistema de código aberto mais alargado

Outra tendência no desenvolvimento de bases de dados é aproveitar a sinergia entre a base de dados e outras infra-estruturas nativas da nuvem. No caso do Milvus, este baseia-se em alguns sistemas de código aberto. Por exemplo, o Milvus utiliza o etcd para armazenar metadados. Também adopta a fila de mensagens, um tipo de comunicação assíncrona serviço-a-serviço utilizada na arquitetura de microsserviços, que pode ajudar a exportar dados incrementais.

No futuro, esperamos construir o Milvus em cima de infraestruturas de IA como Spark ou Tensorflow, e integrar o Milvus com motores de streaming para que possamos suportar melhor o processamento unificado de stream e batch para satisfazer as várias necessidades dos utilizadores do Milvus.

Os princípios de conceção do Milvus 2.0

Como a nossa base de dados vetorial nativa da nuvem da próxima geração, o Milvus 2.0 é construído em torno dos três princípios seguintes.

Registo como dados

Um registo numa base de dados regista em série todas as alterações feitas aos dados. Como mostra a figura abaixo, da esquerda para a direita estão os "dados antigos" e os "dados novos". E os registos estão por ordem cronológica. O Milvus tem um mecanismo de temporização global que atribui um carimbo de data/hora globalmente único e auto-incremental.

Logs Registos

No Milvus 2.0, o broker de logs serve como espinha dorsal do sistema: todas as operações de inserção e atualização de dados têm de passar pelo broker de logs, e os nós de trabalho executam operações CRUD subscrevendo e consumindo logs.

Dualidade da tabela e do registo

Tanto a tabela como o registo são dados, e são apenas duas formas diferentes. As tabelas são dados limitados, enquanto os registos não são limitados. Os registos podem ser convertidos em tabelas. No caso do Milvus, este agrega os registos utilizando uma janela de processamento do TimeTick. Com base na sequência de registos, vários registos são agregados num pequeno ficheiro denominado "log snapshot". Em seguida, esses instantâneos de log são combinados para formar um segmento, que pode ser usado individualmente para balanceamento de carga.

Persistência do registo

A persistência dos registos é um dos problemas mais difíceis enfrentados por muitas bases de dados. O armazenamento de registos num sistema distribuído depende normalmente de algoritmos de replicação.

Ao contrário de bases de dados como Aurora, HBase, Cockroach DB e TiDB, o Milvus adopta uma abordagem inovadora e introduz um sistema de publicação/assinatura (pub/sub) para armazenamento e persistência de registos. Um sistema pub/sub é análogo à fila de mensagens no Kafka ou no Pulsar. Todos os nós do sistema podem consumir os registos. Em Milvus, este tipo de sistema é designado por broker de registos. Graças ao corretor de registos, os registos são dissociados do servidor, garantindo que o Milvus não tem estado e está melhor posicionado para recuperar rapidamente de uma falha do sistema.

Log broker Corretor de registos

Construído com base em bibliotecas populares de pesquisa vetorial, incluindo Faiss, ANNOY, HNSW e outras, o Milvus foi concebido para a pesquisa de semelhanças em conjuntos de dados vectoriais densos que contêm milhões, milhares de milhões ou mesmo triliões de vectores.

Autónomo e em cluster

Milvus oferece duas formas de implementação - autónoma ou em cluster. No Milvus autónomo, uma vez que todos os nós são implementados em conjunto, podemos ver o Milvus como um único processo. Atualmente, o Milvus standalone depende do MinIO e do etcd para persistência de dados e armazenamento de metadados. Em versões futuras, esperamos eliminar essas duas dependências de terceiros para garantir a simplicidade do sistema Milvus. O cluster Milvus inclui oito componentes de microsserviço e três dependências de terceiros: MinIO, etcd, e Pulsar. A Pulsar serve como broker de logs e fornece serviços de pub/sub de logs.

Standalone and cluster Autónomo e cluster

Um esqueleto básico da arquitetura Milvus

O Milvus separa o fluxo de dados do fluxo de controlo e está dividido em quatro camadas que são independentes em termos de escalabilidade e recuperação de desastres.

Milvus architecture Arquitetura Milvus

Camada de acesso

A camada de acesso actua como a face do sistema, expondo o ponto final da ligação do cliente ao mundo exterior. É responsável pelo processamento das ligações dos clientes, pela verificação estática, pelas verificações dinâmicas básicas dos pedidos dos utilizadores, pelo encaminhamento dos pedidos e pela recolha e devolução dos resultados ao cliente. O proxy em si não tem estado e fornece endereços de acesso unificado e serviços para o mundo exterior através de componentes de balanceamento de carga (Nginx, Kubernetes Ingress, NodePort e LVS). O Milvus utiliza uma arquitetura de processamento paralelo massivo (MPP), em que os proxies devolvem resultados recolhidos a partir de nós de trabalho após agregação global e pós-processamento.

Serviço de coordenação

O serviço coordenador é o cérebro do sistema, responsável pela gestão dos nós da topologia do cluster, pelo equilíbrio de carga, pela geração de carimbos de data/hora, pela declaração de dados e pela gestão de dados. Para uma explicação detalhada da função de cada serviço coordenador, leia a documentação técnica do Milvus.

Nós de trabalho

O nó de trabalho, ou de execução, actua como os membros do sistema, executando as instruções emitidas pelo serviço coordenador e os comandos da linguagem de manipulação de dados (DML) iniciados pelo proxy. Um nó de trabalho no Milvus é semelhante a um nó de dados no Hadoop, ou a um servidor de região no HBase. Cada tipo de nó de trabalho corresponde a um serviço de coordenação. Para uma explicação detalhada da função de cada nó de trabalho, leia a documentação técnica do Milvus.

Armazenamento

O armazenamento é a pedra angular do Milvus, responsável pela persistência dos dados. A camada de armazenamento está dividida em três partes:

  • Meta store: Responsável por armazenar snapshots de meta-dados como o esquema da coleção, estado dos nós, checkpoints de consumo de mensagens, etc. O Milvus depende do etcd para estas funções e o Etcd também assume a responsabilidade pelo registo do serviço e pelas verificações de saúde.
  • Corretor de registos: Um sistema pub/sub que suporta a reprodução e é responsável pela persistência de dados em fluxo contínuo, execução de consultas assíncronas fiáveis, notificações de eventos e devolução de resultados de consultas. Quando os nós estão a executar a recuperação de tempo de inatividade, o corretor de registos assegura a integridade dos dados incrementais através da reprodução do corretor de registos. O cluster Milvus utiliza o Pulsar como corretor de registos, enquanto o modo autónomo utiliza o RocksDB. Os serviços de armazenamento em fluxo contínuo, como o Kafka e o Pravega, também podem ser utilizados como corretores de registo.
  • Armazenamento de objetos: Armazena ficheiros de instantâneos de registos, ficheiros de índices escalares/vectoriais e resultados de processamento de consultas intermédias. O Milvus suporta o AWS S3 e o Azure Blob, bem como o MinIO, um serviço de armazenamento de objectos leve e de código aberto. Devido à elevada latência de acesso e à faturação por consulta dos serviços de armazenamento de objectos, o Milvus irá em breve suportar pools de cache baseados em memória/SSD e separação de dados quentes/frios para melhorar o desempenho e reduzir os custos.

Modelo de dados

O modelo de dados organiza os dados numa base de dados. Em Milvus, todos os dados são organizados por coleção, fragmento, partição, segmento e entidade.

Data model 1 Modelo de dados 1

Coleção

Uma coleção em Milvus pode ser comparada a uma tabela num sistema de armazenamento relacional. A coleção é a maior unidade de dados em Milvus.

Fragmento

Para tirar o máximo partido do poder de computação paralela dos clusters ao escrever dados, as colecções em Milvus devem distribuir as operações de escrita de dados por diferentes nós. Por defeito, uma única coleção contém dois shards. Dependendo do volume do conjunto de dados, é possível ter mais fragmentos numa coleção. Milvus usa um método de hashing de chave mestra para sharding.

Partição

Existem também várias partições num shard. Uma partição no Milvus refere-se a um conjunto de dados marcados com a mesma etiqueta numa coleção. Os métodos de partição comuns incluem a partição por data, sexo, idade do utilizador, entre outros. A criação de partições pode beneficiar o processo de consulta, uma vez que os dados podem ser filtrados por etiqueta de partição.

Em comparação, a fragmentação tem mais a ver com as capacidades de escalonamento ao escrever dados, enquanto o particionamento tem mais a ver com a melhoria do desempenho do sistema ao ler dados.

Data model 2 Modelo de dados 2

Segmentos

Dentro de cada partição, existem vários segmentos pequenos. Um segmento é a unidade mais pequena para a programação do sistema em Milvus. Existem dois tipos de segmentos, crescentes e selados. Os segmentos crescentes são subscritos pelos nós de consulta. O utilizador do Milvus continua a escrever dados em segmentos crescentes. Quando o tamanho de um segmento crescente atinge um limite superior (512 MB por defeito), o sistema não permite a escrita de dados extra neste segmento crescente, selando assim este segmento. Os índices são construídos em segmentos selados.

Para aceder aos dados em tempo real, o sistema lê os dados nos segmentos crescentes e nos segmentos selados.

Entidade

Cada segmento contém uma quantidade enorme de entidades. Uma entidade em Milvus é equivalente a uma linha numa base de dados tradicional. Cada entidade tem um campo de chave primária único, que também pode ser gerado automaticamente. As entidades devem também conter um carimbo de data/hora (ts), e um campo vetorial - o núcleo de Milvus.

Sobre a série Deep Dive

Com o anúncio oficial da disponibilidade geral do Milvus 2.0, orquestrámos esta série de blogues Milvus Deep Dive para fornecer uma interpretação aprofundada da arquitetura e do código fonte do Milvus. Os tópicos abordados nesta série de blogues incluem:

Like the article? Spread the word

Continue Lendo