FAQ do produto
Quanto é que o Milvus custa?
O Milvus é um projeto open-source 100% gratuito.
Por favor, cumpra a Licença Apache 2.0 quando utilizar o Milvus para fins de produção ou distribuição.
A Zilliz, a empresa por detrás do Milvus, também oferece uma versão cloud totalmente gerida da plataforma para aqueles que não querem construir e manter a sua própria instância distribuída. A Zilliz Cloud mantém automaticamente a fiabilidade dos dados e permite que os utilizadores paguem apenas pelo que utilizam.
O Milvus suporta arquitecturas não-x86?
O Milvus não pode ser instalado ou executado em plataformas não-x86.
Sua CPU deve suportar um dos seguintes conjuntos de instruções para executar o Milvus: SSE4.2, AVX, AVX2, AVX512. Estes são todos conjuntos de instruções SIMD dedicados ao x86.
Onde é que o Milvus armazena os dados?
O Milvus lida com dois tipos de dados, dados inseridos e metadados.
Os dados inseridos, incluindo os dados vectoriais, os dados escalares e o esquema específico da coleção, são armazenados no armazenamento persistente como registo incremental. Milvus suporta múltiplos backends de armazenamento de objectos, incluindo MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS e Tencent Cloud Object Storage (COS).
Os metadados são gerados no Milvus. Cada módulo do Milvus tem os seus próprios metadados que são armazenados no etcd.
Porque não existem dados vectoriais no etcd?
O etcd armazena os metadados do módulo Milvus; o MinIO armazena as entidades.
O Milvus suporta a inserção e pesquisa de dados em simultâneo?
Sim. As operações de inserção e as operações de consulta são tratadas por dois módulos separados que são mutuamente independentes. Do ponto de vista do cliente, uma operação de inserção está concluída quando os dados inseridos entram na fila de mensagens. No entanto, os dados inseridos não podem ser pesquisados até serem carregados no nó de consulta. Se o tamanho do segmento não atingir o limite de construção de índice (512 MB por padrão), o Milvus recorre à pesquisa de força bruta e o desempenho da consulta pode ser reduzido.
Os vectores com chaves primárias duplicadas podem ser inseridos no Milvus?
Sim. O Milvus não verifica se as chaves primárias dos vectores são duplicadas.
Quando são inseridos vectores com chaves primárias duplicadas, o Milvus trata-os como uma operação de atualização?
Não. Milvus não suporta atualmente operações de atualização e não verifica se as chaves primárias das entidades são duplicadas. O utilizador é responsável por garantir que as chaves primárias das entidades são únicas e, se não forem, o Milvus pode conter várias entidades com chaves primárias duplicadas.
Se isto acontecer, a cópia de dados que será devolvida quando consultada continua a ser um comportamento desconhecido. Esta limitação será corrigida em versões futuras.
Qual é o comprimento máximo das chaves primárias de entidades auto-definidas?
As chaves primárias de entidade devem ser inteiros não negativos de 64 bits.
Qual é a quantidade máxima de dados que pode ser adicionada por operação de inserção?
Uma operação de inserção não pode exceder 1.024 MB de tamanho. Este é um limite imposto pelo gRPC.
O tamanho da coleção tem impacto no desempenho da consulta quando se pesquisa numa partição específica?
Não. Se forem especificadas partições para uma pesquisa, o Milvus pesquisa apenas nas partições especificadas.
O Milvus precisa de carregar toda a coleção quando as partições são especificadas para uma pesquisa?
Depende de quais dados são necessários para a pesquisa. Todas as partições que podem aparecer no resultado da pesquisa devem ser carregadas antes da pesquisa.
- Por exemplo, se só quiser pesquisar uma ou mais partições específicas, não precisa de carregar todas. Chame
load_partition()
para carregar a(s) partição(ões) pretendida(s) e, em seguida, especifique a(s) partição(ões) na chamada do métodosearch()
. - Se pretender pesquisar todas as partições, chame
load_collection()
para carregar toda a coleção, incluindo todas as partições. - Se não conseguir carregar a coleção ou as partições específicas antes de efetuar a pesquisa, o Milvus apresentará um erro.
Podem ser criados índices após a inserção de vectores?
Sim. Se já tiver sido criado um índice para uma coleção em create_index()
, o Milvus criará automaticamente um índice para os vectores inseridos posteriormente. No entanto, o Milvus não cria um índice até que os novos vectores inseridos preencham um segmento inteiro e o ficheiro de índice recém-criado seja separado do anterior.
Quais são as diferenças entre os índices FLAT e IVF_FLAT?
O índice IVF_FLAT divide o espaço vetorial em clusters de lista. No valor de lista predefinido de 16.384, o Milvus compara as distâncias entre o vetor alvo e os centróides de todos os 16.384 clusters para devolver os clusters mais próximos da sonda. Em seguida, o Milvus compara as distâncias entre o vetor alvo e os vectores nos clusters selecionados para obter os vectores mais próximos. Ao contrário do IVF_FLAT, o FLAT compara diretamente as distâncias entre o vetor alvo e todos os outros vectores.
Quando o número total de vectores é aproximadamente igual a nlist, há pouca distância entre o IVF_FLAT e o FLAT em termos de requisitos de cálculo e desempenho da pesquisa. No entanto, como o número de vetores excede nlist por um fator de dois ou mais, IVF_FLAT começa a demonstrar vantagens de desempenho.
Consulte Índice de vetores para obter mais informações.
Como é que o Milvus descarrega os dados?
O Milvus retorna sucesso quando os dados inseridos são ingeridos na fila de mensagens. No entanto, os dados ainda não foram transferidos para o disco. Em seguida, o nó de dados do Milvus escreve os dados na fila de mensagens para o armazenamento persistente como registos incrementais. Se flush()
for chamado, o nó de dados é forçado a escrever todos os dados na fila de mensagens para o armazenamento persistente imediatamente.
O que é normalização? Por que a normalização é necessária?
A normalização se refere ao processo de conversão de um vetor para que sua norma seja igual a 1. Se o produto interno for usado para calcular a similaridade do vetor, os vetores devem ser normalizados. Após a normalização, o produto interno é igual à similaridade de cosseno.
Consulte a Wikipedia para obter mais informações.
Por que a distância euclidiana (L2) e o produto interno (IP) retornam resultados diferentes?
Para vectores normalizados, a distância euclidiana (L2) é matematicamente equivalente ao produto interno (IP). Se estas métricas de semelhança devolverem resultados diferentes, verifique se os seus vectores estão normalizados
Existe um limite para o número total de colecções e partições no Milvus?
Sim. É possível criar até 65.535 colecções numa instância do Milvus. Ao calcular o número de colecções existentes, o Milvus conta todas as colecções com shards e partições.
Por exemplo, vamos supor que já criou 100 colecções, com 2 fragmentos e 4 partições em 60 delas e com 1 fragmento e 12 partições nas restantes 40 colecções. O número atual de colecções pode ser calculado da seguinte forma:
60 * 2 * 4 + 40 * 1 * 12 = 960
Porque obtenho menos de k vectores quando procuro por topk
vectores?
Entre os índices que o Milvus suporta, o IVF_FLAT e o IVF_SQ8 implementam o método de agrupamento k-means. Um espaço de dados é dividido em nlist
clusters e os vectores inseridos são distribuídos por estes clusters. O Milvus seleciona então os nprobe
clusters mais próximos e compara as distâncias entre o vetor-alvo e todos os vectores nos clusters selecionados para obter os resultados finais.
Se nlist
e topk
forem grandes e nprobe for pequeno, o número de vectores nos clusters nprobe pode ser inferior a k
. Por conseguinte, quando procura os vectores mais próximos de topk
, o número de vectores devolvidos é inferior a k
.
Para evitar esta situação, tente definir nprobe
maior e nlist
e k
menor.
Consulte Índice de vetores para obter mais informações.
Qual é a dimensão máxima do vetor suportada pelo Milvus?
Por predefinição, o Milvus pode gerir vectores com um máximo de 32.768 dimensões. Pode aumentar o valor de Proxy.maxDimension
para permitir um vetor de maior dimensão.
O Milvus suporta o CPU Apple M1?
A versão atual do Milvus não suporta diretamente o CPU Apple M1. Após Milvus 2.3, Milvus fornece imagens Docker para a arquitetura ARM64.
Que tipos de dados o Milvus suporta no campo de chave primária?
Na versão atual, o Milvus suporta INT64 e string.
O Milvus é escalável?
Sim. Pode implementar o cluster Milvus com vários nós através do Helm Chart no Kubernetes. Consulte o Guia de Escala para obter mais instruções.
O que são segmentos crescentes e segmentos selados?
Quando um pedido de pesquisa chega, Milvus pesquisa tanto dados incrementais como dados históricos. Os dados incrementais são actualizações recentes, são armazenados nos segmentos crescentes, que são armazenados em buffer na memória antes de atingirem o limiar para serem persistidos no armazenamento de objectos e é criado um índice mais eficiente para eles, enquanto os dados históricos são actualizações de há algum tempo atrás. Encontram-se nos segmentos selados que foram persistidos no armazenamento de objectos. Os dados incrementais e os dados históricos constituem, em conjunto, todo o conjunto de dados para pesquisa. Esta conceção torna qualquer dado ingerido no Milvus instantaneamente pesquisável. No caso do Milvus Distributed, existem factores mais complexos que decidem quando é que um registo que acabou de ser ingerido pode aparecer no resultado da pesquisa. Saiba mais sobre isso nos níveis de consistência.
O Milvus está disponível para pesquisa simultânea?
Sim. Para pesquisas na mesma coleção, o Milvus pesquisa simultaneamente os dados incrementais e históricos. No entanto, as consultas em diferentes colecções são realizadas em série. Considerando que os dados históricos podem ser um conjunto de dados extremamente grande, as pesquisas nos dados históricos são relativamente mais demoradas e essencialmente efectuadas em série.
Porque é que os dados no MinIO permanecem após a eliminação da coleção correspondente?
Os dados no MinIO foram concebidos para permanecerem durante um determinado período de tempo para conveniência da reversão de dados.
O Milvus suporta outros motores de mensagens para além do Pulsar?
Sim. Kafka é suportado no Milvus 2.1.0.
Qual é a diferença entre uma pesquisa e uma consulta?
No Milvus, uma pesquisa por similaridade de vetores recupera vetores com base no cálculo de similaridade e na aceleração do índice de vetores. Ao contrário de uma pesquisa de semelhança de vectores, uma consulta de vectores recupera vectores através de uma filtragem escalar baseada numa expressão booleana. A expressão booleana filtra os campos escalares ou o campo de chave primária e recupera todos os resultados que correspondem aos filtros. Numa consulta, não estão envolvidos nem a métrica de semelhança nem o índice de vectores.
Porque é que um valor de vetor float tem uma precisão de 7 dígitos decimais no Milvus?
O Milvus suporta o armazenamento de vectores como arrays Float32. Um valor Float32 tem uma precisão de 7 casas decimais. Mesmo com um valor Float64, como 1.3476964684980388, Milvus armazena-o como 1.347696. Assim, quando recupera um vetor deste tipo do Milvus, a precisão do valor Float64 perde-se.
Como é que o Milvus lida com os tipos de dados vectoriais e com a precisão?
O Milvus suporta os tipos de vectores Binary, Float32, Float16 e BFloat16.
- Vectores binários: Armazenam dados binários como sequências de 0s e 1s, utilizados no processamento de imagens e na recuperação de informações.
- Vectores Float32: Armazenamento predefinido com uma precisão de cerca de 7 dígitos decimais. Mesmo os valores Float64 são armazenados com a precisão Float32, o que leva a uma potencial perda de precisão aquando da recuperação.
- Vectores Float16 e BFloat16: Oferecem precisão e utilização de memória reduzidas. O Float16 é adequado para aplicações com largura de banda e armazenamento limitados, enquanto o BFloat16 equilibra o alcance e a eficiência, normalmente utilizado na aprendizagem profunda para reduzir os requisitos computacionais sem afetar significativamente a precisão.
O Milvus suporta a especificação de valores padrão para campos escalares ou vetoriais?
Atualmente, o Milvus 2.4.x não suporta a especificação de valores padrão para campos escalares ou vetoriais. Esta funcionalidade está planeada para versões futuras.
O espaço de armazenamento é libertado logo após a eliminação de dados no Milvus?
Não, o espaço de armazenamento não é imediatamente libertado quando se eliminam dados no Milvus. Embora a eliminação de dados marque as entidades como "logicamente eliminadas", o espaço real pode não ser libertado instantaneamente. Eis o porquê:
- Compactação: O Milvus compacta automaticamente os dados em segundo plano. Este processo junta segmentos de dados mais pequenos em segmentos maiores e remove dados logicamente eliminados (entidades marcadas para eliminação) ou dados que tenham excedido o seu Tempo de Vida (TTL). No entanto, a compactação cria novos segmentos enquanto marca os antigos como "abandonados".
- Recolha de lixo: Um processo separado chamado Garbage Collection (GC) remove periodicamente esses segmentos "Dropped", liberando o espaço de armazenamento que eles ocupavam. Isto assegura uma utilização eficiente do armazenamento, mas pode introduzir um ligeiro atraso entre a eliminação e a recuperação de espaço.
Posso ver os dados inseridos, eliminados ou reinseridos imediatamente após a operação sem esperar por uma descarga?
Sim, no Milvus, a visibilidade dos dados não está diretamente ligada às operações de descarga devido à sua arquitetura de desagregação armazenamento-computador. É possível gerenciar a legibilidade dos dados usando níveis de consistência.
Ao selecionar um nível de consistência, considere as compensações entre consistência e desempenho. Para operações que exigem visibilidade imediata, use um nível de consistência "Forte". Para gravações mais rápidas, dê prioridade a uma consistência mais fraca (os dados podem não ser imediatamente visíveis). Para obter mais informações, consulte Consistência.
Depois de ativar a funcionalidade de chave de partição, qual é o valor predefinido de num_partitions
no Milvus e porquê?
Quando a funcionalidade de chave de partição é activada, o valor predefinido de num_partitions
no Milvus é definido como 16
. Esta predefinição é escolhida por motivos de estabilidade e desempenho. Pode ajustar o valor de num_partitions
conforme necessário, especificando-o na função create_collection
.
Existe um limite máximo de comprimento para as expressões de filtragem escalar?
Sim, o comprimento máximo de uma expressão de filtragem escalar é restringido pelo limite de transferência RPC, que é definido no ficheiro de configuração milvus.yaml
. Especificamente, o limite é definido pelo parâmetro serverMaxRecvSize
na secção proxy:
proxy:
grpc:
serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte
Por defeito, o tamanho máximo de cada pedido RPC é de 64 MB. Por conseguinte, o comprimento da expressão de filtragem deve ser inferior a este limite para garantir o êxito do processamento.
Ao efetuar uma pesquisa de vectores em massa, quantos vectores podem ser especificados de uma só vez? Existe um limite?
Sim, o número de vectores que podem ser especificados numa pesquisa de vectores em massa é limitado pelo tamanho da transferência RPC, conforme definido no ficheiro de configuração milvus.yaml
. Este limite é determinado pelo parâmetro serverMaxRecvSize
na secção proxy:
proxy:
grpc:
serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte
Por defeito, o tamanho máximo de cada pedido RPC é de 64MB. Por conseguinte, o tamanho total dos vectores de entrada, incluindo os seus dados dimensionais e metadados, deve ser inferior a este limite para garantir uma execução bem sucedida.
Ainda tem dúvidas?
Pode fazê-lo:
- Verificar o Milvus no GitHub. É bem-vindo para colocar questões, partilhar ideias e ajudar os outros.
- Junte-se à nossa comunidade Slack para obter apoio e envolver-se com a nossa comunidade de código aberto.