Knowhere
Este tópico apresenta o Knowhere, o mecanismo de execução vetorial principal do Milvus.
Visão geral
O Knowhere é o principal mecanismo de execução de vetores do Milvus, que incorpora várias bibliotecas de pesquisa de similaridade de vetores, 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
A camada mais baixa é o hardware do sistema. Acima dela estão as bibliotecas de índice de terceiros. Na camada superior, o Knowhere interage com o nó de índice e o nó de consulta 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 em relação ao 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 construção e consulta de índices 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.
DataObj
Classe 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()
.
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 eFaissBaseBinaryIndex
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
: pesquisa de força bruta
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 efectuadas 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
FIV
Os índices IVF (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. Um 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 índices binários é relativamente mais simples. BinaryIDMAP
e BinaryIVF
são derivados de FaissBaseBinaryIndex
e VecIndex
.
Índices de terceiros
índices de terceiros
Atualmente, só são suportados dois tipos de índices de terceiros para além do Faiss: o índice baseado em árvores Annoy
e o í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 fazer referência ao índice existente, pode seguir os passos abaixo para adicionar um novo índice ao Knowhere.
Adicione o nome do novo índice em
IndexEnum
. O tipo de dados é uma cadeia de caracteres.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.Crie um novo ficheiro para o novo índice. A classe de base do novo índice deve incluir
VecIndex
, e a interface virtual necessária deVecIndex
.Adicione a lógica de construção do índice para o novo índice em
VecIndexFactory::CreateVecIndex()
.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:
Aprender sobre os vários tipos de índices que o Milvus suporta.
Aprender sobre o mecanismo de bitset.
Compreender como os dados são processados no Milvus.