milvus-logo
LFAI
Home
  • Guide d'administration
    • Optimisation du stockage

Stockage de données avec mappage en mémoire

Dans Milvus, les fichiers mappés en mémoire permettent de mapper directement le contenu des fichiers dans la mémoire. Cette fonction améliore l'efficacité de la mémoire, en particulier dans les situations où la mémoire disponible est rare mais où le chargement complet des données est impossible. Ce mécanisme d'optimisation peut augmenter la capacité des données tout en garantissant les performances jusqu'à une certaine limite ; toutefois, lorsque la quantité de données dépasse trop la mémoire, les performances de recherche et d'interrogation risquent de se dégrader sérieusement.

Configurer le mappage de la mémoire

A partir de Milvus 2.4, vous avez la possibilité d'ajuster le fichier de configuration statique pour configurer les paramètres de mappage de la mémoire par défaut pour l'ensemble du cluster avant le déploiement. En outre, vous avez la possibilité de modifier dynamiquement les paramètres afin d'affiner les paramètres de mappage de la mémoire au niveau du cluster et de l'index. Les prochaines mises à jour étendront les capacités de mappage de la mémoire aux configurations au niveau des champs.

Avant le déploiement d'un cluster : configuration globale

Avant de déployer un cluster, les paramètres au niveau du cluster appliquent le mappage de la mémoire à l'ensemble du cluster. Cela permet de s'assurer que tous les nouveaux objets respecteront automatiquement ces configurations. Il est important de noter que la modification de ces paramètres nécessite un redémarrage de la grappe pour être effective.

Pour ajuster les paramètres de mappage de la mémoire de votre cluster, modifiez le fichier configs/milvus.yaml. Dans ce fichier, vous pouvez indiquer si le mappage de la mémoire doit être activé par défaut et déterminer le chemin d'accès au répertoire de stockage des fichiers mappés en mémoire. Si le chemin d'accès (mmapDirPath) n'est pas spécifié, le système stocke par défaut les fichiers mappés en mémoire dans {localStorage.path}/mmap. Pour plus d'informations, reportez-vous à la section Configurations liées au stockage 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 
....

Après 2.4.10, la configuration queryNode.mmap.mmapEnabled se divise en quatre champs distincts, et toutes les valeurs par défaut sont false:

  • queryNode.mmap.vectorField, contrôle si les données vectorielles sont mmap ;
  • queryNode.mmap.vectorIndexcontrôle si l'index du vecteur est mmap ; , contrôle si les données scalaires sont mmap ; , contrôle si les données scalaires sont mmap ;
  • queryNode.mmap.scalarField, contrôle si les données scalaires sont mmap ;
  • queryNode.mmap.scalarIndex, contrôle si l'index scalaire est 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
....

En outre, seuls l'index vectoriel et les données vectorielles peuvent être activés ou désactivés pour une collection donnée, mais pas pour les autres.

Compatibilité : Si la configuration originale queryNode.mmap.mmapEnabled est définie sur true, la configuration nouvellement ajoutée sera définie sur true à ce moment-là. Si queryNode.mmap.mmapEnabled est défini sur false, si la nouvelle configuration est définie sur true, la valeur finale sera true.

Pendant le fonctionnement de la grappe : configuration dynamique

Pendant l'exécution du cluster, vous pouvez ajuster dynamiquement les paramètres de mappage de la mémoire au niveau de la collection ou de l'index.

Au niveau de la collection, le mappage de la mémoire est appliqué à toutes les données brutes non indexées d'une collection, à l'exclusion des clés primaires, des horodatages et des identifiants de ligne. Cette approche est particulièrement adaptée à la gestion complète de grands ensembles de données.

Pour procéder à des ajustements dynamiques des paramètres de mappage de la mémoire au sein d'une collection, utilisez la méthode set_properties(). Ici, vous pouvez faire basculer mmap.enabled entre True et False selon vos besoins.

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

Après 2.4.10, les paramètres de mappage de la mémoire dans une collection, utilisez la méthode add_field. Ici, vous pouvez faire basculer mmap_enabled entre True ou False selon vos besoins.

schema = MilvusClient.create_schema()

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

