🚀 Experimente o Zilliz Cloud, o Milvus totalmente gerenciado, gratuitamente—experimente um desempenho 10x mais rápido! Experimente Agora>>

milvus-logo
LFAI

HomeBlogsIntrodução ao cluster Milvus e ao K8s

Introdução ao cluster Milvus e ao K8s

  • Engineering
April 03, 2024
Stephen Batifol

Introdução

O Milvus é uma base de dados vetorial distribuída que visa armazenar, indexar e gerir vectores de incorporação maciços. Sua capacidade de indexar e pesquisar com eficiência trilhões de vetores torna o Milvus uma opção para cargas de trabalho de IA e aprendizado de máquina.

O Kubernetes (K8s), por outro lado, se destaca no gerenciamento e dimensionamento de aplicativos em contêineres. Ele fornece recursos como dimensionamento automático, autocorreção e balanceamento de carga, que são cruciais para manter a alta disponibilidade e o desempenho em ambientes de produção.

Por que usá-los juntos?

O K8s pode escalar automaticamente os clusters Milvus com base na carga de trabalho. À medida que os seus dados crescem ou o número de consultas aumenta, o K8s pode ativar mais instâncias do Milvus para lidar com a carga, assegurando que as suas aplicações permanecem responsivas.

Uma das caraterísticas de destaque do K8s é o escalonamento horizontal, que facilita a expansão do seu cluster Milvus. À medida que o seu conjunto de dados cresce, o K8s acomoda sem esforço esse crescimento, tornando-o numa solução simples e eficiente.

Além disso, a capacidade de tratar consultas também é escalonada horizontalmente com o K8s. À medida que a carga de consulta aumenta, o K8s pode implantar mais instâncias do Milvus para lidar com o aumento das consultas de pesquisa de similaridade, garantindo respostas de baixa latência mesmo sob cargas pesadas.

Pré-requisitos e configuração do K8s

Pré-requisitos

  • Docker - Certifique-se de que o Docker esteja instalado no seu sistema.

  • Kubernetes - Tenha um cluster do Kubernetes pronto. Você pode usar minikube para desenvolvimento local ou o serviço Kubernetes de um provedor de nuvem para ambientes de produção.

  • Helm - Instale o Helm, um gerenciador de pacotes para Kubernetes, para ajudá-lo a gerenciar aplicativos Kubernetes, você pode verificar nossa documentação para ver como fazer isso https://milvus.io/docs/install_cluster-helm.md

  • Kubectl - Instale kubectl, uma ferramenta de linha de comando para interagir com clusters Kubernetes, para implantar aplicativos, inspecionar e gerenciar recursos de cluster e visualizar logs.

Configurando o K8s

Depois de instalar tudo o que é necessário para executar um cluster K8s, e se tiver usado minikube, inicie o seu cluster com:

minikube start

Verifique o status do seu cluster K8s com:

kubectl cluster-info

Implantação do Milvus no K8s

Para esta implementação, estamos a optar pelo Milvus em modo de cluster para aproveitar todas as suas capacidades distribuídas. Usaremos o Helm, para agilizar o processo de instalação.

1. Comando de instalação do Helm

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

Este comando instala o Milvus no seu cluster K8s com o Kafka ativado e o Pulsar desativado. O Kafka serve como o sistema de mensagens dentro do Milvus, lidando com o fluxo de dados entre diferentes componentes. Desativar o Pulsar e ativar o Kafka adapta a implantação às nossas preferências e requisitos específicos de mensagens.

2. Encaminhamento de portas

Para aceder ao Milvus a partir da sua máquina local, crie um reencaminhamento de porta: kubectl port-forward svc/my-milvus 27017:19530.

Este comando mapeia a porta 19530 do serviço Milvus svc/my-milvus para a mesma porta na sua máquina local, permitindo-lhe ligar-se ao Milvus utilizando ferramentas locais. Se deixar a porta local não especificada (como em :19530), o K8s irá alocar uma porta disponível, tornando-a dinâmica. Certifique-se de que anota a porta local atribuída se escolher este método.

