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

milvus-logo
LFAI

HomeBlogsErste Schritte mit Milvus-Cluster und K8s

Erste Schritte mit Milvus-Cluster und K8s

  • Engineering
April 03, 2024
Stephen Batifol

Einführung

Milvus ist eine verteilte Vektordatenbank, die auf die Speicherung, Indizierung und Verwaltung umfangreicher Einbettungsvektoren abzielt. Seine Fähigkeit, Billionen von Vektoren effizient zu indizieren und zu durchsuchen, macht Milvus zur ersten Wahl für KI- und maschinelle Lernprozesse.

Kubernetes (K8s) hingegen zeichnet sich durch die Verwaltung und Skalierung von containerisierten Anwendungen aus. Es bietet Funktionen wie automatische Skalierung, Selbstheilung und Lastausgleich, die für die Aufrechterhaltung hoher Verfügbarkeit und Leistung in Produktionsumgebungen entscheidend sind.

Warum sollten Sie sie zusammen verwenden?

K8s kann die Milvus-Cluster automatisch entsprechend der Arbeitslast skalieren. Wenn Ihre Daten wachsen oder die Anzahl der Abfragen zunimmt, kann K8s weitere Milvus-Instanzen aufsetzen, um die Last zu bewältigen und sicherzustellen, dass Ihre Anwendungen reaktionsschnell bleiben.

Eine der herausragenden Eigenschaften von K8s ist die horizontale Skalierung, die die Erweiterung Ihres Milvus-Clusters zu einem Kinderspiel macht. Wenn Ihr Datenbestand wächst, passt sich K8s diesem Wachstum mühelos an und ist damit eine unkomplizierte und effiziente Lösung.

Darüber hinaus lässt sich die Fähigkeit, Abfragen zu verarbeiten, mit K8s ebenfalls horizontal skalieren. Wenn die Abfragelast ansteigt, kann K8s weitere Milvus-Instanzen bereitstellen, um die zunehmenden Ähnlichkeitssuchabfragen zu bewältigen und selbst bei hoher Last niedrige Latenzzeiten zu gewährleisten.

Voraussetzungen & Einrichten von K8s

Voraussetzungen

  • Docker - Stellen Sie sicher, dass Docker auf Ihrem System installiert ist.

  • Kubernetes - Halten Sie einen Kubernetes-Cluster bereit. Sie können minikube für die lokale Entwicklung oder den Kubernetes-Dienst eines Cloud-Anbieters für Produktionsumgebungen verwenden.

  • Helm - Installieren Sie Helm, einen Paketmanager für Kubernetes, der Sie bei der Verwaltung von Kubernetes-Anwendungen unterstützt. Wie das geht, erfahren Sie in unserer Dokumentation https://milvus.io/docs/install_cluster-helm.md

  • Kubectl - Installieren Sie kubectl, ein Befehlszeilentool für die Interaktion mit Kubernetes-Clustern, um Anwendungen bereitzustellen, Cluster-Ressourcen zu prüfen und zu verwalten und Protokolle anzuzeigen.

Einrichten von K8s

Nachdem Sie alles installiert haben, was Sie für den Betrieb eines K8s-Clusters benötigen, und wenn Sie minikube verwendet haben, starten Sie Ihren Cluster mit:

minikube start

Überprüfen Sie den Status Ihres K8s-Clusters mit:

kubectl cluster-info

Einsatz von Milvus auf K8s

Für diesen Einsatz entscheiden wir uns für Milvus im Clustermodus, um seine vollen verteilten Fähigkeiten zu nutzen. Wir werden Helm verwenden, um den Installationsprozess zu optimieren.

1. Helm-Installationsbefehl

helm install my-milvus milvus/milvus --set pulsar.enabled=false --set kafka.enabled=true

Dieser Befehl installiert Milvus auf Ihrem K8s-Cluster mit aktiviertem Kafka und deaktiviertem Pulsar. Kafka dient als Messaging-System innerhalb von Milvus und wickelt das Daten-Streaming zwischen verschiedenen Komponenten ab. Durch die Deaktivierung von Pulsar und die Aktivierung von Kafka wird die Bereitstellung auf unsere spezifischen Messaging-Vorlieben und -Anforderungen zugeschnitten.

