milvus-logo
LFAI
Casa
  • Guida all'amministrazione
    • Ottimizzazione dello stoccaggio

Memorizzazione dei dati abilitata da MMap

In Milvus, i file con mappatura di memoria consentono la mappatura diretta del contenuto dei file nella memoria. Questa caratteristica migliora l'efficienza della memoria, in particolare nelle situazioni in cui la memoria disponibile è scarsa ma il caricamento completo dei dati non è fattibile. Questo meccanismo di ottimizzazione può aumentare la capacità dei dati garantendo le prestazioni fino a un certo limite; tuttavia, quando la quantità di dati supera di troppo la memoria, le prestazioni delle ricerche e delle interrogazioni possono subire un grave degrado.

Configurare la mappatura della memoria

A partire da Milvus 2.4, è possibile modificare il file di configurazione statica per configurare le impostazioni predefinite di mappatura della memoria per l'intero cluster prima della distribuzione. Inoltre, è possibile modificare dinamicamente i parametri per perfezionare le impostazioni di mappatura della memoria sia a livello di cluster che di indice. In futuro, gli aggiornamenti estenderanno le capacità di mappatura della memoria per includere le configurazioni a livello di campo.

Prima della distribuzione del cluster: configurazione globale

Prima di distribuire un cluster, le impostazioni a livello di cluster applicano la mappatura della memoria all'intero cluster. Questo assicura che tutti i nuovi oggetti aderiscano automaticamente a queste configurazioni. È importante notare che la modifica di queste impostazioni richiede il riavvio del cluster per diventare effettiva.

Per regolare le impostazioni di mappatura della memoria del cluster, modificare il file configs/milvus.yaml. In questo file è possibile specificare se abilitare la mappatura della memoria per impostazione predefinita e determinare il percorso della directory per la memorizzazione dei file con mappatura della memoria. Se il percorso (mmapDirPath) viene lasciato non specificato, il sistema si imposta di memorizzare i file con mappatura della memoria in {localStorage.path}/mmap. Per ulteriori informazioni, consultare la sezione Configurazioni relative alla memoria locale.

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

Dopo 2.4.10, la configurazione queryNode.mmap.mmapEnabled si divide in quattro campi separati e tutti i valori predefiniti sono false:

  • queryNode.mmap.vectorField, controlla se i dati del vettore sono mmap;
  • queryNode.mmap.vectorIndex, controlla se l'indice del vettore è mmap;
  • queryNode.mmap.scalarField, controlla se i dati scalari sono mmap;
  • queryNode.mmap.scalarIndex, controlla se l'indice scalare è 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
....

Inoltre, solo l'indice vettoriale e l'mmap dei dati vettoriali possono essere attivati e disattivati per una collezione individualmente, ma non per altre.

Compatibilità: Se la configurazione originale queryNode.mmap.mmapEnabled è impostata su true, la nuova configurazione aggiunta sarà impostata su true in questo momento. Se queryNode.mmap.mmapEnabled è impostato su false, se la nuova configurazione è impostata su true, il valore finale sarà true.

Durante il funzionamento del cluster: configurazione dinamica

Durante l'esecuzione del cluster, è possibile regolare dinamicamente le impostazioni di mappatura della memoria a livello di collezione o di indice.

A livello di collezione, la mappatura della memoria viene applicata a tutti i dati grezzi non indicizzati di una collezione, escluse le chiavi primarie, i timestamp e gli ID riga. Questo approccio è particolarmente adatto alla gestione completa di grandi insiemi di dati.

Per modificare dinamicamente le impostazioni di mappatura della memoria all'interno di una raccolta, utilizzare il metodo set_properties(). In questo caso, è possibile alternare mmap.enabled tra True o False, a seconda delle necessità.

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

Dopo 2.4.10, le impostazioni di mappatura della memoria all'interno di una raccolta, utilizzare il metodo add_field. Qui è possibile alternare mmap_enabled tra True o False, a seconda delle necessità.

