🚀 Essayez Zilliz Cloud, la version entièrement gérée de Milvus, gratuitement—découvrez des performances 10x plus rapides ! Essayez maintenant>>

milvus-logo
LFAI
  • Home
  • Blog
  • Démarrer avec le cluster Milvus et K8s

Démarrer avec le cluster Milvus et K8s

  • Engineering
April 03, 2024
Stephen Batifol

Introduction

Milvus est une base de données vectorielle distribuée qui vise à stocker, indexer et gérer des vecteurs d'intégration massifs. Sa capacité à indexer et à rechercher efficacement des trillions de vecteurs fait de Milvus un choix de premier ordre pour les charges de travail d'IA et d'apprentissage automatique.

Kubernetes (K8s), quant à lui, excelle dans la gestion et la mise à l'échelle des applications conteneurisées. Il offre des fonctionnalités telles que l'auto-scaling, l'auto-réparation et l'équilibrage de charge, qui sont cruciales pour maintenir une disponibilité et des performances élevées dans les environnements de production.

Pourquoi les utiliser ensemble ?

K8s peut automatiquement mettre à l'échelle les clusters Milvus en fonction de la charge de travail. Lorsque vos données augmentent ou que le nombre de requêtes s'accroît, K8s peut activer davantage d'instances Milvus pour gérer la charge, garantissant ainsi la réactivité de vos applications.

L'une des caractéristiques les plus remarquables de K8s est sa mise à l'échelle horizontale, qui facilite l'extension de votre cluster Milvus. K8s s'adapte sans effort à la croissance de votre ensemble de données, ce qui en fait une solution simple et efficace.

En outre, la capacité à traiter les requêtes s'étend également horizontalement avec K8s. Lorsque la charge de requêtes augmente, K8s peut déployer davantage d'instances Milvus pour traiter les requêtes de recherche par similarité accrues, ce qui garantit des réponses à faible latence même en cas de charges élevées.

Conditions préalables et configuration de K8s

Conditions préalables

  • Docker - Assurez-vous que Docker est installé sur votre système.

  • Kubernetes - Préparez un cluster Kubernetes. Vous pouvez utiliser minikube pour le développement local ou le service Kubernetes d'un fournisseur de cloud pour les environnements de production.

  • Helm - Installez Helm, un gestionnaire de paquets pour Kubernetes, pour vous aider à gérer les applications Kubernetes, vous pouvez consulter notre documentation pour voir comment faire cela https://milvus.io/docs/install_cluster-helm.md.

  • Kubectl - Installez kubectl, un outil de ligne de commande pour interagir avec les clusters Kubernetes, pour déployer des applications, inspecter et gérer les ressources du cluster, et afficher les journaux.

Configuration de K8s

Après avoir installé tout ce qui est nécessaire pour faire fonctionner un cluster K8s, et si vous avez utilisé minikube, démarrez votre cluster avec :

minikube start

Vérifiez l'état de votre cluster K8s avec :

kubectl cluster-info

Déploiement de Milvus sur K8s

Pour ce déploiement, nous avons opté pour Milvus en mode cluster afin de tirer parti de toutes ses capacités distribuées. Nous utiliserons Helm pour rationaliser le processus d'installation.

1. Commande d'installation Helm

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

Cette commande installe Milvus sur votre cluster K8s avec Kafka activé et Pulsar désactivé. Kafka sert de système de messagerie au sein de Milvus, gérant le flux de données entre les différents composants. La désactivation de Pulsar et l'activation de Kafka permettent d'adapter le déploiement à nos préférences et exigences spécifiques en matière de messagerie.

2. Transfert de port

Pour accéder à Milvus à partir de votre machine locale, créez une redirection de port : kubectl port-forward svc/my-milvus 27017:19530.

Cette commande fait correspondre le port 19530 du service Milvus svc/my-milvus au même port sur votre machine locale, ce qui vous permet de vous connecter à Milvus à l'aide d'outils locaux. Si vous ne précisez pas le port local (comme dans :19530), K8s attribuera un port disponible, ce qui le rendra dynamique. Veillez à noter le port local alloué si vous choisissez cette méthode.

3. Vérification du déploiement :

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