2. Portweiterleitung

Um von Ihrem lokalen Rechner aus auf Milvus zuzugreifen, erstellen Sie eine Portweiterleitung: kubectl port-forward svc/my-milvus 27017:19530.

Dieser Befehl ordnet den Port 19530 des Milvus-Dienstes svc/my-milvus dem gleichen Port auf Ihrem lokalen Rechner zu, so dass Sie mit lokalen Tools eine Verbindung zu Milvus herstellen können. Wenn Sie den lokalen Port nicht angeben (wie in :19530), weist K8s einen verfügbaren Port zu, so dass dieser dynamisch ist. Stellen Sie sicher, dass Sie den zugewiesenen lokalen Port notieren, wenn Sie diese Methode wählen.

3. Überprüfen des Einsatzes:

kubectl get pods 

NAME                                    READY   STATUS    RESTARTS   AGE
my-milvus-datacoord-595b996bd4-zprpd    1/1     Running   0          85m
my-milvus-datanode-d9d555785-47nkt      1/1     Running   0          85m
my-milvus-etcd-0                        1/1     Running   0          84m
my-milvus-etcd-1                        1/1     Running   0          85m
my-milvus-etcd-2                        1/1     Running   0          85m
my-milvus-indexcoord-65bc68968c-6jg6q   1/1     Running   0          85m
my-milvus-indexnode-54586f55d-z9vx4     1/1     Running   0          85m
my-milvus-kafka-0                       1/1     Running   0          85m
my-milvus-kafka-1                       1/1     Running   0          85m
my-milvus-kafka-2                       1/1     Running   0          85m
my-milvus-minio-0                       1/1     Running   0          96m
my-milvus-minio-1                       1/1     Running   0          96m
my-milvus-minio-2                       1/1     Running   0          96m
my-milvus-minio-3                       1/1     Running   0          96m
my-milvus-proxy-76bb7d497f-sqwvd        1/1     Running   0          85m
my-milvus-querycoord-6f4c7b7598-b6twj   1/1     Running   0          85m
my-milvus-querynode-677bdf485b-ktc6m    1/1     Running   0          85m
my-milvus-rootcoord-7498fddfd8-v5zw8    1/1     Running   0          85m
my-milvus-zookeeper-0                   1/1     Running   0          85m
my-milvus-zookeeper-1                   1/1     Running   0          85m
my-milvus-zookeeper-2                   1/1     Running   0          85m

Sie sollten eine Liste von Pods sehen, die der obigen Ausgabe ähnelt und sich alle im Status Running befinden. Dies zeigt an, dass Ihr Milvus-Cluster betriebsbereit ist. Achten Sie insbesondere auf die 1/1 in der Spalte READY, was bedeutet, dass jeder Pod voll einsatzbereit ist und läuft. Sollten sich einige Pods nicht im Status "Running" befinden, müssen Sie möglicherweise weitere Untersuchungen durchführen, um eine erfolgreiche Bereitstellung zu gewährleisten.

Nachdem Ihr Milvus-Cluster bereitgestellt wurde und alle Komponenten als lauffähig bestätigt wurden, können Sie nun mit der Datenaufnahme und Indizierung fortfahren. Dies beinhaltet die Verbindung zu Ihrer Milvus-Instanz, die Erstellung von Sammlungen und das Einfügen von Vektoren für die Suche und den Abruf.

Datenerfassung und Indizierung

Um mit dem Ingesting und der Indizierung von Daten in unserem Milvus-Cluster zu beginnen, verwenden wir das pymilvus SDK. Es gibt zwei Installationsoptionen:

  • Basis-SDK: pip install pymilvus

  • Für Rich Text Embeddings und erweiterte Modelle: pip install pymilvus[model]

Um Daten in unseren Cluster einzufügen, werden wir pymilvus verwenden. Sie können das SDK entweder nur mit pip install pymilvus installieren oder, wenn Sie Rich-Text-Einbettungen extrahieren möchten, können Sie auch PyMilvus Models verwenden, indem Sie pip install pymilvus[model] installieren.

Verbinden und Erstellen einer Sammlung:

