🚀 Prova Zilliz Cloud, la versione completamente gestita di Milvus, gratuitamente—sperimenta prestazioni 10 volte più veloci! Prova Ora>>

milvus-logo
LFAI

Architettura complessiva

  • Scenarios
July 29, 2021
milvus

Con la crescita esplosiva della scala dei dati di Internet, da un lato aumentano la quantità e la categoria dei prodotti nell'attuale piattaforma di e-commerce mainstream, dall'altro aumenta la difficoltà per gli utenti di trovare i prodotti di cui hanno bisogno.

Vipshop è uno dei principali rivenditori online di marchi scontati in Cina. L'azienda offre ai consumatori di tutta la Cina prodotti di marca di alta qualità e popolari a prezzi notevolmente scontati rispetto ai prezzi al dettaglio. Per ottimizzare l'esperienza di acquisto dei propri clienti, l'azienda ha deciso di costruire un sistema di raccomandazione di ricerca personalizzato basato sulle parole chiave della query dell'utente e sui suoi ritratti.

La funzione principale del sistema di raccomandazione della ricerca nell'e-commerce è quella di recuperare i prodotti adatti da un gran numero di prodotti e di mostrarli agli utenti in base alle loro intenzioni e preferenze di ricerca. In questo processo, il sistema deve calcolare la somiglianza tra i prodotti e le intenzioni e le preferenze di ricerca degli utenti e consigliare agli utenti i prodotti TopK con la maggiore somiglianza.

Dati come le informazioni sui prodotti, le intenzioni di ricerca degli utenti e le loro preferenze sono tutti dati non strutturati. Abbiamo provato a calcolare la somiglianza di tali dati utilizzando CosineSimilarity(7.x) del motore di ricerca Elasticsearch (ES), ma questo approccio presenta i seguenti svantaggi.

  • Tempi di risposta lunghi: la latenza media per recuperare i risultati TopK da milioni di elementi è di circa 300 ms.

  • Elevati costi di manutenzione degli indici di ES: lo stesso set di indici viene utilizzato sia per i vettori di caratteristiche delle materie prime sia per altri dati correlati, il che non facilita affatto la costruzione degli indici, ma produce un'enorme quantità di dati.

Abbiamo provato a sviluppare un nostro plug-in di hash localmente sensibile per accelerare il calcolo della somiglianza del coseno di ES. Sebbene le prestazioni e il throughput siano migliorati in modo significativo dopo l'accelerazione, la latenza di oltre 100 ms era ancora difficile da soddisfare per il reperimento dei prodotti online.

Dopo un'accurata ricerca, abbiamo deciso di utilizzare Milvus, un database vettoriale open source che, rispetto al comune Faiss standalone, ha il vantaggio di supportare la distribuzione distribuita, gli SDK multilingue, la separazione lettura/scrittura, ecc.

Utilizzando diversi modelli di deep learning, convertiamo dati massicci non strutturati in vettori di caratteristiche e importiamo i vettori in Milvus. Grazie alle eccellenti prestazioni di Milvus, il nostro sistema di raccomandazione per la ricerca di e-commerce può interrogare in modo efficiente i vettori TopK che sono simili ai vettori di destinazione.

Architettura complessiva

Come mostrato nel diagramma, l'architettura generale del sistema è composta da due parti principali.

  • Processo di scrittura: i vettori delle caratteristiche degli articoli (di seguito denominati vettori degli articoli) generati dal modello di apprendimento profondo vengono normalizzati e scritti in MySQL. MySQL legge quindi i vettori delle caratteristiche degli articoli elaborati utilizzando lo strumento di sincronizzazione dei dati (ETL) e li importa nel database vettoriale Milvus.

  • Processo di lettura: Il servizio di ricerca ottiene i vettori delle caratteristiche delle preferenze dell'utente (di seguito denominati vettori utente) in base alle parole chiave e ai ritratti dell'utente, interroga i vettori simili in Milvus e richiama i vettori degli articoli TopK.

