Testate e distribuite rapidamente le soluzioni di ricerca vettoriale con il Bootcamp Milvus 2.0
Con il rilascio di Milvus 2.0, il team ha rinnovato il bootcamp di Milvus. Il nuovo e migliorato bootcamp offre guide aggiornate ed esempi di codice più facili da seguire per una varietà di casi d'uso e di implementazioni. Inoltre, questa nuova versione è aggiornata per Milvus 2.0, una nuova versione del database vettoriale più avanzato al mondo.
Stress test del sistema con benchmark da 1 milione e 100 milioni di dati
La directory dei benchmark contiene test di benchmark vettoriali da 1 milione e 100 milioni che indicano la reazione del sistema a insiemi di dati di dimensioni diverse.
Esplora e costruisci le soluzioni più diffuse per la ricerca di similarità vettoriale
L'elenco delle soluzioni comprende i casi d'uso più diffusi di ricerca per similarità vettoriale. Ogni caso d'uso contiene una soluzione notebook e una soluzione distribuibile tramite docker. I casi d'uso includono:
- Ricerca per similarità di immagini
- Ricerca per somiglianza di video
- Ricerca di similarità audio
- Sistema di raccomandazione
- Ricerca molecolare
- Sistema di risposta alle domande
Distribuire rapidamente un'applicazione completamente costruita su qualsiasi sistema
Le soluzioni di distribuzione rapida sono soluzioni dockerizzate che consentono agli utenti di distribuire applicazioni completamente costruite su qualsiasi sistema. Queste soluzioni sono ideali per brevi dimostrazioni, ma richiedono un lavoro supplementare di personalizzazione e comprensione rispetto ai notebook.
Utilizzate i notebook specifici per lo scenario per distribuire facilmente le applicazioni preconfigurate.
I notebook contengono un semplice esempio di implementazione di Milvus per risolvere il problema in un determinato caso d'uso. Ogni esempio può essere eseguito dall'inizio alla fine senza dover gestire file o configurazioni. Ogni quaderno è inoltre facile da seguire e modificabile, il che li rende file di base ideali per altri progetti.
Esempio di notebook per la ricerca della somiglianza delle immagini
La ricerca per somiglianza di immagini è una delle idee alla base di molte tecnologie diverse, tra cui il riconoscimento di oggetti da parte di automobili autonome. Questo esempio spiega come costruire facilmente programmi di computer vision con Milvus.
Questo quaderno ruota attorno a tre elementi:
- server Milvus
- server Redis (per l'archiviazione dei metadati)
- Modello Resnet-18 pre-addestrato.
Passo 1: Scaricare i pacchetti necessari
Iniziare a scaricare tutti i pacchetti necessari per questo progetto. Questo quaderno include una tabella che elenca i pacchetti da utilizzare.
pip install -r requirements.txt
Passo 2: avvio del server
Dopo aver installato i pacchetti, avviare i server e assicurarsi che entrambi funzionino correttamente. Assicurarsi di seguire le istruzioni corrette per l'avvio dei server Milvus e Redis.
Passo 3: Scaricare i dati del progetto
Per impostazione predefinita, questo blocco note estrae un frammento dei dati di VOCImage da usare come esempio, ma qualsiasi directory con immagini dovrebbe funzionare, purché segua la struttura dei file visibile all'inizio del blocco note.
! gdown "https://drive.google.com/u/1/uc?id=1jdudBiUu41kL-U5lhH3ari_WBRXyedWo&export=download"
! tar -xf 'VOCdevkit.zip'
! rm 'VOCdevkit.zip'
Fase 4: connessione ai server
In questo esempio, i server sono in esecuzione sulle porte predefinite su localhost.
connections.connect(host="127.0.0.1", port=19537)
red = redis.Redis(host = '127.0.0.1', port=6379, db=0)
Passo 5: Creare una raccolta
Dopo aver avviato i server, creare una collezione in Milvus per memorizzare tutti i vettori. In questo esempio, la dimensione è impostata a 512, la dimensione dell'output di resnet-18, e la metrica di similarità è impostata sulla distanza euclidea (L2). Milvus supporta diverse metriche di somiglianza.
collection_name = "image_similarity_search"
dim = 512
default_fields = [
schema.FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
schema.FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=dim)
]
default_schema = schema.CollectionSchema(fields=default_fields, description="Image test collection")
collection = Collection(name=collection_name, schema=default_schema)
Fase 6: Creare un indice per la raccolta
Una volta creata la raccolta, è necessario creare un indice per essa. In questo caso, viene utilizzato l'indice IVF_SQ8. Questo indice richiede il parametro "nlist", che indica a Milvus quanti cluster creare all'interno di ciascun file di dati (segmento). Indici diversi richiedono parametri diversi.
default_index = {"index_type": "IVF_SQ8", "params": {"nlist": 2048}, "metric_type": "L2"}
collection.create_index(field_name="vector", index_params=default_index)
collection.load()
Fase 7: Impostazione del modello e del caricatore di dati
Dopo aver costruito l'indice IVF_SQ8, impostare la rete neurale e il caricatore di dati. La rete preaddestrata pytorch resnet-18 utilizzata in questo esempio è priva dell'ultimo strato, che comprime i vettori per la classificazione e può perdere informazioni preziose.
model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet18', pretrained=True)
encoder = torch.nn.Sequential(*(list(model.children())[:-1]))
Il dataset e il caricatore di dati devono essere modificati in modo che siano in grado di preelaborare e raggruppare le immagini, fornendo anche i percorsi dei file delle immagini. Questo può essere fatto con un dataloader torchvision leggermente modificato. Per la preelaborazione, le immagini devono essere ritagliate e normalizzate, poiché il modello resnet-18 è stato addestrato su un intervallo di dimensioni e valori specifici.
dataset = ImageFolderWithPaths(data_dir, transform=transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])]))
dataloader = torch.utils.data.DataLoader(dataset, num_workers=0, batch_si
Fase 8: inserimento dei vettori nella raccolta
Una volta impostata la raccolta, le immagini possono essere elaborate e caricate nella raccolta creata. Per prima cosa le immagini vengono prelevate dal dataloader e passate attraverso il modello resnet-18. I vettori risultanti vengono inseriti nella collezione. Le incorporazioni vettoriali risultanti vengono poi inserite in Milvus, che restituisce un ID univoco per ogni vettore. Gli ID dei vettori e i percorsi dei file immagine vengono quindi inseriti come coppie chiave-valore nel server Redis.
steps = len(dataloader)
step = 0
for inputs, labels, paths in dataloader:
with torch.no_grad():
output = encoder(inputs).squeeze()
output = output.numpy()
mr = collection.insert([output.tolist()])
ids = mr.primary_keys
for x in range(len(ids)):
red.set(str(ids[x]), paths[x])
if step%5 == 0:
print("Insert Step: " + str(step) + "/" + str(steps))
step += 1
Fase 9: condurre una ricerca di somiglianza tra i vettori
Una volta inseriti tutti i dati in Milvus e Redis, è possibile eseguire la ricerca di similarità vettoriale vera e propria. In questo esempio, tre immagini selezionate a caso vengono estratte dal server Redis per una ricerca di similarità vettoriale.
random_ids = [int(red.randomkey()) for x in range(3)]
search_images = [x.decode("utf-8") for x in red.mget(random_ids)]
Queste immagini vengono prima sottoposte alla stessa pre-elaborazione descritta nel passaggio 7 e poi passate attraverso il modello resnet-18.
transform_ops = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])
embeddings = [transform_ops(Image.open(x)) for x in search_images]
embeddings = torch.stack(embeddings, dim=0)
with torch.no_grad():
embeddings = encoder(embeddings).squeeze().numpy()
Quindi le incorporazioni vettoriali risultanti vengono utilizzate per eseguire una ricerca. Per prima cosa, si impostano i parametri di ricerca, tra cui il nome della raccolta da cercare, nprobe (il numero di cluster da cercare) e top_k (il numero di vettori restituiti). In questo esempio, la ricerca dovrebbe essere molto veloce.
search_params = {"metric_type": "L2", "params": {"nprobe": 32}}
start = time.time()
results = collection.search(embeddings, "vector", param=search_params, limit=3, expr=None)
end = time.time() - start
Passo 10: Risultati della ricerca di immagini
Gli ID dei vettori restituiti dalle query vengono utilizzati per trovare le immagini corrispondenti. Matplotlib viene quindi utilizzato per visualizzare i risultati della ricerca di immagini.
pic1.png
pic2.png
pic3.png
Imparare a distribuire Milvus in ambienti diversi
La sezione "Deployments" del nuovo bootcamp contiene tutte le informazioni per utilizzare Milvus in diversi ambienti e configurazioni. Include la distribuzione di Mishard, l'uso di Kubernetes con Milvus, il bilanciamento del carico e altro ancora. Ogni ambiente ha una guida dettagliata che spiega passo dopo passo come far funzionare Milvus in esso.
Non siate estranei
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word