Verbinden Sie sich zunächst mit Ihrer Milvus-Instanz unter Verwendung des Ports, den Sie zuvor weitergeleitet haben. Stellen Sie sicher, dass die URI mit dem von K8s zugewiesenen lokalen Port übereinstimmt:

from pymilvus import MilvusClient

client = MilvusClient(
        uri="http://127.0.0.1:52070",
    )

client.create_collection(collection_name="quick_setup", dimension=5)

Der Parameter dimension=5 legt die Vektorgröße für diese Sammlung fest, die für die Vektorsuchfunktionen wichtig ist.

Daten einfügen

So fügen Sie einen ersten Datensatz ein, wobei jeder Vektor ein Element darstellt und das Farbfeld ein beschreibendes Attribut hinzufügt:

data=[
    {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},
    {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},
    {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},
    {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},
    {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},
    {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},
    {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},
    {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},
    {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},
    {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}
]

res = client.insert(
    collection_name="quick_setup",
    data=data
)

print(res)

Der mitgelieferte Code setzt voraus, dass Sie eine Sammlung auf die Art der Schnelleinrichtung erstellt haben. Wie im obigen Code gezeigt,

Die einzufügenden Daten werden in einer Liste von Wörterbüchern organisiert, wobei jedes Wörterbuch einen Datensatz darstellt, der als Entität bezeichnet wird.

Jedes Wörterbuch enthält ein nicht schema-definiertes Feld namens Farbe.

Jedes Wörterbuch enthält die Schlüssel, die sowohl den vordefinierten als auch den dynamischen Feldern entsprechen.

Noch mehr Daten einfügen

colors = ["green", "blue", "yellow", "red", "black", "white", "purple", "pink", "orange", "brown", "grey"]
data = [ {
    "id": i, 
    "vector": [ random.uniform(-1, 1) for _ in range(5) ], 
    "color": f"{random.choice(colors)}_{str(random.randint(1000, 9999))}" 
} for i in range(1000) ]

res = client.insert(
    collection_name="quick_setup",
    data=data[10:]
)

print(res)

Nachdem Sie die Sammlung aufgefüllt haben, können Sie eine Ähnlichkeitssuche durchführen, um Vektoren zu finden, die einem Abfragevektor ähnlich sind. Der Wert der Variablen query_vectors ist eine Liste mit einer Teilliste von Floats. Die Teilliste stellt eine Vektoreinbettung mit 5 Dimensionen dar.

query_vectors = [
    [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648]
]

res = client.search(
    collection_name="quick_setup",     # target collection
    data=query_vectors,                # query vectors
    limit=3,                           # number of returned entities
)

print(res)

Diese Abfrage sucht nach den 3 Vektoren, die unserem Abfragevektor am ähnlichsten sind, und demonstriert die leistungsstarken Suchfunktionen von Milvus.

Deinstallation von Milvus von K8s

Wenn Sie mit diesem Tutorial fertig sind, können Sie Milvus von Ihrem K8s-Cluster mit folgendem Befehl deinstallieren:helm uninstall my-milvus.

Dieser Befehl entfernt alle Milvus-Komponenten, die in der Version my-milvus bereitgestellt wurden, und setzt so Cluster-Ressourcen frei.

Schlussfolgerung

  • Der Einsatz von Milvus auf einem Kubernetes-Cluster zeigt die Skalierbarkeit und Flexibilität von Vektordatenbanken bei der Verarbeitung von KI- und Machine-Learning-Workloads. In diesem Lernprogramm haben Sie die Grundlagen für die Einrichtung von Milvus mit Helm, die Erstellung einer Sammlung und die Durchführung von Dateningestion und Ähnlichkeitssuchen gelernt.

  • Die Installation von Milvus auf einem Kubernetes-Cluster mit Helm sollte einfach sein. Wenn Sie sich eingehender mit der Skalierung von Milvus-Clustern für größere Datensätze oder intensivere Arbeitslasten befassen möchten, bietet unsere Dokumentation eine ausführliche Anleitung https://milvus.io/docs/scaleout.md

Schauen Sie sich den Code auf Github an, testen Sie Milvus, experimentieren Sie mit verschiedenen Konfigurationen und Anwendungsfällen, und teilen Sie Ihre Erfahrungen mit der Community, indem Sie unserem Discord beitreten.

Like the article? Spread the word

Weiterlesen