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

milvus-logo
LFAI
  • Home
  • Blog
  • Что дает поиск сходства в векторной базе данных Milvus?

Что дает поиск сходства в векторной базе данных Milvus?

  • Engineering
May 10, 2022
Yudong Cai

cover image изображение обложки

Эта статья написана Юдоном Цаем и переведена Анжелой Ни.

Knowhere, как основной движок векторного исполнения, для Milvus - это как двигатель для спортивного автомобиля. В этой статье мы расскажем о том, что такое Knowhere, чем она отличается от Faiss и как устроен код Knowhere.

Перейти к:

Концепция Knowhere

Говоря узко, Knowhere - это операционный интерфейс для доступа к сервисам на верхних уровнях системы и библиотекам векторного поиска сходства, таким как Faiss, Hnswlib, Annoy, на нижних уровнях системы. Кроме того, Knowhere отвечает за гетерогенные вычисления. Точнее, Knowhere контролирует, на каком оборудовании (например, CPU или GPU) выполнять запросы на построение индексов и поиск. Именно так Knowhere и получила свое название - знание того, где выполнять операции. В будущих релизах будут поддерживаться другие типы оборудования, включая DPU и TPU.

В более широком смысле Knowhere также включает в себя другие сторонние библиотеки индексов, такие как Faiss. Таким образом, в целом Knowhere признана основным движком векторных вычислений в векторной базе данных Milvus.

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

Начиная с версии Milvus 2.0.1, Knowhere (в широком смысле) становится независимой от проекта Milvus.

Knowhere в архитектуре Milvus

knowhere architecture архитектура knowhere

Вычисления в Milvus в основном включают в себя векторные и скалярные операции. Knowhere обрабатывает только операции над векторами в Milvus. На рисунке выше показана архитектура Knowhere в Milvus.

Самый нижний слой - это системное оборудование. Поверх аппаратного обеспечения располагаются сторонние индексные библиотеки. Затем Knowhere взаимодействует с узлом индекса и узлом запроса на верхнем уровне через CGO.

В этой статье речь идет о Knowhere в более широком смысле, как отмечено в синей рамке на иллюстрации архитектуры.

Knowhere vs Faiss

Knowhere не только расширяет функции Faiss, но и оптимизирует производительность. Более конкретно, Knowhere обладает следующими преимуществами.

1. Поддержка BitsetView

Изначально биты были введены в Milvus для целей "мягкого удаления". Мягко удаленный вектор все еще существует в базе данных, но не будет вычисляться при поиске или запросе векторного подобия. Каждый бит в наборе битов соответствует индексированному вектору. Если вектор отмечен в битовом наборе как "1", это означает, что данный вектор мягко удален и не будет задействован в векторном поиске.

Параметры bitset добавляются во все открытые API запросов индекса Фейса в Knowhere, включая индексы CPU и GPU.

Узнайте больше о том, как bitset обеспечивает универсальность векторного поиска.

2. Поддержка большего количества метрик сходства для индексирования бинарных векторов

Помимо Хэмминга, Knowhere также поддерживает Жаккарда, Танимото, Суперструктуру, Субструктуру. Жаккард и Танимото могут использоваться для измерения сходства между двумя наборами образцов, а Superstructure и Substructure - для измерения сходства химических структур.

3. Поддержка набора инструкций AVX512

Сам Faiss поддерживает множество наборов инструкций, включая AArch64, SSE4.2, AVX2. Knowhere расширяет поддерживаемые наборы инструкций, добавляя AVX512, который может повысить производительность построения индексов и запросов на 20-30 % по сравнению с AVX2.

4. Автоматический выбор SIMD-инструкций

Knowhere рассчитана на работу с широким спектром процессоров (как локальных, так и облачных платформ) с различными SIMD-инструкциями (например, SIMD SSE, AVX, AVX2 и AVX512). Таким образом, проблема заключается в том, что, имея один бинарный файл (т. е. Milvus), как заставить его автоматически вызывать подходящие SIMD-инструкции на любом процессоре? Faiss не поддерживает автоматический выбор SIMD-инструкций, и пользователям приходится вручную указывать флаг SIMD (например, "-msse4") во время компиляции. Однако Knowhere создается путем рефакторинга кодовой базы Faiss. Общие функции (например, вычисление подобия), которые зависят от ускорения SIMD, вырезаются. Затем для каждой функции реализуются четыре версии (т. е. SSE, AVX, AVX2, AVX512), каждая из которых помещается в отдельный исходный файл. Затем исходные файлы компилируются по отдельности с соответствующим флагом SIMD. Таким образом, во время выполнения Knowhere может автоматически выбирать наиболее подходящие SIMD-инструкции, основываясь на текущих флагах процессора, а затем связывать нужные указатели функций с помощью хуков.

5. Другие оптимизации производительности

Подробнее об оптимизации производительности Knowhere читайте в статье Milvus: A Purpose-Built Vector Data Management System.

Понимание кода Knowhere

