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

milvus-logo
LFAI
  • Home
  • Blog
  • Testate e distribuite rapidamente le soluzioni di ricerca vettoriale con il Bootcamp Milvus 2.0

Testate e distribuite rapidamente le soluzioni di ricerca vettoriale con il Bootcamp Milvus 2.0

  • Engineering
July 15, 2021
milvus

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.


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:


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

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 pic1.png pic2.pngpic2.png pic3.pngpic3.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

  • Leggete il nostro blog.
  • Interagite con la nostra comunità open-source su Slack.
  • Utilizzate o contribuite a Milvus, il database vettoriale più diffuso al mondo, su Github.

    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