Как выбрать параметры индекса для IVF Index
В статье Best Practices for Milvus Configuration были представлены некоторые лучшие практики настройки Milvus 0.6.0. В этой статье мы также представим некоторые лучшие практики настройки ключевых параметров в клиентах Milvus для операций, включая создание таблицы, создание индексов и поиск. Эти параметры могут влиять на производительность поиска.
1. index_file_size
При создании таблицы параметр index_file_size используется для указания размера одного файла для хранения данных в МБ. Значение по умолчанию — 1024. Когда векторные данные импортируются, Milvus постепенно объединяет данные в файлы. Когда размер файла достигает index_file_size, этот файл больше не принимает новые данные, и Milvus сохраняет новые данные в другой файл. Все это файлы необработанных данных. Когда создается индекс, Milvus генерирует индексный файл для каждого файла необработанных данных. Для типа индекса IVFLAT размер индексного файла примерно равен размеру соответствующего файла необработанных данных. Для индекса SQ8 размер индексного файла составляет примерно 30 процентов от соответствующего файла необработанных данных.
Во время поиска Milvus выполняет поиск по каждому индексному файлу по очереди. По нашему опыту, когда index_file_size изменяется с 1024 до 2048, производительность поиска повышается на 30–50 процентов. Однако, если значение слишком велико, большие файлы могут не загрузиться в память GPU (или даже CPU). Например, если память GPU составляет 2 ГБ, а index_file_size — 3 ГБ, индексный файл не может быть загружен в память GPU. Обычно мы устанавливаем index_file_size равным 1024 МБ или 2048 МБ.
В следующей таблице показан тест с использованием sift50m для index_file_size. Тип индекса — SQ8.
1-sift50m-test-results-milvus.
Мы видим, что в режиме CPU и режиме GPU, когда index_file_size составляет 2048 МБ вместо 1024 МБ, производительность поиска значительно повышается.
2. nlist и nprobe
Параметр nlist используется для создания индекса, а параметр nprobe используется для поиска. IVFLAT и SQ8 оба используют алгоритмы кластеризации, чтобы разделить большое количество векторов на кластеры, или корзины. nlist — это количество корзин при кластеризации.
При поиске с использованием индексов первый шаг — найти определенное количество корзин, ближайших к целевому вектору, а второй шаг — найти k наиболее похожих векторов из корзин по векторному расстоянию. nprobe — это количество корзин на первом шаге.
Как правило, увеличение nlist приводит к большему количеству корзин и меньшему количеству векторов в корзине при кластеризации. В результате вычислительная нагрузка уменьшается, а производительность поиска повышается. Однако при меньшем количестве векторов для сравнения сходства правильный результат может быть упущен.
Увеличение nprobe приводит к большему количеству корзин для поиска. В результате вычислительная нагрузка увеличивается, а производительность поиска ухудшается, но точность поиска повышается. Ситуация может отличаться для наборов данных с разными распределениями. При настройке nlist и nprobe также следует учитывать размер набора данных. Обычно рекомендуется, чтобы nlist мог быть равен 4 * sqrt(n), где n — общее количество векторов. Что касается nprobe, необходимо найти компромисс между точностью и эффективностью, и лучший способ — определить значение методом проб и ошибок.
В следующей таблице показан тест с использованием sift50m для nlist и nprobe. Тип индекса — SQ8.
sq8-index-test-sift50m.
В таблице сравниваются производительность и точность поиска при использовании различных значений nlist/nprobe. Отображаются только результаты GPU, поскольку тесты CPU и GPU дают схожие результаты. В этом тесте по мере увеличения значений nlist/nprobe на одинаковый процент точность поиска также увеличивается. Когда nlist = 4096, а nprobe равно 128, Milvus демонстрирует наилучшую производительность поиска. В заключение, при определении значений для nlist и nprobe необходимо найти компромисс между производительностью и точностью с учетом различных наборов данных и требований.
Summary
index_file_size: Когда размер данных превышает index_file_size, чем больше значение index_file_size, тем выше производительность поиска.
nlist and nprobe:Необходимо найти компромисс между производительностью и точностью.
Читать далее

VDBBench Adds Cost-Aware Benchmarking for Vector Databases
Compare Zilliz Cloud, Pinecone, and turbopuffer with VDBBench cost-aware vector database benchmarks across latency, freshness, multitenancy, and cold starts.

AI Agents Are Quietly Transforming E-Commerce — Here’s How
Discover how AI agents transform e-commerce with autonomous decision-making, enhanced product discovery, and vector search capabilities for today's retailers.

Vector Databases vs. Document Databases
Use a vector database for similarity search and AI-powered applications; use a document database for flexible schema and JSON-like data storage.