Milvus supporta sia l'aggiornamento incrementale dei dati che l'aggiornamento dell'intero database. Ogni aggiornamento incrementale deve cancellare il vettore di elementi esistente e inserire un nuovo vettore di elementi, il che significa che ogni collezione appena aggiornata sarà reindicizzata. Questa soluzione si adatta meglio allo scenario con più letture e meno scritture. Pertanto, scegliamo il metodo di aggiornamento dei dati completi. Inoltre, la scrittura di tutti i dati in batch di più partizioni richiede solo pochi minuti, il che equivale a un aggiornamento quasi in tempo reale.

I nodi di scrittura Milvus eseguono tutte le operazioni di scrittura, compresa la creazione di raccolte di dati, la costruzione di indici, l'inserimento di vettori, ecc. I nodi di lettura Milvus eseguono tutte le operazioni di lettura e forniscono servizi al pubblico con nomi di dominio di sola lettura.

Mentre la versione attuale di Milvus non supporta il cambio di alias di raccolta, noi introduciamo Redis per cambiare alias senza problemi tra più raccolte di dati intere.

Il nodo di lettura deve solo leggere le informazioni esistenti sui metadati e i dati vettoriali o gli indici da MySQL, Milvus e il file system distribuito GlusterFS, quindi la capacità di lettura può essere estesa orizzontalmente distribuendo più istanze.

Dettagli di implementazione

Aggiornamento dei dati

Il servizio di aggiornamento dei dati comprende non solo la scrittura dei dati vettoriali, ma anche il rilevamento del volume dei dati dei vettori, la costruzione degli indici, il precaricamento degli indici, il controllo degli alias, ecc. Il processo complessivo è il seguente. ProcessProcesso

  1. Si supponga che prima di costruire i dati completi, CollectionA fornisca il servizio dati al pubblico e che i dati completi utilizzati siano diretti a CollectionA (redis key1 = CollectionA). Lo scopo della costruzione dei dati completi è quello di creare una nuova raccolta CollectionB.

  2. Controllo dei dati delle materie prime - verifica il numero di articolo dei dati delle materie prime nella tabella MySQL, confronta i dati delle materie prime con i dati esistenti in CollectionA. L'avviso può essere impostato in base alla quantità o alla percentuale. Se la quantità (percentuale) impostata non viene raggiunta, l'intero dato non verrà costruito e verrà considerato come un fallimento di questa operazione di costruzione, facendo scattare l'avviso; una volta raggiunta la quantità (percentuale) impostata, il processo di costruzione dell'intero dato viene avviato.

  3. Avviare la costruzione dell'intero dato - inizializzare l'alias dell'intero dato in costruzione e aggiornare Redis. Dopo l'aggiornamento, l'alias dell'intero dato in costruzione viene indirizzato a CollectionB (redis key2 = CollectionB).

  4. Creare una nuova collezione intera - determinare se CollectionB esiste. Se esiste, eliminarla prima di crearne una nuova.

  5. Scrittura in batch dei dati - calcolare l'ID della partizione di ciascun dato della commodity con il proprio ID utilizzando l'operazione modulo e scrivere i dati in più partizioni nella raccolta appena creata in batch.

  6. Creare e precaricare l'indice - Creare l'indice (createIndex()) per la nuova raccolta. Il file dell'indice viene memorizzato nel server di archiviazione distribuito GlusterFS. Il sistema simula automaticamente una query sulla nuova raccolta e precarica l'indice per il riscaldamento della query.

  7. Controllo dei dati della raccolta: controlla il numero di elementi dei dati nella nuova raccolta, confronta i dati con la raccolta esistente e imposta gli allarmi in base alla quantità e alla percentuale. Se il numero (percentuale) impostato non viene raggiunto, la raccolta non verrà commutata e il processo di costruzione verrà considerato un fallimento, attivando l'allarme.

  8. Commutazione della raccolta - Controllo dell'alias. Dopo l'aggiornamento di Redis, l'intero alias dei dati utilizzati viene indirizzato a CollectionB (redis key1 = CollectionB), la chiave Redis originale2 viene cancellata e il processo di costruzione è completato.

Richiamo dei dati

I dati della partizione Milvus vengono richiamati più volte per calcolare la somiglianza tra i vettori utente, ottenuti in base alle parole chiave della query dell'utente e al ritratto dell'utente, e i vettori articolo TopK, che vengono restituiti dopo la fusione. Il flusso di lavoro complessivo è il seguente: workflowflusso di lavoroLa tabella seguente elenca i principali servizi coinvolti in questo processo. Si può notare che la latenza media per il richiamo dei vettori TopK è di circa 30 ms.

