Начало работы с PyMilvus
Milvus, векторная база данных с открытым исходным кодом, в сочетании с PyMilvus — ее Python SDK — является мощным инструментом для обработки больших наборов данных и выполнения сложных вычислений и поиска.
Это руководство поможет вам установить и настроить среду разработки для использования Milvus и PyMilvus. Затем вы разберете пример кода для анализа аудиофайлов, хранения их данных в Milvus и последующего использования этих данных для сравнения аудиообразцов на сходство. Давайте начнем.
Что такое Milvus?
Milvus — это векторная база данных с открытым исходным кодом, которая обрабатывает поиск и аналитику сходства векторов триллионного масштаба. Это мощная и эффективная платформа для управления неструктурированными данными и поиска по ним с помощью векторов вложений — возможности, которая становится все более важной в машинном обучении, компьютерном зрении, рекомендательных системах и других областях искусственного интеллекта (ИИ).
В своей основе Milvus использует концепцию вложений, при которой точки данных представлены в виде многомерных векторов. Эти векторы могут отражать сходство между точками данных на основе их семантических или визуальных признаков. Milvus обеспечивает хранение, индексирование и извлечение этих векторов, позволяя пользователям выполнять быстрый поиск сходства по огромным наборам данных.
Благодаря своей распределенной архитектуре и поддержке ускорения GPU, Milvus может эффективно обрабатывать большие объемы векторных данных и выдавать результаты поиска в реальном времени. Кроме того, он предлагает ряд алгоритмов индексирования, оптимизированных для различных сценариев использования, включая алгоритмы поиска приближенного ближайшего соседа (ANN), чтобы сбалансировать точность и эффективность.
Milvus поддерживает различные языки программирования и предоставляет простые в использовании API, что делает его доступным для разработчиков и исследователей. Кроме того, он хорошо интегрируется с популярными фреймворками машинного обучения и инструментами обработки данных, обеспечивая бесшовную интеграцию в существующие рабочие процессы.
Что такое PyMilvus?
PyMilvus — это Python SDK для Milvus. Он разработан для того, чтобы Python-разработчики могли легко и эффективно взаимодействовать с Milvus, выполняя такие задачи, как управление данными, проведение поиска сходства векторов, построение индексов и многое другое.
С PyMilvus разработчики используют всю мощь Milvus в своих Python-приложениях, не беспокоясь о тонкостях базовых операций базы данных. Он скрывает многие сложности работы с Milvus, предоставляя простой, удобный API, который бесшовно интегрируется с существующими рабочими процессами Python.
Настройка для руководства
Примеры командной строки в этой статье будут приведены для Linux, но их можно легко адаптировать для macOS или Windows с помощью Windows Subsystem for Linux (WSL). Вам понадобится система с Docker или Docker Desktop, Python 3.10+ и git.
Репозиторий Milvus bootcamp
В этом руководстве мы будем использовать код из репозитория Milvus Bootcamp на Github. Начните с клонирования репозитория в локальную систему.
[egoebelbecker@ares bootcamp]$ git clone https://github.com/milvus-io/bootcamp.git
Cloning into 'bootcamp'...
remote: Enumerating objects: 61861, done.
remote: Counting objects: 100% (4488/4488), done.
remote: Compressing objects: 100% (1628/1628), done.
remote: Total 61861 (delta 2983), reused 4180 (delta 2791), pack-reused 57373
Receiving objects: 100% (61861/61861), 166.78 MiB | 4.91 MiB/s, done.
Resolving deltas: 100% (28214/28214), done.
Виртуальное окружение Python
Затем создайте виртуальное окружение для запуска вашего кода. Вы можете поместить его в каталог, куда вы клонировали репозиторий bootcamp. Активируйте окружение после его создания.
[egoebelbecker@ares bootcamp]$ cd bootcamp
[egoebelbecker@ares bootcamp]$ git checkout archive20230625
[egoebelbecker@ares bootcamp]$ python3 -m venv ./venv
[egoebelbecker@ares bootcamp]$ source venv/bin/activate
(venv) [egoebelbecker@ares bootcamp]$
Установите зависимости Python
Теперь пора настроить наш проект.
Мы будем использовать пример Audio Similarity Search. В нем используется общедоступный набор аудиофайлов, чтобы продемонстрировать, как можно использовать Milvus для обнаружения сходства между различными образцами.
Перейдите в подкаталог проекта и посмотрите файл requirements.txt, поставляемый с кодом.
(venv) [egoebelbecker@ares bootcamp]$ cd solutions/audio/audio_similarity_search/
(venv) [egoebelbecker@ares audio_similarity_search]$ cat requirements.txt
pymilvus
redis
librosa
numpy
panns_inference
torch
diskcache
gdown
Это библиотеки Python, необходимые для запуска проекта. Используйте pip, чтобы установить их. Затем добавьте Jupyter, чтобы мы могли запустить notebook.
(venv) [egoebelbecker@ares audio_similarity_search]$ pip install -r requirements.txt
(Lots of output)
(venv) [egoebelbecker@ares audio_similarity_search]$ pip install jupyter
(More output)
Запустите Redis
Теперь запустите Docker-контейнер Redis.
docker run --name redis -d -p 6379:6379 redis
Установите и запустите Milvus Lite
Наконец, вам понадобится сервер Milvus. Самый простой способ начать работу с Milvus — это Milvus Lite, который работает в Python. Установите пакеты milvus.
(venv) [egoebelbecker@ares audio_similarity_search]$ pip install milvus
(Lots of output)
(venv) [egoebelbecker@ares audio_similarity_search]$ milvus-server
__ _________ _ ____ ______
/ |/ / _/ /| | / / / / / __/
/ /|_/ // // /_| |/ / /_/ /\ \
/_/ /_/___/____/___/\____/___/ {Lite}
Welcome to use Milvus!
Version: v2.2.8-lite
Process: 275118
Started: 2023-05-25 12:41:47
Config: /home/egoebelbecker/.milvus.io/milvus-server/2.2.8/configs/milvus.yaml
Logs: /home/egoebelbecker/.milvus.io/milvus-server/2.2.8/logs
Ctrl+C to exit ...
Проект PyMilvus
Теперь, когда среда настроена, вы можете запустить руководство.
Запустите Jupyter
Запустите Jupyter из вашей виртуальной среды.
(venv) [egoebelbecker@ares audio_similarity_search]$ python -m jupyter notebook --notebook-dir=`pwd`
_ _ _ _
| | | |_ __ __| |__ _| |_ ___
| |_| | '_ \/ _` / _` | _/ -_)
\___/| .__/\__,_\__,_|\__\___|
|_|
Read the migration plan to Notebook 7 to learn about the new features and the actions to take if you are using extensions.
https://jupyter-notebook.readthedocs.io/en/latest/migrate_to_notebook7.html
(More output)
Это откроет страницу Jupyter Files в вашем браузере по умолчанию.
Перейдите в каталог solutions/audio/audio_similarity_search.
Откройте notebook audio_similarity_search.
Подключитесь к Redis и Milvus
Вы уже выполнили первоначальную настройку, поэтому прокрутите сразу вниз до раздела Code Overview. Код начинается с импорта библиотек для Redis и Milvus.
Во второй строке вы можете увидеть классы, которые понадобятся для подключения к Milvus, создания Collection, а также добавления и извлечения данных из нее.
import redis
from pymilvus import connections, DataType, FieldSchema, CollectionSchema, Collection, utility
connections.connect(host = '127.0.0.1', port = 19530)
red = redis.Redis(host = '127.0.0.1', port=6379, db=0)
Затем код подключается к двум серверам. Запустите этот блок. Теперь пора создать коллекцию Milvus для хранения информации о каждом аудиофайле.
import time
red.flushdb()
time.sleep(.1)
collection_name = "audio_test_collection"
if utility.has_collection(collection_name):
print("Dropping existing collection...")
collection = Collection(name=collection_name)
collection.drop()
#if not utility.has_collection(collection_name):
field1 = FieldSchema(name="id", dtype=DataType.INT64, description="int64", is_primary=True,auto_id=True)
field2 = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, description="float vector", dim=2048, is_primary=False)
schema = CollectionSchema(fields=[ field1,field2], description="collection description")
collection = Collection(name=collection_name, schema=schema)
print("Created new collection with name: " + collection_name)
Создайте коллекцию Milvus
На этом шаге создается коллекция с именем audio_test_collection с двумя полями:
- id - целочисленное поле идентификации
- embedding - вектор из 2048 чисел с плавающей точкой для хранения данных об аудиофайлах
Запустите этот блок, и вы увидите это сообщение:
Dropping existing collection...
Created new collection with name: audio_test_collection
Далее добавьте индекс в новую коллекцию:
if utility.has_collection(collection_name):
collection = Collection(name = collection_name)
default_index = {"index_type": "IVF_SQ8", "metric_type": "L2", "params": {"nlist": 16384}}
status = collection.create_index(field_name = "embedding", index_params = default_index)
if not status.code:
print("Successfully create index in collection:{} with param:{}".format(collection_name, default_index))
Запустите этот блок:
Successfully create index in collection:audio_test_collection with param:{'index_type': 'IVF_SQ8', 'metric_type': 'L2', 'params': {'nlist': 16384}}
Хранение аудиоданных
Теперь Milvus готов хранить аудиоданные. Давайте разберем следующий блок кода и внимательно его рассмотрим.
import os
import librosa
import gdown
import zipfile
import numpy as np
from panns_inference import SoundEventDetection, labels, AudioTagging
data_dir = './example_audio'
at = AudioTagging(checkpoint_path=None, device='cpu')
def download_audio_data():
url = 'https://drive.google.com/uc?id=1bKu21JWBfcZBuEuzFEvPoAX6PmRrgnUp'
gdown.download(url)
with zipfile.ZipFile('example_audio.zip', 'r') as zip_ref:
zip_ref.extractall(data_dir)
Этот раздел импортирует библиотеки для обработки файлов. Затем он создает объект AudioTagging из библиотеки Panns Inference.
Это интерфейс Python для Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition (PANNs).
Класс AudioTagging создаст набор точек данных для каждого аудиофайла, похожий на этот:
Speech: 0.893
Telephone bell ringing: 0.754
Inside, small room: 0.235
Telephone: 0.183
Music: 0.092
Ringtone: 0.047
Inside, large room or hall: 0.028
Alarm: 0.014
Animal: 0.009
Vehicle: 0.008
embedding: (2048,)
Далее идет код для загрузки файлов, их анализа и вставки данных в Milvus, а информации о файлах — в Redis:
def embed_and_save(path, at):
audio, _ = librosa.core.load(path, sr=32000, mono=True)
audio = audio[None, :]
try:
_, embedding = at.inference(audio)
embedding = embedding/np.linalg.norm(embedding)
embedding = embedding.tolist()[0]
mr = collection.insert([[embedding]])
ids = mr.primary_keys
collection.load()
red.set(str(ids[0]), path)
except Exception as e:
print("failed: " + path + "; error {}".format(e))
Этот блок кода объединяет все вместе:
print("Starting Insert")
download_audio_data()
for subdir, dirs, files in os.walk(data_dir):
for file in files:
path = os.path.join(subdir, file)
embed_and_save(path, at)
print("Insert Done")
Запустите код:
Checkpoint path: /home/egoebelbecker/panns_data/Cnn14_mAP=0.431.pth
Using CPU.
Starting Insert
Загрузка...
Из: [https://drive.google.com/uc?id=1bKu21JWBfcZBuEuzFEvPoAX6PmRrgnUp](https://drive.google.com/uc?id=1bKu21JWBfcZBuEuzFEvPoAX6PmRrgnUp)
В: /home/egoebelbecker/src/bootcamp/solutions/audio/audio_similarity_search/example_audio.zip
100%|█████████████████████████████████████████████████████████████████████████████████████████| 474k/474k [00:00<00:00, 8.87MB/s]
Вставка выполнена
Поиск сходств
Чтобы выполнить поиск в базе данных, вам нужно провести тот же анализ файлов, для которых необходимо найти совпадения. Вот код, который делает это для случайно выбранного набора идентификаторов файлов.
```python
def get_embed(paths, at):
embedding_list = []
for x in paths:
audio, _ = librosa.core.load(x, sr=32000, mono=True)
audio = audio[None, :]
try:
_, embedding = at.inference(audio)
embedding = embedding/np.linalg.norm(embedding)
embedding_list.append(embedding)
except:
print("Embedding Failed: " + x)
return np.array(embedding_list, dtype=np.float32).squeeze()
random_ids = [int(red.randomkey()) for x in range(2)]
search_clips = [x.decode("utf-8") for x in red.mget(random_ids)]
embeddings = get_embed(search_clips, at)
print(embeddings.shape)
Запустите этот блок, чтобы выбрать два файла и выполнить анализ. Теперь пришло время выполнить поиск в Milvus. Этот код отображает результаты поиска в аудиоплеерах:
import IPython.display as ipd
def show_results(query, results, distances):
print("Query: ")
ipd.display(ipd.Audio(query))
print("Results: ")
for x in range(len(results)):
print("Distance: " + str(distances[x]))
ipd.display(ipd.Audio(results[x]))
print("-"*50)
Затем программа берет массив embeddings, созданный выше, и преобразует его в список. После этого она создает наши параметры поиска. Мы ищем два похожих звука и используем nprobe в качестве критерия. Это соответствует типу индекса, который вы использовали выше.
embeddings_list = embeddings.tolist()
search_params = {"metric_type": "L2", "params": {"nprobe": 16}}
Наконец, вот сам поиск.
try:
start = time.time()
results = collection.search(embeddings_list, anns_field="embedding", param=search_params, limit=3)
end = time.time() - start
print("Search took a total of: ", end)
for x in range(len(results)):
query_file = search_clips[x]
result_files = [red.get(y.id).decode('utf-8') for y in results[x]]
distances = [y.distance for y in results[x]]
show_results(query_file, result_files, distances)
except Exception as e:
print("Failed to search vectors in Milvus: {}".format(e))
Запустите его, и вы увидите случайно выбранные файлы и два результата поиска с их расстоянием от оригинала.
Прослушайте каждый файл, и вы услышите точное совпадение и его ближайшего соседа.
Резюме
В этом посте вы узнали, как создать среду Python для работы с Milvus. После настройки сервера и PyMilvus SDK вы запустили пример учебного пособия из репозитория Milvus Bootcamp. Вы увидели код для создания коллекции, ее индексирования, хранения данных и выполнения базового поиска.
Теперь, когда вы увидели, как легко начать работу с Milvus, продолжайте изучать проекты bootcamp и посмотрите, как можно использовать Milvus для улучшения ваших проектов.
Этот пост написал Eric Goebelbecker. Eric 25 лет работал на финансовых рынках Нью-Йорка, разрабатывая инфраструктуру для рыночных данных и сетей протокола обмена финансовой информацией (FIX). Он любит говорить о том, что делает команды эффективными (или не такими эффективными!).
Читать далее

Data Deduplication at Trillion Scale: How to Solve the Biggest Bottleneck of LLM Training
Explore how MinHash LSH and Milvus handle data deduplication at the trillion-scale level, solving key bottlenecks in LLM training for improved AI model performance.

Announcing VDBBench 1.0: Open-Source VectorDB Benchmarking with Your Real-World Production Workloads
Discover VDBBench 1.0, an open-source tool for benchmarking vector databases with real-world production data, streaming ingestion, and concurrent workloads.

Vector Databases vs. Hierarchical Databases
Use a vector database for AI-powered similarity search; use a hierarchical database for organizing data in parent-child relationships with efficient top-down access patterns.