Vous devriez voir une liste de pods similaire à la sortie ci-dessus, tous dans l'état Running (en cours d'exécution). Cela indique que votre cluster Milvus est opérationnel. Plus précisément, recherchez le chiffre 1/1 sous la colonne READY, qui signifie que chaque module est entièrement prêt et en cours d'exécution. Si certains pods ne sont pas dans l'état Running, il se peut que vous deviez enquêter davantage pour garantir un déploiement réussi.

Une fois votre cluster Milvus déployé et tous les composants confirmés en cours d'exécution, vous êtes maintenant prêt à procéder à l'ingestion et à l'indexation des données. Cela implique la connexion à votre instance Milvus, la création de collections et l'insertion de vecteurs pour la recherche et l'extraction.

Ingestion et indexation des données

Pour commencer à ingérer et à indexer des données dans notre cluster Milvus, nous allons utiliser le SDK pymilvus. Il existe deux options d'installation :

  • SDK de base : pip install pymilvus

  • Pour les embeddings de texte riche et les modèles avancés : pip install pymilvus[model]

Pour insérer des données dans notre cluster, nous utiliserons pymilvus, vous pouvez installer le SDK uniquement avec pip install pymilvus ou, si vous souhaitez extraire des incorporations de texte riche, vous pouvez également utiliser PyMilvus Models en installant pip install pymilvus[model].

Connexion et création d'une collection :

Tout d'abord, connectez-vous à votre instance Milvus en utilisant le port que vous avez transféré précédemment. Assurez-vous que l'URI correspond au port local attribué par K8s :

from pymilvus import MilvusClient

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

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

Le paramètre dimension=5 définit la taille du vecteur pour cette collection, essentielle pour les capacités de recherche vectorielle.

Insérer des données

Voici comment insérer un premier ensemble de données, où chaque vecteur représente un élément et où le champ de couleur ajoute un attribut descriptif :

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)

Le code fourni suppose que vous avez créé une collection à l'aide de la procédure d'installation rapide. Comme le montre le code ci-dessus,

Les données à insérer sont organisées en une liste de dictionnaires, où chaque dictionnaire représente un enregistrement de données, appelé entité.

Chaque dictionnaire contient un champ non défini par le schéma, nommé couleur.

Chaque dictionnaire contient les clés correspondant aux champs prédéfinis et dynamiques.

Insérer encore plus de données

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)

Après avoir rempli la collection, vous pouvez effectuer une recherche de similarité pour trouver des vecteurs proches d'un vecteur d'interrogation. La valeur de la variable query_vectors est une liste contenant une sous-liste de valeurs flottantes. La sous-liste représente un encastrement vectoriel à 5 dimensions.

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)

Cette requête recherche les 3 vecteurs les plus similaires à notre vecteur d'interrogation, démontrant ainsi les puissantes capacités de recherche de Milvus.

Désinstaller Milvus de K8s

Une fois que vous avez terminé ce tutoriel, n'hésitez pas à désinstaller Milvus de votre cluster K8s à l'aide de la commande suivante :helm uninstall my-milvus.

Cette commande supprimera tous les composants Milvus déployés dans la version my-milvus, libérant ainsi les ressources du cluster.

Conclusion

  • Le déploiement de Milvus sur un cluster Kubernetes met en évidence l'évolutivité et la flexibilité des bases de données vectorielles dans le traitement des charges de travail d'IA et d'apprentissage automatique. Grâce à ce tutoriel, vous avez appris les bases de la configuration de Milvus avec Helm, de la création d'une collection et de l'exécution de l'ingestion de données et des recherches de similarité.

  • L'installation de Milvus sur un cluster Kubernetes avec Helm devrait être simple. Pour aller plus loin dans la mise à l'échelle des clusters Milvus pour des ensembles de données plus importants ou des charges de travail plus intensives, notre documentation offre des conseils détaillés https://milvus.io/docs/scaleout.md.

N'hésitez pas à consulter le code sur Github, à tester Milvus, à expérimenter différentes configurations et différents cas d'utilisation, et à partager vos expériences avec la communauté en rejoignant notre Discord.

Like the article? Spread the word

Continuer à Lire