ServizioRuoloParametri di ingressoParametri di uscitaLatenza di risposta
Acquisizione vettori utenteOttenere il vettore utenteinfo utente + interrogazionevettore utente10 ms
Ricerca MilvusCalcola la somiglianza del vettore e restituisce i risultati TopKvettore utentevettore elemento10 ms
Logica di programmazioneRichiamo e fusione simultanea dei risultatiVettori di elementi richiamati da più canali e punteggio di somiglianzaElementi TopK10 ms

Processo di implementazione:

  1. In base alle parole chiave della query dell'utente e al ritratto dell'utente, il vettore utente viene calcolato dal modello di deep learning.
  2. Ottenere l'alias della raccolta di tutti i dati utilizzati da Redis currentInUseKeyRef e ottenere Milvus CollectionName. Questo processo è un servizio di sincronizzazione dei dati, ossia il passaggio dell'alias a Redis dopo l'aggiornamento di tutti i dati.
  3. Milvus viene chiamato in modo simultaneo e asincrono con il vettore utente per ottenere i dati da diverse partizioni della stessa collezione; Milvus calcola la somiglianza tra il vettore utente e il vettore elemento e restituisce i TopK vettori elemento simili in ogni partizione.
  4. Unisce i TopK item vectors restituiti da ogni partizione e classifica i risultati in ordine inverso rispetto alla distanza di somiglianza, che viene calcolata utilizzando il prodotto interno IP (maggiore è la distanza tra i vettori, più sono simili). Vengono restituiti i vettori di elementi TopK finali.

Guardare avanti

Attualmente, la ricerca vettoriale basata su Milvus può essere utilizzata stabilmente nella ricerca di scenari di raccomandazione, e le sue elevate prestazioni ci danno più spazio per giocare sulla dimensionalità del modello e sulla selezione dell'algoritmo.

Milvus svolgerà un ruolo cruciale come middleware per un numero maggiore di scenari, tra cui il richiamo della ricerca del sito principale e le raccomandazioni per tutti gli scenari.

Le tre caratteristiche più attese di Milvus in futuro sono le seguenti.

  • Logica per la commutazione degli alias delle collezioni: coordinare la commutazione tra le collezioni senza componenti esterni.
  • Meccanismo di filtraggio - Milvus v0.11.0 supporta solo il meccanismo di filtraggio ES DSL nella versione standalone. La nuova versione di Milvus 2.0 supporta il filtraggio scalare e la separazione lettura/scrittura.
  • Supporto dello storage per Hadoop Distributed File System (HDFS) - Milvus v0.10.6 supporta solo l'interfaccia file POSIX e abbiamo implementato GlusterFS con supporto FUSE come backend di storage. Tuttavia, HDFS è una scelta migliore in termini di prestazioni e facilità di scalabilità.

Lezioni apprese e buone pratiche

  1. Per le applicazioni in cui le operazioni di lettura sono l'obiettivo principale, un'implementazione di separazione lettura-scrittura può aumentare significativamente la potenza di elaborazione e migliorare le prestazioni.
  2. Il client Milvus Java non dispone di un meccanismo di riconnessione perché il client Milvus utilizzato dal servizio di richiamo è residente in memoria. Dobbiamo costruire il nostro pool di connessioni per garantire la disponibilità della connessione tra il client Java e il server attraverso il test heartbeat.
  3. Occasionalmente si verificano query lente su Milvus. Ciò è dovuto a un riscaldamento insufficiente della nuova collezione. Simulando la query sulla nuova collezione, il file dell'indice viene caricato in memoria per ottenere il riscaldamento dell'indice.
  4. nlist è il parametro di costruzione dell'indice e nprobe è il parametro della query. È necessario ottenere un valore di soglia ragionevole in base allo scenario aziendale attraverso esperimenti di pressure test per bilanciare le prestazioni di recupero e l'accuratezza.
  5. Per uno scenario di dati statici, è più efficiente importare prima tutti i dati nella raccolta e costruire gli indici in un secondo momento.

Try Managed Milvus for Free

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

Get Started

Like the article? Spread the word

Continua a Leggere