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 un insieme, 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 abilitare o disabilitare 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.