Pour les paramètres au niveau de l'index, le mappage de la mémoire peut être appliqué spécifiquement aux index vectoriels sans affecter les autres types de données. Cette fonctionnalité est inestimable pour les collections qui nécessitent des performances optimisées pour les recherches vectorielles.

Pour activer ou désactiver le mappage de la mémoire pour un index au sein d'une collection, appelez la méthode alter_index(), en spécifiant le nom de l'index cible dans index_name et en réglant mmap.enabled sur 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
)

Personnaliser le chemin de stockage dans différents déploiements

Les fichiers mappés en mémoire sont stockés par défaut dans le répertoire /mmap à l'intérieur de localStorage.path. Voici comment personnaliser ce paramètre en fonction des différentes méthodes de déploiement :

  • Pour Milvus installé à l'aide de 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
  • Pour Milvus installé à l'aide de Milvus Operator :
# patch.yaml
spec:
  config:
    queryNode:
      mmap:
        mmapEnabled: true
        mmapDirPath: any/valid/path
      
 kubectl patch milvus <milvus-name> --patch-file patch.yaml
  • Pour Milvus installé à l'aide de Docker :
# A new installation script is provided to enable mmap-related settings.

Limites

  • Le mappage de mémoire ne peut pas être activé pour une collection chargée, assurez-vous que la collection a été libérée avant d'activer le mappage de mémoire.

  • Le mappage de mémoire n'est pas pris en charge pour les index DiskANN ou de classe GPU.

FAQ

  • Dans quels scénarios est-il recommandé d'activer le mappage de mémoire ? Quels sont les inconvénients liés à l'activation de cette fonctionnalité ?

    Le mappage de mémoire est recommandé lorsque la mémoire est limitée ou lorsque les exigences en matière de performances sont modérées. L'activation de cette fonctionnalité augmente la capacité de chargement des données. Par exemple, avec une configuration de 2 CPU et 8 Go de mémoire, l'activation du mappage de la mémoire peut permettre de charger jusqu'à 4 fois plus de données que si elle n'est pas activée. L'impact sur les performances varie :

    • Si la mémoire est suffisante, les performances attendues sont similaires à celles de l'utilisation de la mémoire seule.

    • Si la mémoire est insuffisante, les performances attendues peuvent se dégrader.

  • Quelle est la relation entre les configurations au niveau de la collection et au niveau de l'index ?

    Le niveau de la collection et le niveau de l'index ne sont pas des relations inclusives, le niveau de la collection contrôle si les données d'origine sont compatibles avec le mode mmap ou non, tandis que le niveau de l'index concerne uniquement les index vectoriels.

  • Existe-t-il un type d'index recommandé pour le mappage de la mémoire ?

    Oui, HNSW est recommandé pour activer mmap. Nous avons déjà testé les index des séries HNSW, IVF_FLAT, IVF_PQ/SQ. Les performances des index de la série IVF ont sérieusement chuté, alors que la baisse de performance due à l'activation de mmap pour les index HNSW reste dans les limites des attentes.

  • Quel type de stockage local est nécessaire pour le mappage de la mémoire ?

    Un disque de haute qualité améliore les performances, les disques NVMe étant l'option préférée.

  • Les données scalaires peuvent-elles être mappées en mémoire ?

    Le mappage de mémoire peut être appliqué aux données scalaires, mais il n'est pas applicable aux index construits sur des champs scalaires.

  • Comment la priorité est-elle déterminée pour les configurations de mappage de mémoire à différents niveaux ?

    Dans Milvus, lorsque des configurations de mappage de mémoire sont explicitement définies sur plusieurs niveaux, les configurations au niveau de l'index et de la collection ont la priorité la plus élevée, suivie par les configurations au niveau du cluster.

  • Si je mets à niveau Milvus 2.3 et que j'ai configuré le chemin d'accès au répertoire de mappage de mémoire, que se passe-t-il ?

    Si vous mettez à niveau Milvus 2.3 et que vous avez configuré le chemin du répertoire de mappage de la mémoire (mmapDirPath), votre configuration sera conservée et le paramètre par défaut pour le mappage de la mémoire activé (mmapEnabled) sera true. Il est important de migrer les métadonnées pour synchroniser la configuration de vos fichiers mappés en mémoire existants. Pour plus de détails, voir Migrer les métadonnées.

Traduit parDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

Cette page a-t - elle été utile ?