Produkt-FAQ
Wie viel kostet Milvus?
Milvus ist ein 100% kostenloses Open-Source-Projekt.
Bitte halten Sie sich an die Apache License 2.0, wenn Sie Milvus für Produktions- oder Vertriebszwecke verwenden.
Zilliz, das Unternehmen hinter Milvus, bietet auch eine vollständig verwaltete Cloud-Version der Plattform für diejenigen an, die keine eigene verteilte Instanz erstellen und warten möchten. Zilliz Cloud sorgt automatisch für die Zuverlässigkeit der Daten und ermöglicht es den Nutzern, nur für das zu zahlen, was sie verwenden.
Unterstützt Milvus nicht-x86-Architekturen?
Milvus kann nicht auf nicht-x86 Plattformen installiert oder ausgeführt werden.
Ihre CPU muss einen der folgenden Befehlssätze unterstützen, um Milvus auszuführen: SSE4.2, AVX, AVX2, AVX512. Dies sind alles x86-spezifische SIMD-Befehlssätze.
Wo speichert Milvus Daten?
Milvus arbeitet mit zwei Arten von Daten, eingefügten Daten und Metadaten.
Eingefügte Daten, einschließlich Vektordaten, skalare Daten und sammlungsspezifische Schemata, werden im persistenten Speicher als inkrementelles Protokoll gespeichert. Milvus unterstützt mehrere Objektspeicher-Backends, darunter MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS und Tencent Cloud Object Storage (COS).
Die Metadaten werden innerhalb von Milvus generiert. Jedes Milvus-Modul hat seine eigenen Metadaten, die in etcd gespeichert werden.
Warum gibt es keine Vektordaten in etcd?
etcd speichert Milvus-Modul-Metadaten; MinIO speichert Entitäten.
Unterstützt Milvus das gleichzeitige Einfügen und Suchen von Daten?
Ja. Einfügeoperationen und Abfrageoperationen werden von zwei separaten Modulen gehandhabt, die voneinander unabhängig sind. Aus der Sicht des Clients ist ein Einfügevorgang abgeschlossen, wenn die eingefügten Daten in die Nachrichtenwarteschlange gelangen. Die eingefügten Daten sind jedoch nicht durchsuchbar, bis sie in den Abfrageknoten geladen werden. Erreicht die Segmentgröße nicht den Schwellenwert für die Indexerstellung (standardmäßig 512 MB), greift Milvus auf die Brute-Force-Suche zurück, und die Abfrageleistung kann beeinträchtigt werden.
Können Vektoren mit doppelten Primärschlüsseln in Milvus eingefügt werden?
Ja. Milvus prüft nicht, ob es sich bei den Primärschlüsseln der Vektoren um Duplikate handelt.
Wenn Vektoren mit doppelten Primärschlüsseln eingefügt werden, behandelt Milvus dies dann als Aktualisierungsvorgang?
Nein. Milvus unterstützt derzeit keine Aktualisierungsoperationen und prüft nicht, ob Entity-Primärschlüssel doppelt vorhanden sind. Sie sind dafür verantwortlich, dass die Primärschlüssel der Entitäten eindeutig sind, und wenn sie es nicht sind, kann Milvus mehrere Entitäten mit doppelten Primärschlüsseln enthalten.
In diesem Fall bleibt unbekannt, welche Datenkopie bei einer Abfrage zurückgegeben wird. Diese Einschränkung wird in zukünftigen Versionen behoben werden.
Wie lang dürfen selbst definierte Entitätsprimärschlüssel maximal sein?
Entitäts-Primärschlüssel müssen nicht-negative 64-Bit-Ganzzahlen sein.
Wie groß ist die maximale Datenmenge, die pro Einfügevorgang hinzugefügt werden kann?
Ein Einfügevorgang darf eine Größe von 1.024 MB nicht überschreiten. Dies ist eine von gRPC festgelegte Grenze.
Wirkt sich die Größe der Sammlung auf die Abfrageleistung bei der Suche in einer bestimmten Partition aus?
Nein. Wenn Partitionen für eine Suche angegeben werden, durchsucht Milvus nur die angegebenen Partitionen.
Muss Milvus die gesamte Sammlung laden, wenn Partitionen für eine Suche angegeben werden?
Das hängt davon ab, welche Daten für die Suche benötigt werden. Alle Partitionen, die im Suchergebnis auftauchen könnten, müssen vor der Suche geladen werden.
- Wenn Sie z. B. nur bestimmte Partitionen durchsuchen wollen, müssen Sie nicht alle laden. Rufen Sie
load_partition()
auf, um die gewünschte(n) Partition(en) zu laden , und geben Sie dann die Partition(en) in dem Methodenaufrufsearch()
an. - Wenn Sie alle Partitionen durchsuchen wollen, rufen Sie
load_collection()
auf, um die gesamte Sammlung einschließlich aller Partitionen zu laden. - Wenn Sie die Sammlung oder bestimmte Partition(en) vor der Suche nicht laden, wird Milvus einen Fehler zurückgeben.
Können Indizes nach dem Einfügen von Vektoren erstellt werden?
Ja. Wenn zuvor ein Index für eine Sammlung durch create_index()
erstellt wurde, erstellt Milvus automatisch einen Index für die später eingefügten Vektoren. Milvus erstellt jedoch erst dann einen Index, wenn die neu eingefügten Vektoren ein ganzes Segment füllen und die neu erstellte Indexdatei von der vorherigen getrennt ist.
Wie unterscheiden sich die Indizes FLAT und IVF_FLAT?
Der IVF_FLAT-Index unterteilt den Vektorraum in Listencluster. Bei dem Standardlistenwert von 16.384 vergleicht Milvus die Abstände zwischen dem Zielvektor und den Mittelpunkten aller 16.384 Cluster, um die nächstgelegenen Cluster zu ermitteln. Milvus vergleicht dann die Abstände zwischen dem Zielvektor und den Vektoren in den ausgewählten Clustern, um die nächstgelegenen Vektoren zu ermitteln. Im Gegensatz zu IVF_FLAT vergleicht FLAT direkt die Abstände zwischen dem Zielvektor und allen anderen Vektoren.
Wenn die Gesamtzahl der Vektoren annähernd nlist entspricht, ist der Unterschied zwischen IVF_FLAT und FLAT in Bezug auf den Rechenaufwand und die Suchleistung gering. Sobald jedoch die Anzahl der Vektoren nlist um den Faktor zwei oder mehr übersteigt, beginnt IVF_FLAT Leistungsvorteile zu zeigen.
Siehe Vektorindex für weitere Informationen.
Wie bündelt Milvus Daten?
Milvus gibt einen Erfolg zurück, wenn die eingefügten Daten in die Nachrichtenwarteschlange aufgenommen wurden. Die Daten werden jedoch noch nicht auf die Festplatte gespült. Dann schreibt der Datenknoten von Milvus die Daten in der Nachrichtenwarteschlange als inkrementelle Protokolle in den permanenten Speicher. Wenn flush()
aufgerufen wird, wird der Datenknoten gezwungen, alle Daten in der Nachrichtenwarteschlange sofort in den permanenten Speicher zu schreiben.
Was ist Normalisierung? Warum ist Normalisierung erforderlich?
Normalisierung bezieht sich auf den Prozess der Konvertierung eines Vektors, so dass seine Norm gleich 1 ist. Wenn das innere Produkt zur Berechnung der Vektorähnlichkeit verwendet wird, müssen die Vektoren normalisiert werden. Nach der Normalisierung ist das innere Produkt gleich der Kosinusähnlichkeit.
Siehe Wikipedia für weitere Informationen.
Warum liefern der euklidische Abstand (L2) und das innere Produkt (IP) unterschiedliche Ergebnisse?
Für normalisierte Vektoren ist der euklidische Abstand (L2) mathematisch äquivalent zum inneren Produkt (IP). Wenn diese Ähnlichkeitsmetriken unterschiedliche Ergebnisse liefern, prüfen Sie, ob Ihre Vektoren normalisiert sind
Gibt es eine Grenze für die Gesamtzahl der Sammlungen und Unterteilungen in Milvus?
Ja. Sie können bis zu 65.535 Sammlungen in einer Milvus-Instanz erstellen. Bei der Berechnung der Anzahl der vorhandenen Sammlungen zählt Milvus alle Sammlungen, die Scherben und Partitionen enthalten.
Nehmen wir zum Beispiel an, Sie haben bereits 100 Sammlungen angelegt, von denen 60 2 Shards und 4 Partitionen enthalten und die restlichen 40 Sammlungen 1 Shard und 12 Partitionen. Die aktuelle Anzahl der Sammlungen kann wie folgt berechnet werden:
60 * 2 * 4 + 40 * 1 * 12 = 960
Warum erhalte ich weniger als k Vektoren, wenn ich nach topk
Vektoren suche?
Von den Indizes, die Milvus unterstützt, implementieren IVF_FLAT und IVF_SQ8 die k-means Clustering-Methode. Ein Datenraum wird in nlist
Cluster unterteilt und die eingefügten Vektoren werden auf diese Cluster verteilt. Milvus wählt dann die nprobe
nächstgelegenen Cluster aus und vergleicht die Abstände zwischen dem Zielvektor und allen Vektoren in den ausgewählten Clustern, um die endgültigen Ergebnisse zu erhalten.
Wenn nlist
und topk
groß sind und nprobe klein ist, kann die Anzahl der Vektoren in den nprobe-Clustern geringer sein als k
. Wenn Sie also nach den topk
nächstgelegenen Vektoren suchen, ist die Anzahl der zurückgegebenen Vektoren geringer als k
.
Um dies zu vermeiden, versuchen Sie, nprobe
größer und nlist
und k
kleiner zu setzen.
Weitere Informationen finden Sie unter Vektorindex.
Was ist die maximale Vektordimension, die Milvus unterstützt?
Milvus kann standardmäßig Vektoren mit bis zu 32.768 Dimensionen verwalten. Sie können den Wert von Proxy.maxDimension
erhöhen, um einen Vektor mit einer größeren Dimension zu ermöglichen.
Unterstützt Milvus die Apple M1 CPU?
Die aktuelle Milvus-Version unterstützt die Apple M1-CPU nicht direkt. Nach Milvus 2.3 bietet Milvus Docker-Images für die ARM64-Architektur.
Welche Datentypen unterstützt Milvus für das Primärschlüsselfeld?
In der aktuellen Version unterstützt Milvus sowohl INT64 als auch String.
Ist Milvus skalierbar?
Ja. Sie können Milvus-Cluster mit mehreren Knoten über Helm Chart auf Kubernetes bereitstellen. Weitere Anweisungen finden Sie im Scale Guide.
Was sind wachsende und geschlossene Segmente?
Wenn eine Suchanfrage kommt, durchsucht Milvus sowohl inkrementelle als auch historische Daten. Inkrementelle Daten sind aktuelle Aktualisierungen, die in den wachsenden Segmenten gespeichert werden, die im Speicher gepuffert werden, bevor sie den Schwellenwert für die Persistenz im Objektspeicher erreichen, und für die ein effizienterer Index erstellt wird, während historische Daten Aktualisierungen sind, die schon länger zurückliegen. Sie befinden sich in den versiegelten Segmenten, die im Objektspeicher persistiert wurden. Inkrementelle Daten und historische Daten bilden zusammen den gesamten Datenbestand für die Suche. Dieses Design macht alle Daten, die in Milvus aufgenommen werden, sofort durchsuchbar. Bei Milvus Distributed gibt es komplexere Faktoren, die darüber entscheiden, wann ein gerade aufgenommener Datensatz in den Suchergebnissen auftauchen kann. Erfahren Sie mehr darüber unter Konsistenzstufen.
Ist Milvus für die gleichzeitige Suche verfügbar?
Ja. Bei Abfragen in derselben Sammlung durchsucht Milvus gleichzeitig die inkrementellen und historischen Daten. Abfragen zu verschiedenen Sammlungen werden jedoch nacheinander durchgeführt. Da es sich bei den historischen Daten um einen extrem großen Datenbestand handeln kann, sind die Abfragen auf den historischen Daten relativ zeitaufwändiger und werden im Wesentlichen in Serien durchgeführt.
Warum bleiben die Daten in MinIO erhalten, nachdem die entsprechende Sammlung gelöscht wurde?
Die Daten in MinIO sind so konzipiert, dass sie für einen bestimmten Zeitraum gespeichert bleiben, um ein Rollback der Daten zu ermöglichen.
Unterstützt Milvus auch andere Message Engines als Pulsar?
Ja. Kafka wird in Milvus 2.1.0 unterstützt.
Was ist der Unterschied zwischen einer Suche und einer Abfrage?
In Milvus findet eine Vektorähnlichkeitssuche Vektoren auf der Grundlage von Ähnlichkeitsberechnungen und Vektorindexbeschleunigung. Im Gegensatz zu einer Vektorähnlichkeitssuche werden bei einer Vektorabfrage Vektoren durch skalare Filterung auf der Grundlage eines booleschen Ausdrucks abgerufen. Der boolesche Ausdruck filtert auf skalare Felder oder das Primärschlüsselfeld und ruft alle Ergebnisse ab, die den Filtern entsprechen. Bei einer Abfrage sind weder Ähnlichkeitsmetriken noch ein Vektorindex beteiligt.
Warum hat ein Float-Vektorwert in Milvus eine Genauigkeit von 7 Dezimalstellen?
Milvus unterstützt die Speicherung von Vektoren als Float32-Arrays. Ein Float32-Wert hat eine Genauigkeit von 7 Dezimalziffern. Selbst bei einem Float64-Wert, wie z.B. 1.3476964684980388, speichert Milvus ihn als 1.347696. Wenn Sie also einen solchen Vektor von Milvus abrufen, geht die Genauigkeit des Float64-Wertes verloren.
Wie geht Milvus mit Vektordatentypen und Genauigkeit um?
Milvus unterstützt die Vektortypen Binary, Float32, Float16 und BFloat16.
- Binäre Vektoren: Speichern binäre Daten als Sequenzen von 0en und 1en und werden in der Bildverarbeitung und beim Informationsabruf verwendet.
- Float32-Vektoren: Standardspeicherung mit einer Genauigkeit von etwa 7 Dezimalstellen. Auch Float64-Werte werden mit Float32-Präzision gespeichert, was zu einem möglichen Präzisionsverlust beim Abruf führt.
- Float16- und BFloat16-Vektoren: Bieten eine geringere Genauigkeit und einen geringeren Speicherbedarf. Float16 eignet sich für Anwendungen mit begrenzter Bandbreite und begrenztem Speicherplatz, während BFloat16 ein ausgewogenes Verhältnis zwischen Reichweite und Effizienz bietet und häufig beim Deep Learning verwendet wird, um die Rechenanforderungen zu reduzieren, ohne die Genauigkeit wesentlich zu beeinträchtigen.
Unterstützt Milvus die Angabe von Standardwerten für Skalar- oder Vektorfelder?
Derzeit unterstützt Milvus 2.4.x nicht die Angabe von Standardwerten für Skalar- oder Vektorfelder. Diese Funktion ist für zukünftige Versionen geplant.
Wird der Speicherplatz nach dem Löschen von Daten in Milvus sofort wieder freigegeben?
Nein, der Speicherplatz wird nicht sofort freigegeben, wenn Sie Daten in Milvus löschen. Obwohl das Löschen von Daten Entitäten als "logisch gelöscht" markiert, wird der tatsächliche Speicherplatz nicht sofort freigegeben. Dies ist der Grund:
- Verdichtung: Milvus komprimiert Daten automatisch im Hintergrund. Bei diesem Prozess werden kleinere Datensegmente zu größeren zusammengeführt und logisch gelöschte Daten (zum Löschen markierte Entitäten) oder Daten, die ihre Time-To-Live (TTL) überschritten haben, entfernt. Bei der Verdichtung werden jedoch neue Segmente erstellt, während alte als "fallengelassen" markiert werden.
- Garbage Collection: Ein separater Prozess namens Garbage Collection (GC) entfernt diese "Dropped"-Segmente in regelmäßigen Abständen und gibt so den von ihnen belegten Speicherplatz wieder frei. Dies gewährleistet eine effiziente Nutzung des Speichers, kann jedoch zu einer leichten Verzögerung zwischen dem Löschen und der Wiedergewinnung von Speicherplatz führen.
Kann ich eingefügte, gelöschte oder hochgeladene Daten sofort nach dem Vorgang sehen, ohne auf einen Flush zu warten?
Ja, in Milvus ist die Datentransparenz aufgrund der Disaggregationsarchitektur von Storage und Compute nicht direkt an Flush-Vorgänge gebunden. Sie können die Lesbarkeit der Daten über Konsistenzstufen verwalten.
Bei der Auswahl einer Konsistenzstufe sollten Sie die Kompromisse zwischen Konsistenz und Leistung berücksichtigen. Für Operationen, die eine sofortige Sichtbarkeit erfordern, verwenden Sie eine "starke" Konsistenzstufe. Für schnellere Schreibvorgänge sollten Sie eine schwächere Konsistenz bevorzugen (die Daten sind möglicherweise nicht sofort sichtbar). Weitere Informationen finden Sie unter Konsistenz.
Wie lautet der Standardwert von num_partitions
in Milvus nach der Aktivierung der Partitionsschlüssel-Funktion und warum?
Wenn die Partitionsschlüsselfunktion aktiviert ist, wird der Standardwert von num_partitions
in Milvus auf 16
gesetzt. Dieser Standardwert wurde aus Stabilitäts- und Leistungsgründen gewählt. Sie können den Wert num_partitions
nach Bedarf anpassen, indem Sie ihn in der Funktion create_collection
angeben.
Gibt es eine maximale Länge für skalare Filterausdrücke?
Ja, die maximale Länge eines skalaren Filterausdrucks wird durch das RPC-Übertragungslimit begrenzt, das in der Konfigurationsdatei milvus.yaml
definiert ist. Das Limit wird insbesondere durch den Parameter serverMaxRecvSize
im Abschnitt proxy festgelegt:
proxy:
grpc:
serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte
Standardmäßig beträgt die maximale Größe jeder RPC-Anfrage 64 MB. Daher muss die Länge des Filterausdrucks unter diesem Limit liegen, um eine erfolgreiche Verarbeitung zu gewährleisten.
Wie viele Vektoren können bei einer Massenvektorsuche auf einmal angegeben werden? Gibt es eine Begrenzung?
Ja, die Anzahl der Vektoren, die bei einer Bulk-Vektorsuche angegeben werden können, ist durch die RPC-Übertragungsgröße begrenzt, die in der Konfigurationsdatei milvus.yaml
definiert ist. Diese Grenze wird durch den Parameter serverMaxRecvSize
im Abschnitt "Proxy" bestimmt:
proxy:
grpc:
serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte
Standardmäßig beträgt die maximale Größe jeder RPC-Anfrage 64 MB. Daher muss die Gesamtgröße der Eingabevektoren, einschließlich ihrer Dimensionsdaten und Metadaten, unter dieser Grenze liegen, um eine erfolgreiche Ausführung zu gewährleisten.
Haben Sie noch Fragen?
Sie können:
- Schauen Sie sich Milvus auf GitHub an. Sie können gerne Fragen stellen, Ideen austauschen und anderen helfen.
- Treten Sie unserer Slack-Community bei, um Unterstützung zu erhalten und sich mit unserer Open-Source-Community auszutauschen.