Elasticsearch BBQ vs. OpenSearch FAISS: Comparação de desempenho de pesquisa vetorial

Uma comparação de desempenho entre o Elasticsearch BBQ e o OpenSearch FAISS.

Da busca vetorial às poderosas REST APIs, o Elasticsearch oferece aos desenvolvedores o kit de ferramentas de busca mais abrangente. Mergulhe em notebooks de exemplo no GitHub para experimentar algo novo. Você também pode iniciar seu teste gratuito ou executar o Elasticsearch localmente hoje mesmo.

Pesquisa vetorial com quantização binária: Elasticsearch com BBQ é 5x mais rápido que OpenSearch com FAISS. A Elastic recebeu solicitações da nossa comunidade para esclarecer as diferenças de desempenho entre o Elasticsearch e o OpenSearch, particularmente no âmbito da Pesquisa Semântica/Pesquisa Vetorial, por isso conduzimos esses testes de desempenho para fornecer comparações claras e baseadas em dados.

Confronto de quantização binária

Armazenar vetores de alta dimensão em sua forma original pode exigir muita memória. Técnicas de quantização comprimem esses vetores em uma representação compacta, reduzindo drasticamente o consumo de memória. A busca então opera no espaço comprimido, o que reduz a complexidade computacional e torna as buscas mais rápidas, especialmente em grandes conjuntos de dados.

A Elastic está empenhada em fazer do Lucene um mecanismo vetorial de alto desempenho. Introduzimos a Quantização Binária Aprimorada (BBQ) no Elasticsearch 8.16, com base no Lucene, e aprimoramos ainda mais nas versões 8.18 e 9.0. O BBQ é baseado em uma nova abordagem de quantização escalar que reduz as dimensões de ponto flutuante de 32 bits, proporcionando uma redução de memória de aproximadamente 95%, mantendo uma alta qualidade de classificação.

O OpenSearch, por outro lado, usa vários mecanismos de vetores: nmslib (agora obsoleto), Lucene e FAISS. Em um blog anterior, comparamos o Elasticsearch e o OpenSearch para pesquisa vetorial. Usamos três conjuntos de dados diferentes e testamos diferentes combinações de mecanismos e configurações em ambos os produtos.

Este blog se concentra nos algoritmos de quantização binária atualmente disponíveis em ambos os produtos. Testamos o Elasticsearch com BBQ e o OpenSearch com a Quantização Binária do FAISS usando a trilha Rally openai_vector .

O objetivo principal era avaliar o desempenho de ambas as soluções sob o mesmo nível de recall. O que significa recall ? Recall é uma métrica que mede quantos resultados relevantes são recuperados com sucesso por um sistema de pesquisa.

Nesta avaliação, recall@k é particularmente importante, onde k representa o número de resultados principais considerados. Recall@10, Recall@50 e Recall@100 medem, portanto, quantos dos resultados verdadeiramente relevantes aparecem nos 10, 50 e 100 principais itens recuperados, respectivamente. A recordação é expressa em uma escala de 0 a 1 (ou precisão de 0% a 100%). E isso é importante porque estamos falando de KNN Aproximado (ANN) e não de KNN Exato, onde a recordação é sempre 1 (100%).

Para cada valor de k também especificamos n, que é o número de candidatos considerados antes de aplicar a classificação final. Isso significa que para Recall@10, Recall@50 e Recall@100, o sistema primeiro recupera n candidatos usando o algoritmo de quantização binária e depois os classifica para determinar se os k principais resultados contêm os itens relevantes esperados.

Ao controlar n, podemos analisar o trade-off entre eficiência e precisão. Um n mais alto normalmente aumenta a recuperação, pois mais candidatos estão disponíveis para classificação, mas também aumenta a latência e diminui a taxa de transferência. Por outro lado, um n menor acelera a recuperação, mas pode reduzir a recordação se poucos candidatos relevantes forem incluídos no conjunto inicial.

Nesta comparação, o Elasticsearch demonstrou menor latência e maior rendimento que o OpenSearch em configurações idênticas.

Metodologia