Как уже говорилось в первом разделе, Knowhere обрабатывает только операции поиска векторов. Поэтому Knowhere обрабатывает только векторное поле сущности (в настоящее время поддерживается только одно векторное поле для сущностей в коллекции). Построение индексов и поиск векторного сходства также нацелены на векторное поле сегмента. Чтобы лучше понять модель данных, читайте блог здесь.

entity fields поля сущностей

Индекс

Индекс - это тип независимой структуры данных от исходных векторных данных. Индексирование требует четырех шагов: создание индекса, обучение данных, вставка данных и построение индекса.

Для некоторых приложений искусственного интеллекта обучение набора данных является отдельным процессом от поиска векторов. В таких приложениях данные из наборов сначала обучаются, а затем вставляются в векторную базу данных, например Milvus, для поиска сходства. Открытые наборы данных, такие как sift1M и sift1B, предоставляют данные для обучения и тестирования. Однако в Knowhere данные для обучения и поиска смешиваются. Иными словами, Knowhere обучает все данные в сегменте, а затем вставляет все обученные данные и строит для них индекс.

Структура кода Knowhere

DataObj - базовый класс всех структур данных в Knowhere. Size() - единственный виртуальный метод в DataObj. Класс Index наследуется от DataObj с полем "size_". Класс Index также имеет два виртуальных метода - Serialize() и Load(). Класс VecIndex, производный от Index, является виртуальным базовым классом для всех векторных индексов. VecIndex предоставляет такие методы, как Train(), Query(), GetStatistics() и ClearStatistics().

base clase базовый класс

Другие типы индексов перечислены справа на рисунке выше.

  • Индекс Faiss имеет два подкласса: FaissBaseIndex для всех индексов на векторах с плавающей точкой и FaissBaseBinaryIndex для всех индексов на двоичных векторах.
  • GPUIndex - базовый класс для всех GPU-индексов Faiss.
  • OffsetBaseIndex - базовый класс для всех индексов собственной разработки. В индексном файле хранится только идентификатор вектора. В результате размер индексного файла для 128-мерных векторов может быть уменьшен на 2 порядка. При использовании данного типа индекса для поиска векторного сходства рекомендуется учитывать и исходные векторы.

IDMAP IDMAP

Технически говоря, IDMAP не является индексом, а скорее используется для поиска методом грубой силы. При вводе векторов в базу данных векторов не требуется обучение данных и создание индекса. Поиск будет осуществляться непосредственно по вставленным векторным данным.

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

IVF IVF

Наиболее часто используются индексы IVF (inverted file). Класс IVF является производным от VecIndex и FaissBaseIndex и далее расширяется до IVFSQ и IVFPQ. GPUIVF является производным от GPUIndex и IVF. Затем GPUIVF расширяется до GPUIVFSQ и GPUIVFPQ.

IVFSQHybrid - это класс для саморазвивающегося гибридного индекса, который выполняется с помощью грубого квантования на GPU. А поиск в ведре выполняется на CPU. Этот тип индекса позволяет уменьшить количество копий памяти между CPU и GPU за счет использования вычислительной мощности GPU. IVFSQHybrid имеет тот же показатель запоминания, что и GPUIVFSQ, но обладает более высокой производительностью.

Структура базового класса для бинарных индексов относительно проще. BinaryIDMAP и BinaryIVF являются производными от FaissBaseBinaryIndex и VecIndex.

third-party index сторонний индекс

В настоящее время кроме Faiss поддерживаются только два типа сторонних индексов: древовидный индекс Annoy и графовый индекс HNSW. Эти два распространенных и часто используемых сторонних индекса являются производными от VecIndex.

Добавление индексов в Knowhere

Если вы хотите добавить новые индексы в Knowhere, вы можете сначала обратиться к существующим индексам:

  • Чтобы добавить индекс на основе квантования, обратитесь к IVF_FLAT.
  • Чтобы добавить индекс на основе графов, обратитесь к HNSW.
  • Чтобы добавить индекс на основе дерева, обратитесь к Annoy.

После обращения к существующим индексам вы можете выполнить следующие шаги, чтобы добавить новый индекс в Knowhere.

  1. Добавьте имя нового индекса в поле IndexEnum. Тип данных - строка.
  2. Добавьте проверку достоверности данных для нового индекса в файл ConfAdapter.cpp. Проверка валидности нужна в основном для проверки параметров подготовки данных и запроса.
  3. Создайте новый файл для нового индекса. Базовый класс нового индекса должен включать VecIndex, а также необходимый виртуальный интерфейс VecIndex.
  4. Добавьте логику построения индекса для нового индекса в VecIndexFactory::CreateVecIndex().
  5. Добавьте модульный тест в каталог unittest.

О серии "Глубокое погружение

После официального объявления об общей доступности Milvus 2.0 мы организовали эту серию блогов Milvus Deep Dive, чтобы предоставить углубленную интерпретацию архитектуры и исходного кода Milvus. В этой серии блогов рассматриваются следующие темы:

Like the article? Spread the word

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