milvus-logo
LFAI
Home
  • Conceitos

Knowhere

Este tópico apresenta o Knowhere, o mecanismo de execução vetorial principal do Milvus.

Visão geral

O Knowhere é o principal motor de execução de vectores do Milvus que incorpora várias bibliotecas de pesquisa de semelhanças vectoriais, incluindo Faiss, Hnswlib e Annoy. O Knowhere foi também concebido para suportar a computação heterogénea. Controla em que hardware (CPU ou GPU) executar a criação de índices e os pedidos de pesquisa. É assim que o Knowhere recebe o seu nome - saber onde executar as operações. Mais tipos de hardware, incluindo DPU e TPU, serão suportados em versões futuras.

Knowhere na arquitetura Milvus

A figura abaixo ilustra a posição do Knowhere na arquitetura Milvus.

Knowhere Knowhere

A camada mais baixa é o hardware do sistema. As bibliotecas de índice de terceiros estão na parte superior do hardware. Em seguida, o Knowhere interage com o nó de índice e o nó de consulta na parte superior por meio do CGO, que permite que os pacotes Go chamem o código C.

Vantagens do Knowhere

A seguir estão as vantagens do Knowhere sobre o Faiss.

Suporte para BitsetView

Milvus introduz um mecanismo de bitset para realizar a "eliminação suave". Um vetor apagado suavemente continua a existir na base de dados, mas não será computado durante uma pesquisa ou consulta de semelhança de vectores.

Cada bit num conjunto de bits corresponde a um vetor indexado. Se um vetor estiver marcado como "1" no conjunto de bits, significa que esse vetor foi eliminado de forma suave e não será envolvido durante uma pesquisa de vectores. O parâmetro bitset é aplicado a todas as APIs de consulta de índice Faiss expostas no Knowhere, incluindo índices de CPU e GPU.

Para obter mais informações sobre o mecanismo de bitset, consulte bitset.

Suporte a várias métricas de similaridade para indexação de vetores binários

O Knowhere oferece suporte a Hamming, Jaccard, Tanimoto, Superestrutura e Subestrutura. Jaccard e Tanimoto podem ser usados para medir a similaridade entre dois conjuntos de amostras, enquanto Superestrutura e Subestrutura podem ser usados para medir a similaridade de estruturas químicas.

Suporte para o conjunto de instruções AVX512

Para além do AArch64, do SSE4.2 e do AVX2, os conjuntos de instruções já suportados pelo Faiss, o Knowhere também suporta o AVX512, que pode melhorar o desempenho da criação de índices e da consulta em 20% a 30% em comparação com o AVX2.

Seleção automática de instruções SIMD

O Knowhere suporta a invocação automática das instruções SIMD adequadas (por exemplo, SIMD SSE, AVX, AVX2 e AVX512) em qualquer processador de CPU (plataformas locais e em nuvem), para que os usuários não precisem especificar manualmente o sinalizador SIMD (por exemplo, "-msse4") durante a compilação.

O Knowhere é construído refatorando a base de código do Faiss. As funções comuns (por exemplo, cálculo de semelhanças) que dependem de acelerações SIMD são eliminadas. Em seguida, para cada função, são implementadas quatro versões (ou seja, SSE, AVX, AVX2, AVX512) e cada uma é colocada num ficheiro fonte separado. Em seguida, os ficheiros de origem são compilados individualmente com o sinalizador SIMD correspondente. Portanto, em tempo de execução, o Knowhere pode escolher automaticamente as instruções SIMD mais adequadas com base nos sinalizadores atuais da CPU e, em seguida, vincular os ponteiros de função corretos usando hooking.

Outras otimizações de desempenho

Leia Milvus: um sistema de gerenciamento de dados vetoriais criado para fins específicos para obter mais informações sobre a otimização de desempenho do Knowhere.

Estrutura de código do Knowhere

A computação em Milvus envolve principalmente operações vetoriais e escalares. O Knowhere só lida com as operações de indexação de vectores.

Um índice é uma estrutura de dados independente dos dados vectoriais originais. Geralmente, a indexação requer quatro passos: criar um índice, treinar dados, inserir dados e construir um índice. Em algumas aplicações de IA, a formação de conjuntos de dados é separada da pesquisa de vectores. Os dados dos conjuntos de dados são primeiro treinados e depois inseridos numa base de dados vetorial como o Milvus para pesquisa de semelhanças. Por exemplo, os conjuntos de dados abertos sift1M e sift1B diferenciam os dados para formação dos dados para teste.