A configuração completa, juntamente com os scripts do Terraform, os manifestos do Kubernetes e a trilha Rally específica estão disponíveis neste repositório em openai_vector_bq.

Assim como nos benchmarks anteriores, usamos um cluster Kubernetes composto por:

  • 1 pool de nós para Elasticsearch 9.0 com 3 máquinas e2-standard-32 (128 GB de RAM e 32 CPUs)
  • 1 pool de nós para OpenSearch 2.19 com 3 máquinas e2-standard-32 (128 GB de RAM e 32 CPUs)
  • 1 pool de nós para Rally com 2 máquinas e2-standard-4 (16 GB de RAM e 4 CPUs)

Configuramos um cluster Elasticsearch versão 9.0 e um cluster OpenSearch versão 2.19.

Tanto o Elasticsearch quanto o OpenSearch foram testados com exatamente a mesma configuração: usamos o Rally track openai_vector com algumas modificações , que usa 2,5 milhões de documentos do conjunto de dados NQ enriquecidos com embeddings gerados usando o modelo text-embedding-ada-002 do OpenAI.

Os resultados relatam a latência e a taxa de transferência medidas em diferentes níveis de recall (recall@10, recall@50 e recall@100) usando 8 clientes simultâneos para executar operações de pesquisa. Usamos um único fragmento e nenhuma réplica.

Executamos as seguintes combinações de kn-rescore, por exemplo 10-2000-2000, ou k:10, n:2000 e rescore:2000 recuperariam os k (10) principais sobre n candidatos (2000) aplicando uma rescore sobre 2000 resultados (o que é equivalente a um “fator de sobreamostragem” de 1). Cada pesquisa foi executada 10.000 vezes, com 1.000 pesquisas como aquecimento:

Recall@10

  • 10-40-40
  • 10-50-50
  • 10-100-100
  • 10-200-200
  • 10-500-500
  • 10-750-750
  • 10-1000-1000
  • 10-1500-1500
  • 10-2000-2000

Recall@50

  • 50-150-150
  • 50-200-200
  • 50-250-250
  • 50-500-500
  • 50-750-750
  • 50-1000-1000
  • 50-1200-1200
  • 50-1500-1500
  • 50-2000-2000

Lembre-se @100

  • 100-200-200
  • 100-250-250
  • 100-300-300
  • 100-500-500
  • 100-750-750
  • 100-1000-1000
  • 100-1200-1200
  • 100-1500-1500
  • 100-2000-2000

Para replicar o benchmark, os manifestos do Kubernetes para rally-elasticsearch e rally-opensearch têm todas as variáveis relevantes externalizadas em um ConfigMap, disponível aqui (ES) e aqui (OS). O parâmetro search_ops pode ser personalizado para testar qualquer combinação de k, n e rescore.

Configuração do OpenSearch Rally

/k8s/rally-openai_vector-os-bq.yml

Configuração do índice Opensearch

As variáveis do ConfigMap são então usadas na configuração do índice, alguns parâmetros são deixados inalterados. A quantização de 1 bit no OpenSearch é configurada definindo o nível de compressão como “32x”.

index-vectors-only-mapping-with-docid-mapping.json

Configuração do Elasticsearch Rally

/k8s/rally-openai_vector-es-bq.yml

Configuração do índice do Elasticsearch

index-vectors-only-mapping-with-docid-mapping.json

Resultados

Há várias maneiras de interpretar os resultados. Tanto para latência quanto para taxa de transferência, criamos um gráfico simplificado e detalhado em cada nível de recall. É fácil ver diferenças se considerarmos “quanto maior, melhor” para cada métrica. No entanto, a latência é negativa (quanto menor, melhor), enquanto a taxa de transferência é positiva. Para os gráficos simplificados, usamos (recall / latência) * 10000 (chamado simplesmente de “velocidade”) e recall * throughput, então ambas as métricas significam que mais velocidade e mais throughput são melhores. Vamos lá.

Recall @ 10 - simplificado

