🚀 Testen Sie Zilliz Cloud, die vollständig verwaltete Milvus, kostenlos – erleben Sie 10x schnellere Leistung! Jetzt testen>>

milvus-logo
LFAI
  • Home
  • Blog
  • Schnelles Testen und Bereitstellen von Vektorsuchlösungen mit dem Milvus 2.0 Bootcamp

Schnelles Testen und Bereitstellen von Vektorsuchlösungen mit dem Milvus 2.0 Bootcamp

  • Engineering
July 15, 2021
milvus

Mit der Veröffentlichung von Milvus 2.0 hat das Team das Milvus-Bootcamp überarbeitet. Das neue und verbesserte Bootcamp bietet aktualisierte Anleitungen und leichter nachvollziehbare Codebeispiele für eine Vielzahl von Anwendungsfällen und Implementierungen. Darüber hinaus wurde diese neue Version für Milvus 2.0 aktualisiert, eine neu gestaltete Version der weltweit fortschrittlichsten Vektordatenbank.

Stresstest für Ihr System anhand von 1M- und 100M-Datensatz-Benchmarks

Das Benchmark-Verzeichnis enthält 1 Million und 100 Millionen Vektor-Benchmark-Tests, die zeigen, wie Ihr System auf unterschiedlich große Datensätze reagieren wird.


Das Lösungsverzeichnis enthält die gängigsten Anwendungsfälle für die Vektorähnlichkeitssuche. Jeder Anwendungsfall enthält eine Notebook-Lösung und eine mit Docker bereitstellbare Lösung. Zu den Anwendungsfällen gehören:


Schnelle Bereitstellung einer vollständig erstellten Anwendung auf einem beliebigen System

Bei den Quick-Deployment-Lösungen handelt es sich um Docker-Lösungen, mit denen Benutzer vollständig erstellte Anwendungen auf jedem beliebigen System bereitstellen können. Diese Lösungen eignen sich ideal für kurze Demos, erfordern aber im Vergleich zu Notebooks mehr Arbeit bei der Anpassung und beim Verständnis.


Verwenden Sie szenariospezifische Notebooks zur einfachen Bereitstellung vorkonfigurierter Anwendungen

Die Notebooks enthalten ein einfaches Beispiel für den Einsatz von Milvus zur Lösung eines Problems in einem bestimmten Anwendungsfall. Jedes der Beispiele kann von Anfang bis Ende ausgeführt werden, ohne dass Dateien oder Konfigurationen verwaltet werden müssen. Jedes Notizbuch ist außerdem leicht nachvollziehbar und veränderbar, so dass es sich ideal als Basis für andere Projekte eignet.


Beispiel für ein Notizbuch zur Bildähnlichkeitssuche

Die Ähnlichkeitssuche von Bildern ist eine der Kernideen hinter vielen verschiedenen Technologien, einschließlich autonomer Autos, die Objekte erkennen. In diesem Beispiel wird erklärt, wie man mit Milvus auf einfache Weise Computer-Vision-Programme erstellen kann.

Dieses Notizbuch dreht sich um drei Dinge:

  • Milvus-Server
  • Redis-Server (für die Speicherung von Metadaten)
  • Vortrainiertes Resnet-18-Modell.

Schritt 1: Herunterladen der benötigten Pakete

Beginnen Sie mit dem Herunterladen aller für dieses Projekt erforderlichen Pakete. Dieses Notizbuch enthält eine Tabelle, in der die zu verwendenden Pakete aufgelistet sind.

pip install -r requirements.txt

Schritt 2: Starten des Servers

Nachdem die Pakete installiert sind, starten Sie die Server und stellen sicher, dass beide ordnungsgemäß laufen. Achten Sie darauf, dass Sie die richtigen Anweisungen zum Starten der Milvus- und Redis-Server befolgen.

Schritt 3: Herunterladen von Projektdaten

Standardmäßig lädt dieses Notizbuch einen Ausschnitt der VOCImage-Daten als Beispiel herunter, aber jedes Verzeichnis mit Bildern sollte funktionieren, solange es der Dateistruktur folgt, die oben im Notizbuch zu sehen ist.

! gdown "https://drive.google.com/u/1/uc?id=1jdudBiUu41kL-U5lhH3ari_WBRXyedWo&export=download"
! tar -xf 'VOCdevkit.zip'
! rm 'VOCdevkit.zip'

Schritt 4: Verbindung zu den Servern herstellen

In diesem Beispiel laufen die Server auf den Standardports auf dem localhost.

connections.connect(host="127.0.0.1", port=19537)
red = redis.Redis(host = '127.0.0.1', port=6379, db=0)

Schritt 5: Erstellen Sie eine Sammlung

