Visão geral do índice GPU
A criação de um índice com suporte de GPU no Milvus pode melhorar significativamente o desempenho da pesquisa em cenários de alta taxa de transferência e alta recuperação.
A figura a seguir compara a taxa de transferência de consultas (consultas por segundo) entre configurações de índice, configurações de hardware, conjuntos de dados vetoriais (Cohere e OpenAI) e tamanhos de lote de pesquisa, mostrando que GPU_CAGRA supera consistentemente outros métodos.
Desempenho do índice de GPU
Configurar pool de memória GPU para Milvus
O Milvus suporta um pool de memória GPU global e fornece dois parâmetros de configuração, initMemSize e maxMemSize, no arquivo de configuração do Milvus.
gpu:
initMemSize: 0 # set the initial memory pool size.
maxMemSize: 0 # sets the maximum memory usage limit. When the memory usage exceeds initMemSize, Milvus will attempt to expand the memory pool.
O padrão initMemSize é geralmente metade da memória da GPU quando o Milvus é iniciado, e maxMemSize é o padrão para toda a memória da GPU. O tamanho do pool de memória da GPU é inicialmente definido como initMemSize e será automaticamente expandido para maxMemSize conforme necessário.
Quando um índice habilitado para GPU é especificado, o Milvus carrega os dados da coleção de destino na memória da GPU antes das pesquisas, então maxMemSize deve ser pelo menos o tamanho dos dados.
Limites
Para
GPU_IVF_FLAT, o valor máximo paralimité 1.024.Para
GPU_IVF_PQeGPU_CAGRA, o valor máximo paralimité 1.024.Embora não exista um valor definido para
limitparaGPU_BRUTE_FORCE, recomenda-se que não exceda 4.096 para evitar potenciais problemas de desempenho.Atualmente, os índices GPU não suportam a distância
COSINE. Se a distânciaCOSINEfor necessária, os dados devem ser normalizados primeiro e, em seguida, a distância do produto interno (IP) pode ser usada como um substituto.A proteção OOM de carregamento para índices GPU não é totalmente suportada, demasiados dados podem levar a falhas no QueryNode.
Os índices GPU não suportam funções de pesquisa como pesquisa de intervalo e pesquisa de agrupamento.
Tipos de índices GPU suportados
A tabela seguinte lista os tipos de índices GPU suportados pelo Milvus.
Tipo de índice |
Descrição |
Utilização de memória |
|---|---|---|
GPU_CAGRA é um índice baseado em gráficos optimizado para GPUs. A utilização de GPUs de grau de inferência para executar a versão GPU do Milvus pode ser mais rentável em comparação com a utilização de GPUs de grau de treino dispendiosas. |
A utilização da memória é aproximadamente 1,8 vezes superior à dos dados vectoriais originais. |
|
GPU_IVF_FLAT é o índice IVF mais básico, e os dados codificados armazenados em cada unidade são consistentes com os dados originais. Ao realizar pesquisas, observe que é possível definir o top-k ( |
Requer memória igual ao tamanho dos dados originais. |
|
GPU_IVF_PQ executa o agrupamento de índices IVF antes de quantizar o produto de vetores. Ao realizar pesquisas, observe que é possível definir o top-k ( |
Utiliza um espaço de memória menor, que depende das configurações dos parâmetros de compressão. |
|
O GPU_BRUTE_FORCE é adaptado para casos em que é crucial uma recuperação extremamente elevada, garantindo uma recuperação de 1 ao comparar cada consulta com todos os vectores no conjunto de dados. Requer apenas o tipo de métrica ( |
Requer memória igual ao tamanho dos dados originais. |
Configurar as definições do Milvus para controlo da memória da GPU
O Milvus usa um pool de memória gráfica global para alocar a memória da GPU. Ele suporta dois parâmetros initMemSize e maxMemSize no arquivo de configuração do Milvus. O tamanho do pool é inicialmente definido como initMemSize, e será automaticamente expandido para maxMemSize após exceder este limite.
O padrão initMemSize é 1/2 da memória da GPU disponível quando o Milvus inicia, e o padrão maxMemSize é igual a toda a memória da GPU disponível.
Até o Milvus 2.4.1, o Milvus usa um pool de memória GPU unificado. Para versões anteriores à 2.4.1, era recomendado definir ambos os valores como 0.
gpu:
initMemSize: 0 #set the initial memory pool size.
maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool.
Do Milvus 2.4.1 em diante, o pool de memória da GPU é usado apenas para dados temporários da GPU durante as pesquisas. Portanto, é recomendável defini-lo como 2048 e 4096.
gpu:
initMemSize: 2048 #set the initial memory pool size.
maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool.
Para saber como construir um índice GPU, consulte o guia específico para cada tipo de índice.
PERGUNTAS FREQUENTES
Quando é apropriado utilizar um índice de GPU?
Um índice de GPU é particularmente benéfico em situações que exigem alta taxa de transferência ou alta recuperação. Por exemplo, ao lidar com grandes lotes, a taxa de transferência da indexação GPU pode superar a da indexação CPU em até 100 vezes. Em cenários com lotes menores, os índices de GPU ainda superam significativamente os índices de CPU em termos de desempenho. Além disso, se houver um requisito de inserção rápida de dados, a incorporação de uma GPU pode acelerar substancialmente o processo de criação de índices.
Em que cenários são mais adequados os índices GPU como GPU_CAGRA, GPU_IVF_PQ, GPU_IVF_FLAT e GPU_BRUTE_FORCE?
GPU_CAGRAOs índices GPU são ideais para cenários que exigem um desempenho melhorado, embora à custa do consumo de mais memória. Para ambientes em que a conservação da memória é uma prioridade, o índiceGPU_IVF_PQpode ajudar a minimizar os requisitos de armazenamento, embora isso implique uma maior perda de precisão. O índiceGPU_IVF_FLATserve como uma opção equilibrada, oferecendo um compromisso entre desempenho e utilização de memória. Por último, o índiceGPU_BRUTE_FORCEfoi concebido para operações de pesquisa exaustiva, garantindo uma taxa de recuperação de 1 ao efetuar pesquisas transversais.