milvus-logo
LFAI
Home
  • Guía de administración
    • Optimización del almacenamiento

Almacenamiento de datos habilitado para MMap

En Milvus, los archivos mapeados en memoria permiten la asignación directa del contenido de los archivos a la memoria. Esta característica mejora la eficiencia de la memoria, particularmente en situaciones en las que la memoria disponible es escasa pero la carga completa de datos es inviable. Este mecanismo de optimización puede aumentar la capacidad de los datos asegurando el rendimiento hasta un cierto límite; sin embargo, cuando la cantidad de datos excede demasiado la memoria, el rendimiento de las búsquedas y consultas puede sufrir una grave degradación, por lo que le rogamos que active o desactive esta característica según le convenga.

Configurar la asignación de memoria

A partir de Milvus 2.4, tiene la flexibilidad de ajustar el archivo de configuración estática para configurar los ajustes predeterminados de asignación de memoria para todo el clúster antes del despliegue. Además, existe la opción de modificar dinámicamente los parámetros para ajustar con precisión la configuración de la asignación de memoria tanto a nivel de clúster como de índice. De cara al futuro, las futuras actualizaciones ampliarán las capacidades de asignación de memoria para incluir configuraciones a nivel de campo.

Antes del despliegue del clúster: configuración global

Antes de desplegar un clúster, la configuración a nivel de cl úster aplica la asignación de memoria a todo el clúster. Esto garantiza que todos los objetos nuevos se adhieran automáticamente a estas configuraciones. Es importante tener en cuenta que la modificación de estos ajustes requiere reiniciar el clúster para que surta efecto.

Para ajustar la configuración de asignación de memoria de su clúster, edite el archivo configs/milvus.yaml. Dentro de este archivo, puede especificar si desea activar la asignación de memoria por defecto y determinar la ruta del directorio para almacenar los archivos asignados a la memoria. Si la ruta (mmapDirPath) se deja sin especificar, el sistema almacena por defecto los archivos mapeados en memoria en {localStorage.path}/mmap. Para obtener más información, consulte Configuraciones relacionadas con el almacenamiento 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 
....

Después de 2.4.10, la configuración queryNode.mmap.mmapEnabled se divide en cuatro campos separados, y todos los valores por defecto son false:

  • queryNode.mmap.vectorField, controla si los datos del vector son mmap;
  • queryNode.mmap.vectorIndex, controla si el índice vectorial es mmap;
  • queryNode.mmap.scalarField, controla si los datos escalares son mmap;
  • queryNode.mmap.scalarIndex, controla si el índice escalar es 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
....

Además, sólo el índice vectorial y el mmap de datos vectoriales pueden activarse y desactivarse para una colección individualmente, pero no para otras.

Compatibilidad: Si la configuración original queryNode.mmap.mmapEnabled se establece en true, la nueva configuración añadida se establecerá en true en este momento. Si queryNode.mmap.mmapEnabled se establece en false, si la nueva configuración se establece en true, el valor final será true.

Durante el funcionamiento del clúster: configuración dinámica

Durante el funcionamiento del clúster, puede ajustar dinámicamente la configuración de asignación de memoria a nivel de colección o de índice.

En el nivel de colección, la asignación de memoria se aplica a todos los datos brutos no indexados dentro de una colección, excluyendo las claves primarias, las marcas de tiempo y los ID de fila. Este enfoque es especialmente adecuado para la gestión integral de grandes conjuntos de datos.

Para realizar ajustes dinámicos en la configuración de la asignación de memoria dentro de una colección, utilice el método set_properties(). Aquí, puede alternar mmap.enabled entre True o False según sea necesario.

# 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})

Después de 2.4.10, los ajustes de asignación de memoria dentro de una colección, utilice el método add_field. Aquí, puede alternar mmap_enabled entre True o False según sea necesario.

schema = MilvusClient.create_schema()

schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=768, mmap_enabled=True)

