Armazenamento de Dados com MMap
No Milvus, os ficheiros mapeados na memória permitem o mapeamento direto do conteúdo dos ficheiros na memória. Este recurso aumenta a eficiência da memória, particularmente em situações em que a memória disponível é escassa, mas o carregamento completo de dados é inviável. Este mecanismo de otimização pode aumentar a capacidade dos dados, garantindo o desempenho até um determinado limite; no entanto, quando a quantidade de dados excede demasiado a memória, o desempenho da pesquisa e da consulta pode sofrer uma degradação grave, pelo que deve optar por ativar ou desativar esta funcionalidade, conforme apropriado.
Configurar o mapeamento de memória
A partir do Milvus 2.4, tem a flexibilidade de ajustar o ficheiro de configuração estática para configurar as definições de mapeamento de memória predefinidas para todo o cluster antes da implementação. Além disso, há a opção de alterar dinamicamente os parâmetros para ajustar as configurações de mapeamento de memória nos níveis do cluster e do índice. No futuro, as futuras actualizações alargarão as capacidades de mapeamento de memória para incluir configurações ao nível do campo.
Antes da implantação do cluster: configuração global
Antes de implementar um cluster, as definições ao nível do cluster aplicam o mapeamento de memória em todo o cluster. Isto assegura que todos os novos objectos irão aderir automaticamente a estas configurações. É importante notar que a modificação destas definições requer um reinício do cluster para se tornar efectiva.
Para ajustar as definições de mapeamento de memória do cluster, edite o ficheiro configs/milvus.yaml
. Nesse arquivo, é possível especificar se o mapeamento de memória deve ser ativado por padrão e determinar o caminho do diretório para armazenar arquivos mapeados pela memória. Se o caminho (mmapDirPath
) for deixado sem especificação, o sistema predefine o armazenamento de ficheiros mapeados pela memória em {localStorage.path}/mmap
. Para obter mais informações, consulte Configurações relacionadas ao armazenamento local.
# This parameter was set in configs/milvus.yaml
...
queryNode:
mmap:
# Set memory mapping property for whole cluster
mmapEnabled: false | true
# Set memory-mapped directory path, if you leave mmapDirPath unspecified, the memory-mapped files will be stored in {localStorage.path}/ mmap by default.
mmapDirPath: any/valid/path
....
Após 2.4.10
, a configuração queryNode.mmap.mmapEnabled
divide-se em quatro campos separados abaixo, e todas as predefinições são false
:
queryNode.mmap.vectorField
controla se os dados do vetor são mmap;queryNode.mmap.vectorIndex
controla se o índice do vetor é mmap;queryNode.mmap.scalarField
controla se os dados escalares são mmap;queryNode.mmap.scalarIndex
controla se o índice escalar é mmap;
# This parameter was set in configs/milvus.yaml
...
queryNode:
mmap:
vectorField: false # Enable mmap for loading vector data
vectorIndex: false # Enable mmap for loading vector index
scalarField: false # Enable mmap for loading scalar data
scalarIndex: false # Enable mmap for loading scalar index
....
Além disso, apenas o índice vetorial e o mmap de dados vectoriais podem ser activados e desactivados para uma coleção individualmente, mas não para outras.
Compatibilidade: Se a configuração original queryNode.mmap.mmapEnabled
estiver definida como true
, a configuração recém-adicionada será definida como true
neste momento. Se queryNode.mmap.mmapEnabled
estiver definido como false
, se a nova configuração estiver definida como true
, o valor final será true
.
Durante o funcionamento do cluster: configuração dinâmica
Durante o tempo de execução do cluster, é possível ajustar dinamicamente as definições de mapeamento de memória ao nível da coleção ou do índice.
No nível da coleção, o mapeamento de memória é aplicado a todos os dados brutos não indexados dentro de uma coleção, excluindo chaves primárias, carimbos de data/hora e IDs de linha. Essa abordagem é particularmente adequada para o gerenciamento abrangente de grandes conjuntos de dados.
Para ajustes dinâmicos às definições de mapeamento de memória numa coleção, utilize o método set_properties()
. Aqui, é possível alternar mmap.enabled
entre True
ou False
, conforme necessário.
# Get existing collection
collection = Collection("test_collection") # Replace with your collection name
# Set memory mapping property to True or Flase
collection.set_properties({'mmap.enabled': True})
Depois de 2.4.10
, as definições de mapeamento de memória numa coleção, utilize o método add_field
. Aqui, pode alternar mmap_enabled
entre True
ou False
, conforme necessário.
schema = MilvusClient.create_schema()
schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=768, mmap_enabled=True)
Para configurações de nível de índice, o mapeamento de memória pode ser aplicado especificamente a índices de vetor sem afetar outros tipos de dados. Esta funcionalidade é valiosa para colecções que requerem um desempenho optimizado para pesquisas vectoriais.
Para ativar ou desativar o mapeamento de memória para um índice numa coleção, chame o método alter_index()
, especificando o nome do índice de destino em index_name
e definindo mmap.enabled
para True
ou False
.
collection.alter_index(
index_name="vector_index", # Replace with your vector index name
extra_params={"mmap.enabled": True} # Enable memory mapping for index
)
Personalizar o caminho de armazenamento em diferentes implementações
Por predefinição, os ficheiros mapeados na memória são guardados no diretório /mmap
em localStorage.path
. Eis como personalizar esta definição em vários métodos de implementação:
- Para o Milvus instalado usando o Helm Chart:
# new-values.yaml
extraConfigFiles:
user.yaml: |+
queryNode:
mmap:
mmapEnabled: true
mmapDirPath: any/valid/path
helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
- Para o Milvus instalado usando o Milvus Operator:
# patch.yaml
spec:
config:
queryNode:
mmap:
mmapEnabled: true
mmapDirPath: any/valid/path
kubectl patch milvus <milvus-name> --patch-file patch.yaml
- Para o Milvus instalado usando o Docker:
# A new installation script is provided to enable mmap-related settings.
Limites
O mapeamento de memória não pode ser ativado para uma coleção carregada, certifique-se de que a coleção foi liberada antes de ativar o mapeamento de memória.
O mapeamento de memória não é compatível com os índices DiskANN ou de classe GPU.
PERGUNTAS FREQUENTES
Em quais cenários é recomendável habilitar o mapeamento de memória? Quais são as desvantagens após a ativação desse recurso?
O mapeamento de memória é recomendado quando a memória é limitada ou quando os requisitos de desempenho são moderados. A ativação desta funcionalidade aumenta a capacidade de carregamento de dados. Por exemplo, com uma configuração de 2 CPUs e 8 GB de memória, a ativação do mapeamento de memória pode permitir que sejam carregados até 4 vezes mais dados do que se não for ativado. O impacto no desempenho varia:
Com memória suficiente, o desempenho esperado é semelhante ao da utilização de apenas memória.
Com memória insuficiente, o desempenho esperado pode degradar-se.
Qual é a relação entre as configurações de nível de coleção e de nível de índice?
O nível de coleção e o nível de índice não são relações inclusivas, o nível de coleção controla se os dados originais estão ou não activados para mmap, enquanto o nível de índice é apenas para índices vectoriais.
Existe algum tipo de índice recomendado para o mapeamento de memória?
Sim, o HNSW é recomendado para ativar o mmap. Já testámos índices das séries HNSW, IVF_FLAT, IVF_PQ/SQ anteriormente, o desempenho dos índices da série IVF diminuiu seriamente, enquanto a diminuição do desempenho ao ativar o mmap para os índices HNSW ainda está dentro das expectativas.
Que tipo de armazenamento local é necessário para o mapeamento de memória?
Um disco de alta qualidade melhora o desempenho, sendo as unidades NVMe a opção preferida.
Os dados escalares podem ser mapeados na memória?
O mapeamento de memória pode ser aplicado a dados escalares, mas não é aplicável a índices criados em campos escalares.
Como é determinada a prioridade das configurações de mapeamento de memória em diferentes níveis?
No Milvus, quando as configurações de mapeamento de memória são explicitamente definidas em vários níveis, as configurações ao nível do índice e ao nível da coleção partilham a prioridade mais elevada, seguindo-se as configurações ao nível do cluster.
Se atualizar a partir do Milvus 2.3 e tiver configurado o caminho do diretório de mapeamento de memória, o que irá acontecer?
Se atualizar a partir do Milvus 2.3 e tiver configurado o caminho do diretório de mapeamento de memória (
mmapDirPath
), a sua configuração será mantida e a predefinição para o mapeamento de memória ativado (mmapEnabled
) serátrue
. É importante migrar os metadados para sincronizar a configuração dos seus ficheiros mapeados na memória existentes. Para obter mais detalhes, consulte Migrar os metadados.