Начало работы с 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). Он любит говорить о том, что делает команды эффективными (или не такими эффективными!).
Читать далее

Zilliz Cloud Enterprise Vector Search Powers High-Performance AI on AWS
Zilliz Cloud on AWS powers secure, scalable, ultra-fast vector search for enterprise AI apps, with BYOC, sub-10ms latency, and zero-DevOps simplicity.

8 Latest RAG Advancements Every Developer Should Know
Explore eight advanced RAG variants that can solve real problems you might be facing: slow retrieval, poor context understanding, multimodal data handling, and resource optimization.

Demystifying the Milvus Sizing Tool
Explore how to use the Sizing Tool to select the optimal configuration for your Milvus deployment.