Para los ajustes a nivel de índice, la asignación de memoria puede aplicarse específicamente a los índices vectoriales sin afectar a otros tipos de datos. Esta característica es muy valiosa para las colecciones que requieren un rendimiento optimizado para las búsquedas vectoriales.

Para activar o desactivar la asignación de memoria para un índice dentro de una colección, llame al método alter_index(), especificando el nombre del índice de destino en index_name y estableciendo mmap.enabled en True o 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 la ruta de almacenamiento en diferentes implementaciones

Los archivos mapeados en memoria se encuentran por defecto en el directorio /mmap dentro de localStorage.path. A continuación se muestra cómo personalizar esta configuración en varios métodos de despliegue:

  • Para Milvus instalado utilizando 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 Milvus instalado utilizando Milvus Operator:
# patch.yaml
spec:
  config:
    queryNode:
      mmap:
        mmapEnabled: true
        mmapDirPath: any/valid/path
      
 kubectl patch milvus <milvus-name> --patch-file patch.yaml
  • Para Milvus instalado utilizando Docker:
# A new installation script is provided to enable mmap-related settings.

Límites

  • La asignación de memoria no puede habilitarse para una colección cargada, asegúrese de que la colección se ha liberado antes de habilitar la asignación de memoria.

  • La asignación de memoria no es compatible con los índices de clase DiskANN o GPU.

PREGUNTAS FRECUENTES

  • ¿En qué casos se recomienda activar la asignación de memoria? ¿Cuáles son las desventajas de activar esta función?

    La asignación de memoria se recomienda cuando la memoria es limitada o cuando los requisitos de rendimiento son moderados. La activación de esta función aumenta la capacidad de carga de datos. Por ejemplo, con una configuración de 2 CPU y 8 GB de memoria, habilitar la asignación de memoria puede permitir cargar hasta 4 veces más datos en comparación con no habilitarla. El impacto en el rendimiento varía:

    • Con memoria suficiente, el rendimiento esperado es similar al de utilizar sólo memoria.

    • Con memoria insuficiente, el rendimiento esperado puede degradarse.

  • ¿Cuál es la relación entre las configuraciones a nivel de colección y a nivel de índice?

    El nivel de colección y el nivel de índice no son relaciones inclusivas, el nivel de colección controla si los datos originales están habilitados para mmap o no, mientras que el nivel de índice es sólo para índices vectoriales.

  • ¿Hay algún tipo de índice recomendado para la asignación de memoria?

    Sí, se recomienda HNSW para habilitar mmap. Hemos probado anteriormente índices de las series HNSW, IVF_FLAT, IVF_PQ/SQ, el rendimiento de los índices de la serie IVF se redujo seriamente, mientras que la reducción del rendimiento al activar mmap para los índices HNSW sigue estando dentro de lo esperado.

  • ¿Qué tipo de almacenamiento local se necesita para la asignación de memoria?

    Un disco de alta calidad mejora el rendimiento, siendo las unidades NVMe la opción preferida.

  • ¿Se pueden mapear en memoria los datos escalares?

    La asignación de memoria puede aplicarse a datos escalares, pero no es aplicable a índices construidos sobre campos escalares.

  • ¿Cómo se determina la prioridad de las configuraciones de asignación de memoria en los distintos niveles?

    En Milvus, cuando las configuraciones de asignación de memoria se definen explícitamente en varios niveles, las configuraciones a nivel de índice y a nivel de colección comparten la prioridad más alta, seguidas por las configuraciones a nivel de clúster.

  • Si actualizo desde Milvus 2.3 y he configurado la ruta del directorio de asignación de memoria, ¿qué ocurrirá?

    Si actualiza desde Milvus 2.3 y ha configurado la ruta del directorio de mapeo de memoria (mmapDirPath), su configuración se mantendrá, y la configuración por defecto para el mapeo de memoria habilitado (mmapEnabled) será true. Es importante migrar los metadatos para sincronizar la configuración de sus archivos mapeados en memoria existentes. Para más detalles, consulte Migrar los metadatos.

Traducido porDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

¿Fue útil esta página?