Presentiamo Cardinal: il motore più performante per le ricerche vettoriali
Questo post è scritto da Alexandr Guzhva e Li Liu.
Nei database, le 'prestazioni' sono una metrica critica, soprattutto nei database vettoriali. Sono fondamentali per elaborare in modo efficiente un elevato volume di richieste degli utenti con risorse limitate. Sebbene la latenza di accesso possa non essere un problema in alcune situazioni, per un database vettoriale le prestazioni rimangono essenziali per vari motivi.
La ricerca vettoriale, basata sulla ricerca approssimata del vicino più prossimo (ANNS), può scambiare un leggero grado di accuratezza con prestazioni migliorate. Prestazioni migliori, a loro volta, consentono una maggiore precisione.
Prestazioni eccellenti, mantenute con una latenza di query costante, facilitano un throughput più elevato utilizzando le stesse risorse, supportando una base utenti più ampia.
Inoltre, prestazioni migliorate si traducono nella necessità di minori risorse computazionali per supportare scenari d'uso identici.
I database vettoriali sono intrinsecamente intensivi dal punto di vista computazionale, con una parte significativa dell'uso delle risorse—spesso superiore all'80%—dedicata ai calcoli della distanza vettoriale. Di conseguenza, il motore di ricerca vettoriale, responsabile della gestione delle attività di ricerca vettoriale, diventa un fattore critico nel determinare le prestazioni complessive di un database vettoriale.
Zilliz dà costantemente priorità al miglioramento delle prestazioni dei database vettoriali. L'open-source Milvus e il completamente gestito Zilliz Cloud dimostrano prestazioni superiori rispetto a prodotti simili. Il motore di ricerca vettoriale di Milvus Knowhere, svolge un ruolo significativo nel raggiungimento di questo successo ponendo le basi per un nuovo motore di ricerca.
Al centro dell'ultima release di Zilliz Cloud c'è Cardinal, un nuovo motore di ricerca vettoriale che abbiamo sviluppato. Questo motore di ricerca ha già dimostrato un aumento triplo delle prestazioni rispetto alla versione precedente, offrendo prestazioni di ricerca (QPS) che raggiungono dieci volte quelle di Milvus.
Abbiamo valutato le prestazioni dell'ultimo Zilliz Cloud tramite lo strumento open-source di benchmark per database vettoriali e confrontato le sue prestazioni con Milvus e Zilliz Cloud con un vecchio motore. I risultati della valutazione sono mostrati nei grafici qui sotto.
Che cos'è Cardinal?
Cardinal è un motore di ricerca vettoriale proprietario, multi-thread, moderno, basato su template C++, che implementa i metodi ANNS più pratici e ampiamente utilizzati. Cardinal è stato progettato e scritto da zero per utilizzare in modo efficiente le risorse di calcolo disponibili.
Cardinal è in grado di:
eseguire ricerche brute-force,
creare e modificare indici ANNS,
eseguire la ricerca Top-K su indice e la ricerca per intervallo su indice,
lavorare con vari formati di dati di input, inclusi FP32, FP16 e BF16,
lavorare con dati in memoria o con dati mappati in memoria,
filtrare i risultati durante la ricerca in base a criteri forniti dall'utente.
Cardinal include:
Un'implementazione di metodi ANN che consente una facile configurazione di vari parametri interni. Tuttavia, il punto operativo predefinito è costantemente ottimizzato per massimizzare la velocità di ricerca (QPS, query al secondo) mantenendo al contempo un'accuratezza ragionevole (tasso di richiamo).
Implementazione efficiente di vari algoritmi che supportano i metodi ANNS. Ad esempio, quelli che forniscono capacità di filtraggio dei campioni.
Kernel ottimizzati specializzati di basso livello per le operazioni più intensive dal punto di vista computazionale utilizzate durante la ricerca o la costruzione. Sono supportate più piattaforme hardware. Oltre ai kernel che calcolano le distanze per varie metriche, Cardinal contiene anche kernel fusi e kernel per il preprocessing dei dati.
Strutture di supporto, come operazioni asincrone, capacità di I/O mappato in memoria, caching, allocatori di memoria, logging, ecc.
Knowhere vs Cardinal
La libreria Knowhere è un nucleo interno di Milvus open-source, responsabile della ricerca vettoriale. Knowhere si basa su versioni modificate di librerie open-source standard del settore, come Faiss, DiskANN e hnswlib.
Forniamo un confronto tra Knowhere e Cardinal:
| Funzionalità | Knowhere | Cardinal |
|---|---|---|
| Prontezza per la produzione | Sì | Sì |
| Capacità di scalabilità | Sì | Sì |
| Filosofia di progettazione | Sperimentazione e flessibilità | Ambito ristretto, con priorità al miglioramento delle funzionalità esistenti per le prestazioni |
| Compatibilità host | Tutti i tipi di host | Ottimizzato per l’ambiente host di Zilliz Cloud |
| Dipendenza | Si basa su librerie e implementazioni OSS note | Contiene modifiche e ottimizzazioni non banali |
Entrambi sono pronti per la produzione e forniscono tutte le capacità di scalabilità di cui Milvus e Zilliz Cloud hanno bisogno.
Knowhere è progettato tenendo presenti sperimentazione e flessibilità. Cardinal ha un ambito più ristretto, dando priorità al miglioramento delle funzionalità esistenti per aumentare velocità e prestazioni piuttosto che introdurre nuove funzionalità estese.
Poiché Knowhere è open-source e può essere distribuito in molti ambienti diversi, funziona su tutti i tipi di host. Cardinal è ottimizzato per l’ambiente host di Zilliz Cloud.
Knowhere si basa su librerie e implementazioni OSS note(come Faiss, DiskANN e hnswlib). Cardinal contiene modifiche e ottimizzazioni non banali.
Cosa rende Cardinal così veloce
Cardinal implementa varie ottimizzazioni relative agli algoritmi, ingegneristiche e di basso livello. Cardinal introduce il meccanismo AUTOINDEX, che seleziona automaticamente la migliore strategia di ricerca e il miglior indice per il dataset. Questo elimina la necessità di regolazione manuale, facendo risparmiare tempo e fatica agli sviluppatori.
Approfondiamo i dettagli.
Ottimizzazioni degli algoritmi
Questa forma di ottimizzazione migliora significativamente l’accuratezza e l’efficacia del processo di ricerca, una pipeline multifaccettata che coinvolge vari algoritmi che lavorano in tandem. Numerosi algoritmi all’interno di questa pipeline possono essere perfezionati per aumentare le prestazioni complessive. Tra i candidati più rilevanti per le ottimizzazioni degli algoritmi all’interno di Cardinal figurano:
Algoritmi di ricerca, che comprendono sia approcci basati su IVF sia approcci basati su grafi,
Algoritmi progettati per aiutare la ricerca a mantenere il tasso di recall richiesto, indipendentemente dalla percentuale di campioni filtrati,
Iterazioni avanzate di algoritmi di ricerca best-first,
Algoritmi personalizzati per una struttura dati a coda di priorità.
Gli algoritmi parametrizzabili offrono la flessibilità necessaria per i compromessi, come il bilanciamento tra prestazioni e utilizzo della RAM. Di conseguenza, le ottimizzazioni degli algoritmi per Cardinal comportano anche la selezione di punti operativi ottimali all’interno dello spazio dei parametri.
Ottimizzazioni ingegneristiche
Sebbene gli algoritmi siano inizialmente progettati pensando a macchine di Turing astratte, l'implementazione nel mondo reale deve affrontare sfide come le latenze di rete, le restrizioni dei provider cloud sugli IOPS e le limitazioni della RAM delle macchine, una risorsa preziosa ma finita.
Le ottimizzazioni ingegneristiche garantiscono che la pipeline di ricerca vettoriale di Cardinal rimanga pratica e allineata ai vincoli di calcolo, RAM e altre risorse. Nello sviluppo di Cardinal, combiniamo pratiche standard e tecniche innovative. Questo approccio consente al compilatore C++ di generare codice compilato computazionalmente ottimale, mantenendo al contempo un codice sorgente pulito, misurabile tramite benchmark e facilmente estendibile, che facilita la rapida aggiunta di nuove funzionalità.
Ecco alcuni esempi di pratiche ingegneristiche implementate in Cardinal, che mostrano ottimizzazioni specifiche:
Allocatori di memoria specializzati e pool di memoria,
Codice multi-thread implementato correttamente,
Una struttura gerarchica di componenti che facilita la combinazione di elementi in varie pipeline di ricerca,
Personalizzazione del codice per casi d'uso specifici e critici.
Ottimizzazioni di basso livello
La maggior parte del tempo di ricerca viene spesa in porzioni di codice relativamente piccole note come kernel. L'esempio più semplice è un kernel che calcola la distanza L2 tra due vettori.
Cardinal include numerosi kernel di calcolo per scopi diversi, ciascuno scritto e ottimizzato specificamente per una determinata piattaforma hardware e caso d'uso.
Cardinal supporta le piattaforme hardware x86 e ARM, ma altre piattaforme possono essere aggiunte facilmente.
Per la piattaforma x86, i kernel di Cardinal utilizzano le estensioni F, CD, VL, BW, DQ, VPOPCNTDQ, VBMI, VBMI2, VNNI, BF16 e FP16 di AVX-512. Inoltre, stiamo esplorando l'utilizzo di un nuovo set di istruzioni AMX.
Per la piattaforma ARM, i kernel di Cardinal sono disponibili sia per i set di istruzioni NEON sia SVE.
Garantiamo che Cardinal ottenga il codice più ottimale per i kernel di calcolo. Non ci limitiamo ad affidarci a un moderno compilatore C++ per svolgere il lavoro:
Utilizziamo strumenti dedicati, come Linux perf, per analizzare hotspot e metriche della CPU
Utilizziamo strumenti di analisi del codice macchina, come GodBolt Compiler Explorer e uiCA, per garantire l'uso ottimale delle ‘risorse’ hardware, come il numero di accessi a RAM/cache, istruzioni CPU utilizzate, registri, porte di calcolo.
Utilizziamo un approccio iterativo che alterna le fasi di progettazione, benchmarking, profiling e analisi del codice assembler.
Un kernel di calcolo correttamente ottimizzato può fornire un incremento di velocità di 2x o 3x rispetto a un kernel ingenuo ma non ottimizzato. Ciò può inoltre tradursi in un valore QPS 2x più alto o in requisiti di memoria inferiori del 20% su una macchina host cloud.
AutoIndex: selezione della strategia di ricerca
La ricerca vettoriale è un processo complesso che coinvolge molti componenti indipendenti, tra cui quantizzazione, costruzione dell'indice, algoritmi di ricerca, strutture dati e altro ancora. Ogni componente ha una moltitudine di parametri regolabili. Insieme, formano una gamma estremamente varia di strategie di ricerca vettoriale, e dataset e scenari diversi richiedono strategie di ricerca diverse.
Per sfruttare meglio il potenziale di miglioramento delle prestazioni, Cardinal, oltre a supportare più strategie in ciascun componente, ha implementato un insieme di meccanismi di selezione dinamica della strategia basati sull'IA noti come AUTOINDEX. Esso sceglie in modo adattivo la strategia più adatta in base alla distribuzione del dataset fornito, alla query fornita e alla configurazione hardware. Questo ci aiuta a ottenere prestazioni ottimali soddisfacendo al contempo le esigenze degli utenti in termini di qualità della ricerca.
Benchmark di Cardinal
Abbiamo adottato ANN-benchmarks per supportare Cardinal nel nostro ambiente di test. ANN benchmarks è uno strumento di benchmarking standard per valutare le implementazioni ANNS, e viene eseguito su diversi dataset standard che utilizzano metriche di distanza differenti. Ogni valutazione delle prestazioni viene condotta all'interno di un container docker limitato all'uso di un singolo thread. Le metriche si basano su diverse iterazioni di valutazione, che utilizzano numerose richieste a query singola. I risultati di ogni framework valutato vengono aggregati in una frontiera di Pareto recall-vs-QPS.
Tutti i test sono stati eseguiti sullo stesso tipo di macchina del baseline ann-benchmarks (a gennaio 2024), ovvero una macchina Amazon EC2 r6i.16xlarge con la seguente configurazione:
CPU: Intel(R) Xeon(R) Platinum 8375C CPU @ 2.90GHz
Numero di core CPU: 32
Hyperthreading disabilitato
RAM: 512 GB
OS: Ubuntu 22.04.3 LTS con kernel Linux 6.2.0-1017-aws
Il supporto alle huge page non era abilitato.
I test sono stati eseguiti con l'opzione `--parallelism=31`.
Cardinal è stato compilato usando il compilatore clang 17.0.6.
I risultati dei benchmark presentati di seguito riguardano solo il motore Cardinal e non includono ulteriori ottimizzazioni non legate all'indice fornite da Zilliz Cloud.
Nota: I risultati che includono le ottimizzazioni specifiche di Zilliz Cloud sono forniti sopra, all'inizio dell'articolo.
I seguenti grafici sono stati prodotti prendendo le immagini dei grafici con i risultati presentati sulla pagina GitHub di ANN-benchmark e aggiungendo con precisione una curva Cardinal extra sopra.
Per tutti i benchmark forniti, Cardinal mostra risultati molto competitivi. E c'è spazio per ulteriori miglioramenti.
Cosa c’è dopo?
Il futuro ci porterà nuove sfide, senza dubbio. Requisiti diversi, colli di bottiglia diversi, dataset più grandi. Continuiamo a lavorare per rendere Cardinal ancora migliore.
La via è illuminata. Il percorso è chiaro. Ci serve solo la forza per seguirlo :)
Continua a leggere

Zilliz Cloud Audit Logs Goes GA: Security, Compliance, and Transparency at Scale
Zilliz Cloud Audit Logs are now GA, giving enterprises real-time visibility, compliance-ready trails, and stronger security across AWS, GCP, and Azure.

Announcing the General Availability of Zilliz Cloud BYOC on Google Cloud Platform
Zilliz Cloud BYOC on GCP offers enterprise vector search with full data sovereignty and seamless integration.

AI Agents Are Quietly Transforming E-Commerce — Here’s How
Discover how AI agents transform e-commerce with autonomous decision-making, enhanced product discovery, and vector search capabilities for today's retailers.