3. Verificando a implantação:

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

Deverá ver uma lista de pods semelhante à saída acima, todos no estado Running. Isto indica que o seu cluster Milvus está operacional. Especificamente, procure o 1/1 na coluna READY, o que significa que cada pod está totalmente pronto e em execução. Se algum pod não estiver no estado Em execução, talvez seja necessário investigar mais para garantir uma implantação bem-sucedida.

Com o cluster do Milvus implantado e todos os componentes confirmados em execução, você está pronto para prosseguir com a ingestão e indexação de dados. Isso envolverá a conexão com a instância do Milvus, a criação de coleções e a inserção de vetores para pesquisa e recuperação.

Ingestão e indexação de dados

Para começar a ingerir e indexar dados em nosso cluster Milvus, usaremos o pymilvus SDK. Existem duas opções de instalação:

  • SDK básico: pip install pymilvus

  • Para embeddings de rich text e modelos avançados: pip install pymilvus[model]

Para inserir dados no nosso cluster, vamos utilizar pymilvus, pode instalar o SDK apenas com pip install pymilvus ou, se quiser extrair rich text embeddings, pode também utilizar PyMilvus Models instalando pip install pymilvus[model].

Ligação e criação de uma coleção:

Primeiro, ligue-se à sua instância Milvus utilizando a porta que encaminhou anteriormente. Certifique-se de que o URI corresponde à porta local atribuída pelo K8s:

from pymilvus import MilvusClient

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

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

O parâmetro dimension=5 define o tamanho do vetor para esta coleção, essencial para as capacidades de pesquisa vetorial.

Inserir dados

Eis como inserir um conjunto inicial de dados, em que cada vetor representa um item, e o campo de cor adiciona um atributo descritivo:

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)

O código fornecido pressupõe que tenha criado uma coleção da forma Configuração rápida. Como mostrado no código acima,

Os dados a inserir são organizados numa lista de dicionários, em que cada dicionário representa um registo de dados, designado por entidade.

Cada dicionário contém um campo não definido pelo esquema chamado cor.

Cada dicionário contém as chaves correspondentes aos campos pré-definidos e dinâmicos.

Inserir ainda mais dados

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)

Depois de preencher a coleção, pode efetuar uma pesquisa de semelhança para encontrar vectores próximos de um vetor de consulta. O valor da variável query_vectors é uma lista que contém uma sub-lista de floats. A sub-lista representa uma incorporação de vetor de 5 dimensões.

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 procura os 3 principais vectores mais semelhantes ao nosso vetor de consulta, demonstrando as poderosas capacidades de pesquisa do Milvus.

Desinstalar o Milvus do K8s

Quando terminar este tutorial, sinta-se à vontade para desinstalar o Milvus do seu cluster K8s com:helm uninstall my-milvus.

Esse comando removerá todos os componentes do Milvus implantados na versão my-milvus, liberando recursos do cluster.

Conclusão

  • A implantação do Milvus em um cluster do Kubernetes mostra a escalabilidade e a flexibilidade dos bancos de dados vetoriais no tratamento de cargas de trabalho de IA e aprendizado de máquina. Por meio deste tutorial, você aprendeu os conceitos básicos de configuração do Milvus com o Helm, criando uma coleção e executando a ingestão de dados e pesquisas de similaridade.

  • A instalação do Milvus em um cluster do Kubernetes com o Helm deve ser simples. Para se aprofundar no dimensionamento de clusters do Milvus para conjuntos de dados maiores ou cargas de trabalho mais intensivas, nossa documentação oferece orientações detalhadas https://milvus.io/docs/scaleout.md

Sinta-se à vontade para conferir o código no Github, conferir o Milvus, experimentar diferentes configurações e casos de uso e compartilhar suas experiências com a comunidade juntando-se ao nosso Discord.

Like the article? Spread the word

Continue Lendo