milvus-logo
LFAI
Home
  • Guia do utilizador

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 
....

Durante a operação do cluster: configuração dinâmica

Durante o tempo de execução do cluster, é possível ajustar dinamicamente as configurações de mapeamento de memória no 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})

Para definições ao nível do índice, o mapeamento de memória pode ser aplicado especificamente a índices de vectores 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 de classe DiskANN ou 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.

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?