🚀 Prueba Zilliz Cloud, el Milvus completamente gestionado, gratis—¡experimenta un rendimiento 10 veces más rápido! Prueba Ahora>>

milvus-logo
LFAI
  • Home
  • Blog
  • Primeros pasos con Milvus cluster y K8s

Primeros pasos con Milvus cluster y K8s

  • Engineering
April 03, 2024
Stephen Batifol

Introducción

Milvus es una base de datos vectorial distribuida cuyo objetivo es almacenar, indexar y gestionar vectores de incrustación masiva. Su capacidad para indexar y buscar eficientemente entre billones de vectores convierte a Milvus en la opción preferida para las cargas de trabajo de IA y aprendizaje automático.

Kubernetes (K8s), por su parte, destaca en la gestión y escalado de aplicaciones en contenedores. Proporciona funciones como autoescalado, autorreparación y equilibrio de carga, que son cruciales para mantener una alta disponibilidad y rendimiento en entornos de producción.

¿Por qué utilizarlos juntos?

K8s puede escalar automáticamente los clústeres Milvus en función de la carga de trabajo. A medida que crecen sus datos o aumenta el número de consultas, K8s puede hacer girar más instancias de Milvus para manejar la carga, garantizando que sus aplicaciones sigan respondiendo.

Una de las características más destacadas de K8s es su escalado horizontal, que hace que la ampliación de su clúster Milvus sea pan comido. A medida que crece su conjunto de datos, K8s se adapta sin esfuerzo a este crecimiento, lo que lo convierte en una solución sencilla y eficiente.

Además, la capacidad de gestionar consultas también se escala horizontalmente con K8s. A medida que aumenta la carga de consultas, K8s puede desplegar más instancias de Milvus para gestionar el aumento de consultas de búsqueda de similitud, garantizando respuestas de baja latencia incluso con cargas elevadas.

Requisitos previos y configuración de K8s

Requisitos previos

  • Docker - Asegúrese de que Docker está instalado en su sistema.

  • Kubernetes - Tenga listo un clúster Kubernetes. Puede utilizar minikube para el desarrollo local o el servicio Kubernetes de un proveedor en la nube para entornos de producción.

  • Helm - Instala Helm, un gestor de paquetes para Kubernetes, para ayudarte a gestionar aplicaciones Kubernetes, puedes consultar nuestra documentación para ver cómo hacerlo https://milvus.io/docs/install_cluster-helm.md.

  • Kubectl - Instale kubectl, una herramienta de línea de comandos para interactuar con los clústeres Kubernetes, para desplegar aplicaciones, inspeccionar y gestionar los recursos del clúster, y ver los registros.

Configuración de K8s

Después de instalar todo lo necesario para ejecutar un clúster K8s, y si utilizó minikube, inicie su clúster con:

minikube start

Compruebe el estado de su cluster K8s con:

kubectl cluster-info

Desplegando Milvus en K8s

Para este despliegue, estamos optando por Milvus en modo cluster para aprovechar todas sus capacidades distribuidas. Utilizaremos Helm para agilizar el proceso de instalación.

1. Comando de instalación Helm

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

Este comando instala Milvus en su cluster K8s con Kafka habilitado y Pulsar deshabilitado. Kafka sirve como sistema de mensajería dentro de Milvus, manejando el flujo de datos entre los diferentes componentes. Deshabilitar Pulsar y habilitar Kafka adapta el despliegue a nuestras preferencias y requisitos específicos de mensajería.

2. Reenvío de puertos

Para acceder a Milvus desde su máquina local, cree un reenvío de puerto: kubectl port-forward svc/my-milvus 27017:19530.

Este comando asigna el puerto 19530 del servicio Milvus svc/my-milvus al mismo puerto en su máquina local, permitiéndole conectarse a Milvus utilizando herramientas locales. Si deja el puerto local sin especificar (como en :19530), K8s asignará un puerto disponible, haciéndolo dinámico. Asegúrese de anotar el puerto local asignado si elige este método.