Nesse nível de recall, o Elasticsearch BBQ é até 5x mais rápido (3,9x mais rápido em média) e tem 3,2x mais taxa de transferência em média do que o OpenSearch FAISS.

Recall @ 10 - Detalhado

tarefalatência.médiarendimento.médiarecuperação média
Elasticsearch-9.0-BBQ10-100-10011,70513,580,89
Elasticsearch-9.0-BBQ10-1000-10027,33250,550,95
Elasticsearch-9.0-BBQ10-1500-150035,93197,260,95
Elasticsearch-9.0-BBQ10-200-20013,33456,160,92
Elasticsearch-9.0-BBQ10-2000-200044,27161,400,95
Elasticsearch-9.0-BBQ10-40-4010,97539,940,84
Elasticsearch-9.0-BBQ10-50-5011h00535,730,85
Elasticsearch-9.0-BBQ10-500-50019,52341,450,93
Elasticsearch-9.0-BBQ10-750-75022,94295,190,94
OpenSearch-2.19-faiss10-100-10035,59200,610,94
OpenSearch-2.19-faiss10-1000-1000156,8158,300,96
OpenSearch-2.19-faiss10-1500-1500181,7942,970,96
OpenSearch-2.19-faiss10-200-20047,91155,160,95
OpenSearch-2.19-faiss10-2000-2000232,1431,840,96
OpenSearch-2.19-faiss10-40-4027,55249,250,92
OpenSearch-2.19-faiss10-50-5028,78245,140,92
OpenSearch-2.19-faiss10-500-50079,4497,060,96
OpenSearch-2.19-faiss10-750-750104,1975,490,96

Recall @ 50 - simplificado

Nesse nível de recall, o Elasticsearch BBQ é até 5x mais rápido (4,2x mais rápido em média) e tem 3,9x mais rendimento em média do que o OpenSearch FAISS.

Resultados detalhados - Recall @ 50

TarefaMédia de latênciaMédia de rendimentoRecall médio
Elasticsearch-9.0-BBQ50-1000-100025,71246,440,95
Elasticsearch-9.0-BBQ50-1200-120028,81227,850,95
Elasticsearch-9.0-BBQ50-150-15013,43362,900,90
Elasticsearch-9.0-BBQ50-1500-150033,38202,370,95
Elasticsearch-9.0-BBQ50-200-20012,99406,300,91
Elasticsearch-9.0-BBQ50-2000-200042,63163,680,95
Elasticsearch-9.0-BBQ50-250-25014,41373,210,92
Elasticsearch-9.0-BBQ50-500-50017h15341,040,93
Elasticsearch-9.0-BBQ50-750-75031,25248,600,94
OpenSearch-2.19-faiss50-1000-1000125,3562,530,96
OpenSearch-2.19-faiss50-1200-1200143,8754,750,96
OpenSearch-2.19-faiss50-150-15043,64130,010,89
OpenSearch-2.19-faiss50-1500-1500169,4546,350,96
OpenSearch-2.19-faiss50-200-20048,05156,070,91
OpenSearch-2.19-faiss50-2000-2000216,7336,380,96
OpenSearch-2.19-faiss50-250-25053,52142,440,93
OpenSearch-2.19-faiss50-500-50078,9897,820,95
OpenSearch-2.19-faiss50-750-750103,2075,860,96

Recall @ 100

Nesse nível de recall, o Elasticsearch BBQ é até 5x mais rápido (média de 4,6x mais rápido) e tem 3,9x mais taxa de transferência em média do que o OpenSearch FAISS.

Resultados detalhados - Recall @ 100

