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

milvus-logo
LFAI
  • Home
  • Blog
  • Быстрое тестирование и развертывание решений для векторного поиска с помощью Milvus 2.0 Bootcamp

Быстрое тестирование и развертывание решений для векторного поиска с помощью Milvus 2.0 Bootcamp

  • Engineering
July 15, 2021
milvus

С выходом Milvus 2.0 команда переработала загрузочный лагерь Milvus. Новый и улучшенный буткемп предлагает обновленные руководства и более простые в исполнении примеры кода для различных вариантов использования и развертывания. Кроме того, новая версия обновлена для Milvus 2.0, переосмысленной версии самой передовой в мире векторной базы данных.

Стресс-тестирование системы с использованием эталонных наборов данных объемом 1 и 100 млн.

Каталог эталонов содержит эталонные тесты на 1 и 100 миллионов векторов, которые показывают, как ваша система будет реагировать на наборы данных разного размера.


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


Быстрое развертывание полностью собранного приложения на любой системе

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


Используйте блокноты для конкретных сценариев, чтобы легко развернуть предварительно сконфигурированные приложения.

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


Пример блокнота для поиска сходства изображений

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

Этот блокнот состоит из трех частей:

  • сервер Milvus
  • Сервер Redis (для хранения метаданных)
  • Предварительно обученная модель Resnet-18.

Шаг 1: Скачайте необходимые пакеты

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

pip install -r requirements.txt

Шаг 2: Запуск сервера

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

Шаг 3: Загрузка данных проекта

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

! gdown "https://drive.google.com/u/1/uc?id=1jdudBiUu41kL-U5lhH3ari_WBRXyedWo&export=download"
! tar -xf 'VOCdevkit.zip'
! rm 'VOCdevkit.zip'

Шаг 4: Подключение к серверам

В этом примере серверы работают на портах по умолчанию на localhost.

connections.connect(host="127.0.0.1", port=19537)
red = redis.Redis(host = '127.0.0.1', port=6379, db=0)

Шаг 5: Создайте коллекцию

После запуска серверов создайте в Milvus коллекцию для хранения всех векторов. В этом примере размерность установлена на 512, что соответствует размеру вывода resnet-18, а метрика сходства установлена на евклидово расстояние (L2). Milvus поддерживает множество различных метрик сходства.

collection_name = "image_similarity_search"
dim = 512
default_fields = [
    schema.FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    schema.FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=dim)
]
default_schema = schema.CollectionSchema(fields=default_fields, description="Image test collection")
collection = Collection(name=collection_name, schema=default_schema)

Шаг 6: Создание индекса для коллекции

После того как коллекция создана, создайте для нее индекс. В данном случае используется индекс IVF_SQ8. Этот индекс требует параметра 'nlist', который указывает Milvus, сколько кластеров создавать в каждом файле данных (сегменте). Для разных индексов требуются разные параметры.

default_index = {"index_type": "IVF_SQ8", "params": {"nlist": 2048}, "metric_type": "L2"}
collection.create_index(field_name="vector", index_params=default_index)
collection.load()

Шаг 7: Настройка модели и загрузчика данных

После того как индекс IVF_SQ8 построен, настройте нейронную сеть и загрузчик данных. Предварительно обученная pytorch resnet-18, используемая в этом примере, лишена последнего слоя, который сжимает векторы для классификации и может потерять ценную информацию.

model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet18', pretrained=True)
encoder = torch.nn.Sequential(*(list(model.children())[:-1]))

Набор данных и загрузчик данных необходимо изменить таким образом, чтобы они могли выполнять предварительную обработку и пакетную обработку изображений, а также предоставлять пути к файлам изображений. Это можно сделать с помощью слегка модифицированного загрузчика данных torchvision. Для предварительной обработки изображения необходимо обрезать и нормализовать, поскольку модель resnet-18 была обучена на определенном диапазоне размеров и значений.

dataset = ImageFolderWithPaths(data_dir, transform=transforms.Compose([
                                                transforms.Resize(256),
                                                transforms.CenterCrop(224),
                                                transforms.ToTensor(),
                                                transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])]))

dataloader = torch.utils.data.DataLoader(dataset, num_workers=0, batch_si

Шаг 8: Вставка векторов в коллекцию

Когда коллекция настроена, изображения можно обрабатывать и загружать в созданную коллекцию. Сначала изображения извлекаются загрузчиком данных и прогоняются через модель resnet-18. Полученные векторные вкрапления затем вставляются в Milvus, который возвращает уникальный идентификатор для каждого вектора. Идентификаторы векторов и пути к файлам изображений вставляются в сервер Redis в виде пар ключ-значение.

steps = len(dataloader)
step = 0
for inputs, labels, paths in dataloader:
    with torch.no_grad():
        output = encoder(inputs).squeeze()
        output = output.numpy()

    mr = collection.insert([output.tolist()])
    ids = mr.primary_keys
    for x in range(len(ids)):
        red.set(str(ids[x]), paths[x])
    if step%5 == 0:
        print("Insert Step: " + str(step) + "/" + str(steps))
    step += 1

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

random_ids = [int(red.randomkey()) for x in range(3)]
search_images = [x.decode("utf-8") for x in red.mget(random_ids)]

Эти изображения сначала проходят ту же предварительную обработку, что и на шаге 7, а затем проталкиваются через модель resnet-18.

transform_ops = transforms.Compose([
                transforms.Resize(256),
                transforms.CenterCrop(224),
                transforms.ToTensor(),
                transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])

embeddings = [transform_ops(Image.open(x)) for x in search_images]
embeddings = torch.stack(embeddings, dim=0)

with torch.no_grad():
    embeddings = encoder(embeddings).squeeze().numpy()

Затем полученные векторные вкрапления используются для поиска. Сначала задайте параметры поиска, включая имя коллекции для поиска, nprobe (количество кластеров для поиска) и top_k (количество возвращаемых векторов). В данном примере поиск должен быть очень быстрым.

search_params = {"metric_type": "L2", "params": {"nprobe": 32}}
start = time.time()
results = collection.search(embeddings, "vector", param=search_params, limit=3, expr=None)
end = time.time() - start

Шаг 10: Результаты поиска изображений

Идентификаторы векторов, полученные в результате запросов, используются для поиска соответствующих изображений. Затем Matplotlib используется для отображения результатов поиска изображений.

pic1.png pic1.png pic2.pngpic2.png pic3.pngpic3.png


Узнайте, как развернуть Milvus в различных средах

Раздел "Развертывание" нового bootcamp содержит всю информацию об использовании Milvus в различных средах и настройках. Он включает в себя развертывание Mishards, использование Kubernetes с Milvus, балансировку нагрузки и многое другое. Для каждой среды есть подробное пошаговое руководство, объясняющее, как заставить Milvus работать в ней.


Не будьте незнакомцем

  • Читайте наш блог.
  • Общайтесь с нашим сообществом разработчиков открытого кода в Slack.
  • Используйте Milvus, самую популярную в мире векторную базу данных, на Github.

    Try Managed Milvus for Free

    Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

    Get Started

    Like the article? Spread the word

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