No entanto, no Knowhere, os dados para treino e para pesquisa são os mesmos. O Knowhere treina todos os dados de um segmento e, em seguida, insere todos os dados treinados e cria um índice para eles.

DataObjClasse de base

DataObj é a classe de base de todas as estruturas de dados em Knowhere. Size() é o único método virtual em DataObj. A classe Index herda de DataObj com um campo denominado "size_". A classe Index também tem dois métodos virtuais - Serialize() e Load(). A classe VecIndex derivada de Index é a classe de base virtual para todos os índices vectoriais. VecIndex fornece métodos que incluem Train(), Query(), GetStatistics() e ClearStatistics().

base class classe de base

Alguns outros tipos de índices estão listados à direita na figura acima.

  • O índice Faiss tem duas classes de base: FaissBaseIndex para todos os índices em vectores de ponto flutuante e FaissBaseBinaryIndex para todos os índices em vectores binários.

  • GPUIndex é a classe de base para todos os índices Faiss GPU.

  • OffsetBaseIndex é a classe de base para todos os índices auto-desenvolvidos. Dado que apenas os IDs dos vectores são armazenados num ficheiro de índice, o tamanho do ficheiro para vectores de 128 dimensões pode ser reduzido em 2 ordens de grandeza.

IDMAP IDMAP

Em termos técnicos, IDMAP não é um índice, mas sim utilizado para pesquisa de força bruta. Quando os vectores são inseridos na base de dados, não é necessário treinar os dados nem construir um índice. As pesquisas serão realizadas diretamente nos dados vectoriais inseridos.

No entanto, por uma questão de coerência de código, IDMAP também herda a classe VecIndex com todas as suas interfaces virtuais. A utilização de IDMAP é idêntica à dos outros índices.

Índices IVF

IVF FIV

Os índices IVF (inverted file - ficheiro invertido) são os mais frequentemente utilizados. A classe IVF é derivada de VecIndex e FaissBaseIndex, e estende-se a IVFSQ e IVFPQ. GPUIVF é derivada de GPUIndex e IVF. Depois, GPUIVF estende-se a GPUIVFSQ e GPUIVFPQ.

IVFSQHybrid é um índice híbrido desenvolvido pelo próprio utilizador. O quantizador grosseiro é executado na GPU enquanto a pesquisa no balde é efectuada na CPU. Este tipo de índice pode reduzir a ocorrência de cópias de memória entre a CPU e a GPU, tirando partido do poder de computação da GPU. IVFSQHybrid tem a mesma taxa de recuperação que GPUIVFSQ, mas apresenta um melhor desempenho.

A estrutura da classe de base para os índices binários é relativamente mais simples. BinaryIDMAP e BinaryIVF são derivados de FaissBaseBinaryIndex e VecIndex.

Índices de terceiros

third-party indexes índices de terceiros

Atualmente, só são suportados dois tipos de índices de terceiros para além do Faiss: índice baseado em árvores Annoy e índice baseado em gráficos HNSW. Estes dois índices de terceiros comuns e frequentemente utilizados são ambos derivados de VecIndex.

Adicionar índices ao Knowhere

Se pretender adicionar novos índices ao Knowhere, pode começar por consultar os índices existentes:

  • Para adicionar índices baseados em quantização, consulte IVF_FLAT.

  • Para adicionar índices baseados em gráficos, consulte HNSW.

  • Para adicionar índices baseados em árvores, consulte Annoy.

Depois de consultar o índice existente, pode seguir os passos abaixo para adicionar um novo índice a Knowhere.

  1. Adicione o nome do novo índice em IndexEnum. O tipo de dados é string.

  2. Adicione uma verificação de validação de dados ao novo índice no ficheiro ConfAdapter.cpp. A verificação de validação destina-se principalmente a validar os parâmetros de formação e consulta de dados.

  3. Crie um novo ficheiro para o novo índice. A classe de base do novo índice deve incluir VecIndex, e a interface virtual necessária de VecIndex.

  4. Adicione a lógica de construção do índice para o novo índice em VecIndexFactory::CreateVecIndex().

  5. Adicione o teste de unidade no diretório unittest.

O que se segue

Depois de aprender como o Knowhere funciona em Milvus, poderá também querer:

Traduzido porDeepLogo

Try Zilliz Cloud for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

Esta página foi útil?