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

milvus-logo
LFAI

1. index_file_size

  • Engineering
February 26, 2020
milvus

В статье 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.png 1-sift50m-test-results-milvus.png

Видно, что в режиме 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.png sq8-index-test-sift50m.png

В таблице сравнивается производительность и точность поиска при использовании различных значений nlist/nprobe. Отображаются только результаты GPU, поскольку тесты CPU и GPU дают схожие результаты. В этом тесте при увеличении значений nlist/nprobe на один и тот же процент точность поиска также увеличивается. Когда nlist = 4096 и nprobe = 128, Milvus имеет наилучшую производительность поиска. В заключение следует отметить, что при определении значений nlist и nprobe необходимо находить компромисс между производительностью и точностью с учетом различных наборов данных и требований.

Резюме

index_file_size: Если размер данных больше, чем index_file_size, то чем больше значение index_file_size, тем выше производительность поиска.nlist и nprobe:Вы должны найти компромисс между производительностью и точностью.

Try Managed Milvus for Free

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

Get Started

Like the article? Spread the word

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