🚀 Попробуйте Zilliz Cloud, полностью управляемый Milvus, бесплатно — ощутите 10-кратное увеличение производительности! Попробовать сейчас>

milvus-logo
LFAI
  • Home
  • Blog
  • Начало работы с кластером Milvus и K8s

Начало работы с кластером Milvus и K8s

  • Engineering
April 03, 2024
Stephen Batifol

Введение

Milvus - это распределенная векторная база данных, предназначенная для хранения, индексации и управления массивными векторами встраивания. Способность эффективно индексировать и искать в триллионах векторов делает Milvus лучшим выбором для рабочих нагрузок искусственного интеллекта и машинного обучения.

Kubernetes (K8s), с другой стороны, отлично подходит для управления и масштабирования контейнерных приложений. Он предоставляет такие функции, как автомасштабирование, самовосстановление и балансировка нагрузки, которые крайне важны для поддержания высокой доступности и производительности в производственных средах.

Зачем использовать их вместе?

K8s может автоматически масштабировать кластеры Milvus в зависимости от рабочей нагрузки. По мере роста данных или увеличения количества запросов K8s может запустить больше экземпляров Milvus, чтобы справиться с нагрузкой, обеспечивая высокую скорость работы приложений.

Одной из отличительных особенностей K8s является горизонтальное масштабирование, которое позволяет легко расширять кластер Milvus. По мере роста вашего массива данных K8s легко справляется с этим ростом, что делает его простым и эффективным решением.

Кроме того, способность обрабатывать запросы также масштабируется горизонтально с помощью K8s. При увеличении нагрузки на запросы K8s может развернуть больше экземпляров Milvus для обработки возросших запросов на поиск сходства, обеспечивая низкую задержку ответов даже при высокой нагрузке.

Необходимые условия и настройка K8s

Необходимые условия

  • Docker - убедитесь, что Docker установлен в вашей системе.

  • Kubernetes - подготовьте кластер Kubernetes. Вы можете использовать minikube для локальной разработки или облачный сервис Kubernetes провайдера для производственных сред.

  • Helm - Установите Helm, менеджер пакетов для Kubernetes, чтобы помочь вам управлять приложениями Kubernetes. Вы можете посмотреть нашу документацию, чтобы узнать, как это сделать https://milvus.io/docs/install_cluster-helm.md.

  • Kubectl - Установите kubectl, инструмент командной строки для взаимодействия с кластерами Kubernetes, чтобы развертывать приложения, проверять и управлять ресурсами кластера, а также просматривать журналы.

Настройка K8s

После установки всего необходимого для работы кластера K8s и если вы использовали minikube, запустите кластер:

minikube start

Проверьте состояние кластера K8s с помощью:

kubectl cluster-info

Развертывание Milvus на K8s

Для этого развертывания мы выбираем Milvus в кластерном режиме, чтобы использовать все его распределенные возможности. Мы будем использовать Helm, чтобы упростить процесс установки.

1. Команда установки Helm

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

Эта команда устанавливает Milvus на ваш кластер K8s с включенной Kafka и отключенным Pulsar. Kafka служит системой обмена сообщениями в Milvus, обеспечивая потоковую передачу данных между различными компонентами. Отключение Pulsar и включение Kafka позволяет адаптировать развертывание к нашим конкретным предпочтениям и требованиям к обмену сообщениями.

2. Переадресация портов

Чтобы получить доступ к Milvus с локальной машины, создайте проброс портов: kubectl port-forward svc/my-milvus 27017:19530.

Эта команда прописывает порт 19530 службы Milvus svc/my-milvus на тот же порт на вашей локальной машине, что позволяет вам подключаться к Milvus с помощью локальных инструментов. Если вы оставите локальный порт неуказанным (как в :19530), K8s выделит доступный порт, сделав его динамическим. Убедитесь, что вы отметили выделенный локальный порт, если вы выбрали этот метод.

3. Проверка развертывания:

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

Вы должны увидеть список стручков, похожий на приведенный выше, все они находятся в состоянии Running. Это означает, что ваш кластер Milvus работает. В частности, ищите 1/1 в столбце READY, что означает, что каждый стручок полностью готов и запущен. Если какие-либо стручки не находятся в состоянии Running, вам, возможно, потребуется провести дополнительные исследования, чтобы обеспечить успешное развертывание.

После развертывания кластера Milvus и подтверждения работы всех компонентов вы можете приступать к сбору и индексированию данных. Это включает в себя подключение к экземпляру Milvus, создание коллекций и вставку векторов для поиска и извлечения.

Сбор и индексирование данных

Чтобы начать сбор и индексирование данных в нашем кластере Milvus, мы воспользуемся pymilvus SDK. Есть два варианта установки:

  • Basic SDK: pip install pymilvus

  • Для богатых текстовых вкраплений и продвинутых моделей: pip install pymilvus[model]

Для вставки данных в наш кластер мы будем использовать pymilvus, вы можете установить SDK только с pip install pymilvus или, если вы хотите извлечь богатые текстовые вкрапления, вы также можете использовать PyMilvus Models, установив pip install pymilvus[model].

Подключение и создание коллекции:

Сначала подключитесь к экземпляру Milvus, используя порт, который вы пробросили ранее. Убедитесь, что URI совпадает с локальным портом, назначенным K8s:

from pymilvus import MilvusClient

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

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

Параметр dimension=5 определяет размер вектора для этой коллекции, что важно для возможностей векторного поиска.

Вставка данных

Вот как вставить начальный набор данных, где каждый вектор представляет элемент, а поле цвета добавляет описательный атрибут:

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)

Приведенный код предполагает, что вы создали коллекцию способом быстрой настройки. Как показано в приведенном выше коде,

Данные для вставки организованы в список словарей, где каждый словарь представляет собой запись данных, называемую сущностью.

Каждый словарь содержит не определяемое схемой поле с именем color.

Каждый словарь содержит ключи, соответствующие как предопределенным, так и динамическим полям.

Вставка еще большего количества данных

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)

После заполнения коллекции можно выполнить поиск сходства, чтобы найти векторы, близкие к вектору запроса. Значение переменной query_vectors - это список, содержащий вложенный список плавающих чисел. Подсписок представляет собой векторное вложение 5 измерений.

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)

Этот запрос ищет 3 вектора, наиболее похожих на вектор нашего запроса, демонстрируя мощные поисковые возможности Milvus.

Удаление Milvus с K8s

После того как вы закончите работу над этим руководством, смело удаляйте Milvus из кластера K8s с помощью команды:helm uninstall my-milvus.

Эта команда удалит все компоненты Milvus, развернутые в выпуске my-milvus, освободив ресурсы кластера.

Заключение

  • Развертывание Milvus на кластере Kubernetes демонстрирует масштабируемость и гибкость векторных баз данных при обработке рабочих нагрузок, связанных с искусственным интеллектом и машинным обучением. Из этого руководства вы узнали об основах настройки Milvus с помощью Helm, создании коллекции, а также о вводе данных и поиске по сходству.

  • Установка Milvus на кластер Kubernetes с помощью Helm должна быть простой. Чтобы углубиться в масштабирование кластеров Milvus для больших наборов данных или более интенсивных рабочих нагрузок, в нашей документации есть подробное руководство https://milvus.io/docs/scaleout.md.

Не стесняйтесь знакомиться с кодом на Github, проверять Milvus, экспериментировать с различными конфигурациями и сценариями использования, а также делиться своим опытом с сообществом, присоединившись к нашему Discord.

Like the article? Spread the word

Продолжить чтение