3. Verificación del despliegue:

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

Debería ver una lista de pods similar a la salida anterior, todos en estado Running. Esto indica que su cluster Milvus está operativo. En concreto, busque el 1/1 bajo la columna READY, que significa que cada pod está totalmente listo y en ejecución. Si alguno de los pods no está en estado de ejecución, es posible que tenga que investigar más a fondo para garantizar un despliegue correcto.

Con su clúster Milvus desplegado y todos los componentes confirmados en ejecución, ya está listo para proceder a la ingestión e indexación de datos. Esto implicará conectarse a su instancia Milvus, crear colecciones e insertar vectores para búsqueda y recuperación.

Ingesta e indexación de datos

Para comenzar la ingesta e indexación de datos en nuestro cluster Milvus, utilizaremos el SDK pymilvus. Hay dos opciones de instalación:

  • SDK básico: pip install pymilvus

  • Para incrustaciones de texto enriquecido y modelos avanzados: pip install pymilvus[model]

A la hora de insertar datos en nuestro cluster, usaremos pymilvus, puedes instalar el SDK sólo con pip install pymilvus o si quieres extraer rich text embeddings, también puedes usar PyMilvus Models instalando pip install pymilvus[model].

Conexión y creación de una colección:

En primer lugar, conéctese a su instancia de Milvus utilizando el puerto que reenvió anteriormente. Asegúrese de que el URI coincide con el puerto local asignado por K8s:

from pymilvus import MilvusClient

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

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

El parámetro dimension=5 define el tamaño del vector para esta colección, esencial para las capacidades de búsqueda de vectores.

Insertar datos

A continuación se muestra cómo insertar un conjunto inicial de datos, donde cada vector representa un elemento, y el campo de color añade un atributo descriptivo:

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)

El código proporcionado asume que usted ha creado una colección de la manera de Configuración Rápida. Como se muestra en el código anterior,

Los datos a insertar se organizan en una lista de diccionarios, donde cada diccionario representa un registro de datos, denominado como entidad.

Cada diccionario contiene un campo no definido por el esquema denominado color.

Cada diccionario contiene las claves correspondientes a los campos predefinidos y dinámicos.

Insertar aún más datos

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)

Después de rellenar la colección, puede realizar una búsqueda por similitud para encontrar vectores cercanos a un vector de consulta. El valor de la variable query_vectors es una lista que contiene una sublista de floats. La sublista representa una incrustación vectorial de 5 dimensiones.

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)

Esta consulta busca los 3 vectores más similares a nuestro vector de consulta, demostrando las potentes capacidades de búsqueda de Milvus.

Desinstalar Milvus de K8s

Una vez que haya terminado con este tutorial, no dude en desinstalar Milvus de su cluster K8s con:helm uninstall my-milvus.

Este comando eliminará todos los componentes de Milvus desplegados en la versión my-milvus, liberando recursos del cluster.

Conclusión

  • El despliegue de Milvus en un clúster Kubernetes muestra la escalabilidad y flexibilidad de las bases de datos vectoriales en el manejo de cargas de trabajo de IA y aprendizaje automático. A través de este tutorial, usted ha aprendido los conceptos básicos de la configuración de Milvus con Helm, la creación de una colección, y la realización de la ingestión de datos y búsquedas de similitud.

  • Instalar Milvus en un clúster Kubernetes con Helm debería ser sencillo. Para profundizar en el escalado de clusters Milvus para grandes conjuntos de datos o cargas de trabajo más intensivas, nuestra documentación ofrece una guía detallada https://milvus.io/docs/scaleout.md

Siéntase libre de revisar el código en Github, revise Milvus, experimente con diferentes configuraciones y casos de uso, y comparta sus experiencias con la comunidad uniéndose a nuestro Discord.

Like the article? Spread the word

Sigue Leyendo