Nachdem Sie die Server gestartet haben, erstellen Sie eine Sammlung in Milvus, um alle Vektoren zu speichern. In diesem Beispiel wird die Dimensionsgröße auf 512, die Größe der resnet-18-Ausgabe, und die Ähnlichkeitsmetrik auf den euklidischen Abstand (L2) eingestellt. Milvus unterstützt eine Vielzahl verschiedener Ähnlichkeitsmetriken.

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)

Schritt 6: Erstellen eines Index für die Sammlung

Sobald die Sammlung erstellt ist, erstellen Sie einen Index für sie. In diesem Fall wird der Index IVF_SQ8 verwendet. Dieser Index erfordert den Parameter "nlist", der Milvus mitteilt, wie viele Cluster in jeder Datendatei (Segment) gebildet werden sollen. Verschiedene Indizes erfordern verschiedene Parameter.

default_index = {"index_type": "IVF_SQ8", "params": {"nlist": 2048}, "metric_type": "L2"}
collection.create_index(field_name="vector", index_params=default_index)
collection.load()

Schritt 7: Modell und Datenlader einrichten

Nachdem der IVF_SQ8-Index erstellt wurde, richten Sie das neuronale Netz und den Datenlader ein. Das in diesem Beispiel verwendete vortrainierte pytorch resnet-18 verfügt nicht über die letzte Schicht, die Vektoren für die Klassifizierung komprimiert, wodurch wertvolle Informationen verloren gehen können.

model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet18', pretrained=True)
encoder = torch.nn.Sequential(*(list(model.children())[:-1]))

Der Datensatz und der Datenlader müssen so modifiziert werden, dass sie in der Lage sind, die Bilder vorzuverarbeiten und zu stapeln und gleichzeitig die Dateipfade der Bilder bereitzustellen. Dies kann mit einem leicht modifizierten Torchvision-Datenlader erreicht werden. Für die Vorverarbeitung müssen die Bilder beschnitten und normalisiert werden, da das resnet-18-Modell auf eine bestimmte Größe und einen bestimmten Wertebereich trainiert wurde.

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

Schritt 8: Einfügen von Vektoren in die Sammlung

Wenn die Sammlung eingerichtet ist, können die Bilder verarbeitet und in die erstellte Sammlung geladen werden. Zunächst werden die Bilder vom Datenlader gezogen und durch das resnet-18-Modell geleitet. Die resultierenden Vektoreinbettungen werden dann in Milvus eingefügt, das für jeden Vektor eine eindeutige ID zurückgibt. Die Vektor-IDs und Bilddateipfade werden dann als Schlüssel-Wert-Paare in den Redis-Server eingefügt.

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

Sobald alle Daten in Milvus und Redis eingefügt sind, kann die eigentliche Vektorähnlichkeitssuche durchgeführt werden. In diesem Beispiel werden drei zufällig ausgewählte Bilder aus dem Redis-Server für eine Vektorähnlichkeitssuche herangezogen.

random_ids = [int(red.randomkey()) for x in range(3)]
search_images = [x.decode("utf-8") for x in red.mget(random_ids)]

Diese Bilder durchlaufen zunächst die gleiche Vorverarbeitung wie in Schritt 7 und werden dann durch das resnet-18-Modell gejagt.

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()

Anschließend werden die resultierenden Vektoreinbettungen für eine Suche verwendet. Zunächst werden die Suchparameter festgelegt, darunter der Name der zu durchsuchenden Sammlung, nprobe (die Anzahl der zu durchsuchenden Cluster) und top_k (die Anzahl der zurückgegebenen Vektoren). In diesem Beispiel sollte die Suche sehr schnell sein.

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

Schritt 10: Ergebnisse der Bildsuche

Die von den Abfragen zurückgegebenen Vektor-IDs werden verwendet, um die entsprechenden Bilder zu finden. Matplotlib wird dann verwendet, um die Ergebnisse der Bildsuche anzuzeigen.

pic1.png pic1.png pic2.pngpic2.png pic3.pngpic3.png


Erfahren Sie, wie Sie Milvus in verschiedenen Umgebungen einsetzen können

Der Abschnitt "Einsatz" des neuen Bootcamps enthält alle Informationen zur Verwendung von Milvus in verschiedenen Umgebungen und Konfigurationen. Dazu gehören die Bereitstellung von Mishards, die Verwendung von Kubernetes mit Milvus, Lastausgleich und vieles mehr. Für jede Umgebung gibt es eine detaillierte Schritt-für-Schritt-Anleitung, die erklärt, wie man Milvus in dieser Umgebung zum Laufen bringt.


Seien Sie kein Fremder

  • Lesen Sie unseren Blog.
  • Interagieren Sie mit unserer Open-Source-Community auf Slack.
  • Verwenden Sie Milvus, die beliebteste Vektordatenbank der Welt, auf Github oder tragen Sie zu ihr bei.

    Try Managed Milvus for Free

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

    Get Started

    Like the article? Spread the word

    Weiterlesen