tarefalatência.médiarendimento.médiarecuperação média
Elasticsearch-9.0-BBQ100-1000-100027,82243,220,95
Elasticsearch-9.0-BBQ100-1200-120031.14224.040,95
Elasticsearch-9.0-BBQ100-1500-150035,98193,990,95
Elasticsearch-9.0-BBQ100-200-20014.18403,860,88
Elasticsearch-9.0-BBQ100-2000-200045,36159,880,95
Elasticsearch-9.0-BBQ100-250-25014,77433,060,90
Elasticsearch-9.0-BBQ100-300-30014,61375,540,91
Elasticsearch-9.0-BBQ100-500-50018,88340,370,93
Elasticsearch-9.0-BBQ100-750-75023,59285,790,94
OpenSearch-2.19-faiss100-1000-1000142,9058,480,95
OpenSearch-2.19-faiss100-1200-1200153,0351,040,95
OpenSearch-2.19-faiss100-1500-1500181,7943,200,96
OpenSearch-2.19-faiss100-200-20050,94131,620,83
OpenSearch-2.19-faiss100-2000-2000232,5333,670,96
OpenSearch-2.19-faiss100-250-25057,08131,230,87
OpenSearch-2.19-faiss100-300-30062,76120,100,89
OpenSearch-2.19-faiss100-500-50084,3691,540,93
OpenSearch-2.19-faiss100-750-750111,3369,950,94

Melhorias no churrasco

BBQ percorreu um longo caminho desde seu primeiro lançamento. No Elasticsearch 8.16, para fins de comparação, incluímos uma execução de benchmark da versão 8.16 junto com a atual, e podemos ver como a recuperação e a latência melhoraram desde então.

No Elasticsearch 8.18 e 9.0, reescrevemos o algoritmo principal para quantizar os vetores. Então, embora o BBQ na versão 8.16 fosse bom, as versões mais recentes são ainda melhores. Você pode ler sobre isso aqui e aqui. Em resumo, cada vetor é quantizado individualmente por meio de quantis escalares otimizados. Como resultado, os usuários se beneficiam de maior precisão na pesquisa de vetores sem comprometer o desempenho, tornando a recuperação de vetores do Elasticsearch ainda mais poderosa.

Conclusão

Nesta comparação de desempenho entre o Elasticsearch BBQ e o OpenSearch FAISS, o Elasticsearch supera significativamente o OpenSearch para pesquisa vetorial, alcançando velocidades de consulta até 5x mais rápidas e uma taxa de transferência 3,9x maior, em média, em vários níveis de recuperação.

As principais descobertas incluem:

  • Recall@10: O Elasticsearch BBQ é até 5x mais rápido (3,9x mais rápido em média) e tem 3,2x mais taxa de transferência em média em comparação ao OpenSearch FAISS.
  • Recall@50: O Elasticsearch BBQ é até 5x mais rápido (4,2x mais rápido em média) e tem 3,9x mais taxa de transferência em média em comparação ao OpenSearch FAISS.
  • Recall@100: O Elasticsearch BBQ é até 5x mais rápido (4,6x mais rápido em média) e tem 3,9x mais taxa de transferência em média em comparação ao OpenSearch FAISS.

Esses resultados destacam as vantagens de eficiência e desempenho do Elasticsearch BBQ, particularmente em cenários de pesquisa vetorial de alta dimensão. A técnica Better Binary Quantization (BBQ), introduzida no Elasticsearch 8.16, proporciona redução substancial de memória (~95%) enquanto mantém alta qualidade de classificação, tornando-a uma escolha superior para aplicações de pesquisa vetorial em larga escala.

Na Elastic, estamos inovando incansavelmente para melhorar o Apache Lucene e o Elasticsearch para fornecer o melhor banco de dados vetorial para casos de uso de pesquisa e recuperação, incluindo RAG (Retrieval Augmented Generation). Nossos avanços recentes aumentaram drasticamente o desempenho, tornando a pesquisa vetorial mais rápida e mais eficiente em termos de espaço do que antes, aproveitando os ganhos do Lucene 10. Este blog é outra ilustração dessa inovação.

Conteúdo relacionado

Pronto para criar buscas de última geração?

Uma pesquisa suficientemente avançada não se consegue apenas com o esforço de uma só pessoa. O Elasticsearch é impulsionado por cientistas de dados, especialistas em operações de aprendizado de máquina, engenheiros e muitos outros que são tão apaixonados por buscas quanto você. Vamos nos conectar e trabalhar juntos para construir a experiência de busca mágica que lhe trará os resultados desejados.

Experimente você mesmo(a)