schema = MilvusClient.create_schema()

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

Per le impostazioni a livello di indice, la mappatura della memoria può essere applicata specificamente agli indici vettoriali senza influenzare gli altri tipi di dati. Questa funzione è preziosa per le collezioni che richiedono prestazioni ottimizzate per le ricerche vettoriali.

Per attivare o disattivare la mappatura della memoria per un indice all'interno di una collezione, richiamare il metodo alter_index(), specificando il nome dell'indice di destinazione in index_name e impostando mmap.enabled su 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
)

Personalizzare il percorso di memorizzazione in diverse distribuzioni

I file mappati in memoria si trovano per default nella directory /mmap all'interno di localStorage.path. Ecco come personalizzare questa impostazione nei vari metodi di distribuzione:

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

Limiti

  • La mappatura della memoria non può essere abilitata per una raccolta caricata; assicurarsi che la raccolta sia stata rilasciata prima di abilitare la mappatura della memoria.

  • La mappatura della memoria non è supportata per gli indici di classe DiskANN o GPU.

DOMANDE FREQUENTI

  • In quali scenari è consigliabile abilitare la mappatura della memoria? Quali sono gli svantaggi dopo aver abilitato questa funzione?

    La mappatura della memoria è consigliata quando la memoria è limitata o quando le prestazioni richieste sono moderate. L'abilitazione di questa funzione aumenta la capacità di caricamento dei dati. Ad esempio, con una configurazione di 2 CPU e 8 GB di memoria, l'abilitazione della mappatura della memoria può consentire il caricamento di un numero di dati fino a 4 volte superiore rispetto alla mancata abilitazione. L'impatto sulle prestazioni varia:

    • Con una memoria sufficiente, le prestazioni previste sono simili a quelle dell'utilizzo della sola memoria.

    • Con una memoria insufficiente, le prestazioni previste possono peggiorare.

  • Qual è la relazione tra le configurazioni a livello di raccolta e a livello di indice?

    Il livello di raccolta e il livello di indice non sono relazioni inclusive; il livello di raccolta controlla se i dati originali sono abilitati o meno a mmap, mentre il livello di indice riguarda solo gli indici vettoriali.

  • Esiste un tipo di indice consigliato per la mappatura della memoria?

    Sì, HNSW è consigliato per l'abilitazione di mmap. Abbiamo già testato gli indici delle serie HNSW, IVF_FLAT, IVF_PQ/SQ; le prestazioni degli indici della serie IVF sono diminuite notevolmente, mentre il calo delle prestazioni dovuto all'attivazione di mmap per gli indici HNSW rientra nelle aspettative.

  • Che tipo di memoria locale è necessaria per la mappatura della memoria?

    Un disco di alta qualità migliora le prestazioni e le unità NVMe sono l'opzione preferita.

  • I dati scalari possono essere mappati in memoria?

    La mappatura della memoria può essere applicata ai dati scalari, ma non agli indici costruiti su campi scalari.

  • Come viene determinata la priorità delle configurazioni di mappatura della memoria tra i diversi livelli?

    In Milvus, quando le configurazioni di mappatura della memoria sono definite esplicitamente su più livelli, le configurazioni a livello di indice e di collezione hanno la priorità più alta, seguite dalle configurazioni a livello di cluster.

  • Se si esegue l'aggiornamento da Milvus 2.3 e si è configurato il percorso della directory di mappatura della memoria, cosa succede?

    Se si esegue l'aggiornamento da Milvus 2.3 e si è configurato il percorso della directory di mappatura della memoria (mmapDirPath), la configurazione verrà mantenuta e l'impostazione predefinita per la mappatura della memoria abilitata (mmapEnabled) sarà true. È importante migrare i metadati per sincronizzare la configurazione dei file con mappatura della memoria esistenti. Per maggiori dettagli, consultare Migrazione dei metadati.

Tradotto daDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

Questa pagina è stata utile?