Aceleração da pesquisa por semelhança em dados realmente grandes com indexação de vectores
Da visão computacional à descoberta de novos medicamentos, os mecanismos de pesquisa de similaridade de vetores alimentam muitas aplicações populares de inteligência artificial (IA). Um grande componente do que torna possível consultar com eficiência os conjuntos de dados de milhões, bilhões ou até trilhões de vetores dos quais os mecanismos de pesquisa de similaridade dependem é a indexação, um processo de organização de dados que acelera drasticamente a pesquisa de Big Data. Este artigo aborda o papel que a indexação desempenha na eficiência da pesquisa de similaridade de vectores, os diferentes tipos de índices de ficheiros invertidos de vectores (IVF) e conselhos sobre qual o índice a utilizar em diferentes cenários.
Ir para:
- Acelerando a pesquisa de similaridade em dados realmente grandes com indexação de vetor
- Como é que a indexação de vectores acelera a pesquisa por semelhança e a aprendizagem automática?
- Quais são os diferentes tipos de índices IVF e para que cenários são mais adequados?
- FLAT: Bom para pesquisar conjuntos de dados relativamente pequenos (à escala de um milhão) quando é necessária uma recuperação de 100%.
- IVF_FLAT: Melhora a velocidade em detrimento da precisão (e vice-versa).
- IVF_SQ8: Mais rápido e com menos consumo de recursos do que o IVF_FLAT, mas também menos preciso.
- IVF_SQ8H: nova abordagem híbrida GPU/CPU que é ainda mais rápida que o IVF_SQ8.
- Saiba mais sobre o Milvus, uma plataforma de gerenciamento de dados vetoriais em grande escala.
- Metodologia
Como é que a indexação vetorial acelera a pesquisa por semelhança e a aprendizagem automática?
Os motores de pesquisa de semelhanças funcionam comparando uma entrada com uma base de dados para encontrar objectos que sejam mais semelhantes à entrada. A indexação é o processo de organização eficiente de dados e desempenha um papel importante na utilidade da pesquisa por similaridade, acelerando drasticamente as consultas demoradas em grandes conjuntos de dados. Depois de um enorme conjunto de dados vectoriais 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. Na prática, isto significa que um certo grau de precisão é sacrificado para acelerar as consultas em dados vectoriais realmente grandes.
Pode ser feita uma analogia com um dicionário, onde as palavras são ordenadas alfabeticamente. Ao procurar uma palavra, é possível navegar rapidamente para uma secção que contém apenas palavras com a mesma inicial - acelerando drasticamente a procura da definição da palavra introduzida.
Quais são os diferentes tipos de índices de FIV e para que cenários são mais adequados?
Existem vários índices concebidos para a pesquisa de semelhança de vectores de alta dimensão, e cada um deles tem desvantagens em termos de desempenho, precisão e requisitos de armazenamento. Este artigo aborda vários tipos de índices FIV comuns, seus pontos fortes e fracos, bem como resultados de testes de desempenho para cada tipo de índice. Os testes de desempenho quantificam o tempo de consulta e as taxas de recuperação para cada tipo de índice no Milvus, uma plataforma de gestão de dados vectoriais de código aberto. Para mais informações sobre o ambiente de teste, consulte a secção de metodologia no final deste artigo.
FLAT: Bom para pesquisar conjuntos de dados relativamente pequenos (escala de milhões) quando é necessária uma recuperação de 100%.
Para aplicações de pesquisa de similaridade de vectores que requerem uma precisão perfeita e dependem de conjuntos de dados relativamente pequenos (à escala de um milhão), o índice FLAT é uma boa escolha. O FLAT não comprime vectores e é o único índice que pode garantir resultados de pesquisa exactos. Os resultados do FLAT também podem ser usados como um ponto de comparação para resultados produzidos por outros índices que têm menos de 100% de recuperação.
O FLAT é exato porque adopta uma abordagem exaustiva à pesquisa, o que significa que, para cada consulta, a entrada de destino é comparada com todos os vectores de um conjunto de dados. Isso torna o FLAT o índice mais lento da nossa lista e pouco adequado para consultar dados vetoriais maciços. Não há parâmetros para o índice FLAT no Milvus, e usá-lo não requer treinamento de dados ou armazenamento adicional.
Resultados do teste de desempenho do FLAT:
O teste de desempenho do tempo de consulta FLAT foi realizado em Milvus usando um conjunto de dados composto por 2 milhões de vetores de 128 dimensões.
Blog_Acelerando a pesquisa de similaridade em dados realmente grandes com indexação de vetor_2.png
Principais conclusões:
- À medida que nq (o número de vetores de destino para uma consulta) aumenta, o tempo de consulta aumenta.
- Usando o índice FLAT em Milvus, podemos ver que o tempo de consulta aumenta acentuadamente quando nq excede 200.
- Em geral, o índice FLAT é mais rápido e mais consistente ao executar o Milvus na GPU em comparação com a CPU. No entanto, as consultas FLAT na CPU são mais rápidas quando nq está abaixo de 20.
IVF_FLAT: Melhora a velocidade à custa da precisão (e vice-versa).
Uma forma comum de acelerar o processo de pesquisa de similaridade em detrimento da precisão é realizar uma pesquisa de vizinho mais próximo aproximado (ANN). Os algoritmos ANN reduzem os requisitos de armazenamento e a carga de cálculo agrupando vectores semelhantes, o que resulta numa pesquisa de vectores mais rápida. O IVF_FLAT é o tipo de índice de ficheiro invertido mais básico e baseia-se numa forma de pesquisa ANN.
O IVF_FLAT divide os dados vetoriais em um número de unidades de cluster (nlist) e, em seguida, compara as distâncias entre o vetor de entrada de destino e o centro de cada cluster. Dependendo do número de clusters que o sistema está definido para consultar (nprobe), os resultados da pesquisa de semelhança são devolvidos com base em comparações entre a entrada de destino e os vectores apenas no(s) cluster(s) mais semelhante(s) - reduzindo drasticamente o tempo de consulta.
Ao ajustar nprobe, é possível encontrar um equilíbrio ideal entre precisão e velocidade para um determinado cenário. Os resultados do nosso teste de desempenho IVF_FLAT demonstram que o tempo de consulta aumenta drasticamente à medida que o número de vectores de entrada alvo (nq) e o número de clusters a pesquisar (nprobe) aumentam. O IVF_FLAT não comprime os dados vectoriais; no entanto, os ficheiros de índice incluem metadados que aumentam marginalmente os requisitos de armazenamento em comparação com o conjunto de dados vectoriais brutos não indexados.
Resultados do teste de desempenho do IVF_FLAT:
O teste de desempenho do tempo de consulta do IVF_FLAT foi realizado no Milvus utilizando o conjunto de dados SIFT 1B público, que contém mil milhões de vectores de 128 dimensões.
Blog_Acelerando a pesquisa de similaridade em dados realmente grandes com indexação de vetor_3.png
Principais conclusões:
- Ao executar na CPU, o tempo de consulta para o índice IVF_FLAT no Milvus aumenta com nprobe e nq. Isso significa que quanto mais vetores de entrada uma consulta contiver, ou quanto mais clusters uma consulta pesquisar, maior será o tempo de consulta.
- Na GPU, o índice mostra menos variação de tempo em relação às alterações em nq e nprobe. Isso ocorre porque os dados do índice são grandes, e a cópia de dados da memória da CPU para a memória da GPU é responsável pela maior parte do tempo total da consulta.
- Em todos os cenários, exceto quando nq = 1.000 e nprobe = 32, o índice IVF_FLAT é mais eficiente quando executado na CPU.
O teste de desempenho de recuperação do IVF_FLAT foi realizado no Milvus utilizando o conjunto de dados público 1M SIFT, que contém 1 milhão de vectores de 128 dimensões, e o conjunto de dados glove-200-angular, que contém mais de 1 milhão de vectores de 200 dimensões, para a construção do índice (nlist = 16 384).
Blog_Acelerando a pesquisa de similaridade em dados realmente grandes com indexação de vetores_4.png
Principais conclusões:
- O índice IVF_FLAT pode ser otimizado para precisão, alcançando uma taxa de recuperação acima de 0,99 no conjunto de dados SIFT de 1M quando nprobe = 256.
IVF_SQ8: Mais rápido e com menos consumo de recursos do que o IVF_FLAT, mas também menos preciso.
O IVF_FLAT não executa qualquer compressão, pelo que os ficheiros de índice que produz têm aproximadamente o mesmo tamanho que os dados vectoriais originais não indexados. Por exemplo, se o conjunto de dados 1B SIFT original tiver 476 GB, os seus ficheiros de índice IVF_FLAT serão ligeiramente maiores (~470 GB). Carregar todos os ficheiros de índice na memória consumirá 470 GB de armazenamento.
Quando os recursos de memória do disco, CPU ou GPU são limitados, o IVF_SQ8 é uma opção melhor do que o IVF_FLAT. Este tipo de índice pode converter cada FLOAT (4 bytes) em UINT8 (1 byte) efectuando a quantização escalar. Isto reduz o consumo de memória do disco, CPU e GPU em 70-75%. Para o conjunto de dados 1B SIFT, os ficheiros de índice IVF_SQ8 requerem apenas 140 GB de armazenamento.
Resultados do teste de desempenho do IVF_SQ8:
O teste do tempo de consulta do IVF_SQ8 foi realizado no Milvus utilizando o conjunto de dados público 1B SIFT, que contém mil milhões de vectores de 128 dimensões, para a criação de índices.
Blog_Acelerando a pesquisa de similaridade em dados realmente grandes com indexação de vetor_5.png
Principais conclusões:
- Ao reduzir o tamanho do arquivo de índice, o IVF_SQ8 oferece melhorias significativas de desempenho em relação ao IVF_FLAT. O IVF_SQ8 segue uma curva de desempenho semelhante ao IVF_FLAT, com o tempo de consulta aumentando com nq e nprobe.
- Semelhante ao IVF_FLAT, o IVF_SQ8 apresenta um desempenho mais rápido quando executado na CPU e quando nq e nprobe são menores.
O teste de desempenho de rechamada do IVF_SQ8 foi realizado no Milvus usando o conjunto de dados público 1M SIFT, que contém 1 milhão de vetores de 128 dimensões, e o conjunto de dados glove-200-angular, que contém mais de 1 milhão de vetores de 200 dimensões, para a construção do índice (nlist = 16.384).
Blog_Acelerando a pesquisa de similaridade em dados realmente grandes com indexação de vetores_6.png
Principais conclusões:
- Apesar de compactar os dados originais, o IVF_SQ8 não vê uma diminuição significativa na precisão da consulta. Em várias configurações do nprobe, o IVF_SQ8 tem, no máximo, uma taxa de recuperação 1% menor do que o IVF_FLAT.
IVF_SQ8H: Nova abordagem híbrida GPU/CPU que é ainda mais rápida que o IVF_SQ8.
O IVF_SQ8H é um novo tipo de índice que melhora o desempenho da consulta em comparação com o IVF_SQ8. Quando um índice IVF_SQ8 em execução na CPU é consultado, a maior parte do tempo total da consulta é gasto para encontrar os clusters nprobe mais próximos do vetor de entrada de destino. Para reduzir o tempo de consulta, o IVF_SQ8 copia os dados para operações de quantização grosseira, que são mais pequenos do que os ficheiros de índice, para a memória da GPU - acelerando consideravelmente as operações de quantização grosseira. Em seguida, o gpu_search_threshold determina qual o dispositivo que executa a consulta. Quando nq >= gpu_search_threshold, a GPU executa a consulta; caso contrário, a CPU executa a consulta.
IVF_SQ8H é um tipo de índice híbrido que requer que a CPU e a GPU trabalhem em conjunto. Ele só pode ser usado com o Milvus habilitado para GPU.
Resultados do teste de desempenho do IVF_SQ8H:
O teste de desempenho do tempo de consulta IVF_SQ8H foi realizado no Milvus usando o conjunto de dados SIFT 1B público, que contém 1 bilhão de vetores de 128 dimensões, para a criação do índice.
Blog_Acelerando a pesquisa de similaridade em dados realmente grandes com indexação de vetor_7.png
Principais conclusões:
- Quando nq é menor ou igual a 1.000, o IVF_SQ8H apresenta tempos de consulta quase duas vezes mais rápidos que o IVFSQ8.
- Quando nq = 2000, os tempos de consulta para IVFSQ8H e IVF_SQ8 são os mesmos. No entanto, se o parâmetro gpu_search_threshold for menor que 2000, o IVF_SQ8H terá um desempenho melhor que o IVF_SQ8.
- A taxa de recuperação de consulta do IVF_SQ8H é idêntica à do IVF_SQ8, o que significa que é obtido menos tempo de consulta sem perda na precisão da pesquisa.
Saiba mais sobre o Milvus, uma plataforma de gestão de dados vectoriais em grande escala.
O Milvus é uma plataforma de gerenciamento de dados vetoriais que pode potencializar aplicativos de pesquisa de similaridade em campos que abrangem inteligência artificial, aprendizado profundo, cálculos vetoriais tradicionais e muito mais. Para obter informações adicionais sobre o Milvus, consulte os seguintes recursos:
- O Milvus está disponível sob uma licença de código aberto no GitHub.
- Tipos de índices adicionais, incluindo índices baseados em gráficos e árvores, são compatíveis com o Milvus. Para obter uma lista abrangente dos tipos de índice suportados, consulte a documentação para índices vetoriais no Milvus.
- Para saber mais sobre a empresa que lançou o Milvus, visite Zilliz.com.
- Converse com a comunidade Milvus ou obtenha ajuda com um problema no Slack.
Metodologia
Ambiente de teste de desempenho
A configuração do servidor usada nos testes de desempenho mencionados neste artigo é a seguinte:
- Intel ® Xeon ® Platinum 8163 @ 2.50GHz, 24 núcleos
- GeForce GTX 2080Ti x 4
- 768 GB de memória
Conceitos técnicos relevantes
Embora não seja necessário para entender este artigo, aqui estão alguns conceitos técnicos que são úteis para interpretar os resultados dos nossos testes de desempenho de índice:
Blog_Acelerando a pesquisa de similaridade em dados realmente grandes com indexação vetorial_8.png
Recursos
As seguintes fontes foram usadas para este artigo:
- "Encyclopedia of database systems", Ling Liu e M. Tamer Özsu.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word