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

milvus-logo
LFAI
Главная
  • Вопросы и ответы
  • Home
  • Docs
  • Вопросы и ответы

  • Вопросы и ответы о продукции

Часто задаваемые вопросы о продукте

Сколько стоит Milvus?

Milvus - это 100% бесплатный проект с открытым исходным кодом.

Пожалуйста, придерживайтесь лицензии Apache License 2.0 при использовании Milvus для производства или распространения.

Компания Zilliz, стоящая за Milvus, также предлагает полностью управляемую облачную версию платформы для тех, кто не хочет создавать и поддерживать свой собственный распределенный экземпляр. Zilliz Cloud автоматически поддерживает надежность данных и позволяет пользователям платить только за то, что они используют.

Поддерживает ли Milvus архитектуры, отличные от x86?

Milvus нельзя установить или запустить на платформах, не поддерживающих архитектуру x86.

Для работы Milvus ваш процессор должен поддерживать один из следующих наборов инструкций: SSE4.2, AVX, AVX2, AVX512. Это все наборы SIMD-инструкций, предназначенные для x86.

Где Milvus хранит данные?

Milvus имеет дело с двумя типами данных - вставленными данными и метаданными.

Вставленные данные, включая векторные данные, скалярные данные и специфическую схему коллекции, хранятся в постоянном хранилище в виде инкрементного журнала. Milvus поддерживает множество бэкендов объектных хранилищ, включая MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS и Tencent Cloud Object Storage (COS).

Метаданные генерируются внутри Milvus. Каждый модуль Milvus имеет свои собственные метаданные, которые хранятся в etcd.

Почему в etcd нет векторных данных?

В etcd хранятся метаданные модуля Milvus; в MinIO хранятся сущности.

Поддерживает ли Milvus одновременную вставку и поиск данных?

Да. Операции вставки и запросы обрабатываются двумя отдельными модулями, которые взаимно независимы. С точки зрения клиента, операция вставки завершается, когда вставленные данные попадают в очередь сообщений. Однако вставленные данные недоступны для поиска до тех пор, пока они не будут загружены в узел запроса. Если размер сегмента не достигает порога построения индекса (512 МБ по умолчанию), Milvus прибегает к грубому поиску, и производительность запросов может снизиться.

Можно ли вставлять в Milvus векторы с дублирующимися первичными ключами?

Да. Milvus не проверяет, являются ли первичные ключи векторов дубликатами.

При вставке векторов с дублирующимися первичными ключами Milvus рассматривает это как операцию обновления?

Нет. В настоящее время Milvus не поддерживает операции обновления и не проверяет, являются ли первичные ключи сущностей дубликатами. Вы отвечаете за то, чтобы первичные ключи сущностей были уникальными, и если это не так, то Milvus может содержать несколько сущностей с дублирующимися первичными ключами.

В этом случае неизвестно, какая копия данных будет возвращена при запросе. Это ограничение будет исправлено в будущих релизах.

Какова максимальная длина самоопределяемых первичных ключей сущностей?

Первичные ключи сущностей должны быть неотрицательными 64-битными целыми числами.

Какой максимальный объем данных может быть добавлен за одну операцию вставки?

Размер операции вставки не должен превышать 1 024 МБ. Это ограничение, накладываемое gRPC.

Влияет ли размер коллекции на производительность запроса при поиске в определенном разделе?

Нет. Если разделы для поиска указаны, Milvus выполняет поиск только в указанных разделах.

Это зависит от того, какие данные нужны для поиска. Перед поиском необходимо загрузить все разделы, которые могут появиться в результатах поиска.

  • Например, если вы хотите найти только определенный раздел (разделы), вам не нужно загружать все разделы. Вызовите load_partition(), чтобы загрузить нужный раздел (разделы) , а затем укажите раздел (разделы) в вызове метода search().
  • Если вы хотите выполнить поиск во всех разделах, вызовите load_collection(), чтобы загрузить всю коллекцию, включая все разделы.
  • Если вы не загрузите коллекцию или конкретный раздел(ы) перед поиском, Milvus вернет ошибку.

Можно ли создавать индексы после вставки векторов?

Да. Если ранее для коллекции был создан индекс по адресу create_index(), Milvus автоматически создаст индекс для последующих вставленных векторов. Однако Milvus не строит индекс до тех пор, пока вновь вставленные векторы не заполнят весь сегмент, а вновь созданный индексный файл не будет отделен от предыдущего.

Чем отличаются индексы FLAT и IVF_FLAT?

Индекс IVF_FLAT делит векторное пространство на кластеры списка. При значении списка по умолчанию 16 384, Milvus сравнивает расстояния между целевым вектором и центроидами всех 16 384 кластеров, чтобы вернуть ближайшие кластеры. Затем Milvus сравнивает расстояния между целевым вектором и векторами в выбранных кластерах, чтобы получить ближайшие векторы. В отличие от IVF_FLAT, FLAT напрямую сравнивает расстояния между целевым вектором и каждым другим вектором.

Когда общее количество векторов приблизительно равно nlist, между IVF_FLAT и FLAT существует небольшое расстояние с точки зрения требований к вычислениям и производительности поиска. Однако когда число векторов превышает nlist в два и более раз, IVF_FLAT начинает демонстрировать преимущества в производительности.

Дополнительные сведения см. в разделе "Векторный индекс".

Как Milvus промывает данные?

Milvus возвращает успешный результат, когда вставленные данные попадают в очередь сообщений. Однако данные еще не выгружены на диск. Затем узел данных Milvus записывает данные в очереди сообщений в постоянное хранилище в виде инкрементных журналов. Если вызвать flush(), то узел данных будет вынужден немедленно записать все данные в очереди сообщений в постоянное хранилище.

Что такое нормализация? Зачем нужна нормализация?

Нормализация - это процесс преобразования вектора таким образом, чтобы его норма была равна 1. Если для вычисления сходства векторов используется внутреннее произведение, векторы должны быть нормализованы. После нормализации внутреннее произведение равно косинусному сходству.

Более подробную информацию см. в Википедии.

Почему евклидово расстояние (L2) и внутреннее произведение (IP) дают разные результаты?

Для нормализованных векторов евклидово расстояние (L2) математически эквивалентно внутреннему произведению (IP). Если эти метрики сходства дают разные результаты, проверьте, нормализованы ли ваши векторы.

Существует ли ограничение на общее количество коллекций и разделов в Milvus?

Да. Вы можете создать до 65 535 коллекций в экземпляре Milvus. При подсчете количества существующих коллекций Milvus учитывает все коллекции, в которых есть осколки и разделы.

Например, предположим, что вы уже создали 100 коллекций, в 60 из которых есть 2 шарда и 4 раздела, а в остальных 40 коллекциях - 1 шард и 12 разделов. Текущее количество коллекций можно вычислить так:

60 * 2 * 4 + 40 * 1 * 12 = 960

Почему при поиске векторов по адресу topk я получаю меньше k векторов?

Среди индексов, которые поддерживает Milvus, IVF_FLAT и IVF_SQ8 реализуют метод кластеризации k-means. Пространство данных делится на кластеры nlist, и вставленные векторы распределяются по этим кластерам. Затем Milvus выбирает ближайшие кластеры nprobe и сравнивает расстояния между целевым вектором и всеми векторами в выбранных кластерах, получая окончательные результаты.

Если nlist и topk велики, а nprobe мало, количество векторов в кластерах nprobe может быть меньше, чем k. Поэтому при поиске ближайших векторов topk количество возвращаемых векторов будет меньше, чем k.

Чтобы избежать этого, попробуйте задать nprobe больше, а nlist и k меньше.

Дополнительные сведения см. в разделе Индекс вектора.

Какая максимальная размерность вектора поддерживается в Milvus?

По умолчанию Milvus может управлять векторами с размерностью до 32 768. Вы можете увеличить значение Proxy.maxDimension, чтобы позволить вектору иметь большую размерность.

Поддерживает ли Milvus процессор Apple M1?

Текущий выпуск Milvus не поддерживает процессор Apple M1 напрямую. После выхода Milvus 2.3 Milvus будет предоставлять Docker-образы для архитектуры ARM64.

Какие типы данных поддерживает Milvus для поля первичного ключа?

В текущем выпуске Milvus поддерживает INT64 и string.

Является ли Milvus масштабируемым?

Да. Вы можете развернуть кластер Milvus с несколькими узлами с помощью Helm Chart на Kubernetes. Дополнительные инструкции см. в руководстве по масштабированию.

Что такое растущий сегмент и уплотненный сегмент?

Когда поступает запрос на поиск, Milvus ищет как инкрементные, так и исторические данные. Инкрементные данные - это недавние обновления, они хранятся в растущих сегментах, которые буферизируются в памяти до того, как они достигнут порога для сохранения в объектном хранилище, и для них строится более эффективный индекс, а исторические данные - это обновления, произошедшие некоторое время назад. Они находятся в запечатанных сегментах, которые были сохранены в объектном хранилище. Инкрементные и исторические данные вместе составляют весь набор данных для поиска. Такая конструкция делает любые данные, поступающие в Milvus, доступными для мгновенного поиска. Для Milvus Distributed существуют более сложные факторы, которые решают, когда только что поступившая запись может появиться в результатах поиска. Подробнее об этом можно узнать на уровнях согласованности.

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

Почему данные в MinIO сохраняются после удаления соответствующей коллекции?

Данные в MinIO сохраняются в течение определенного периода времени для удобства отката данных.

Поддерживает ли Milvus движки сообщений, отличные от Pulsar?

Да. Kafka поддерживается в версии Milvus 2.1.0.

В чем разница между поиском и запросом?

В Milvus поиск по векторному сходству извлекает векторы на основе расчета сходства и ускорения векторного индекса. В отличие от поиска по векторному сходству, векторный запрос извлекает векторы с помощью скалярной фильтрации на основе булева выражения. Булево выражение фильтрует скалярные поля или поле первичного ключа и извлекает все результаты, соответствующие фильтрам. В запросе не задействованы ни метрика сходства, ни индекс вектора.

Почему в Milvus векторное значение float имеет точность 7 десятичных цифр?

Milvus поддерживает хранение векторов в виде массивов Float32. Значение Float32 имеет точность 7 десятичных цифр. Даже если значение Float64, например 1.3476964684980388, Milvus сохраняет его как 1.347696. Поэтому, когда вы получаете такой вектор из Milvus, точность значения Float64 теряется.

Как Milvus работает с типами векторных данных и точностью?

Milvus поддерживает векторные типы Binary, Float32, Float16 и BFloat16.

  • Двоичные векторы: Хранят двоичные данные в виде последовательностей 0 и 1, используются в обработке изображений и поиске информации.
  • Векторы Float32: По умолчанию хранятся с точностью около 7 десятичных цифр. Даже значения Float64 хранятся с точностью Float32, что приводит к возможной потере точности при их извлечении.
  • Векторы Float16 и BFloat16: Предлагают меньшую точность и меньшее использование памяти. Float16 подходит для приложений с ограниченной пропускной способностью и памятью, в то время как BFloat16 балансирует между дальностью и эффективностью, обычно используется в глубоком обучении для снижения вычислительных требований без существенного влияния на точность.

Поддерживает ли Milvus указание значений по умолчанию для скалярных или векторных полей?

В настоящее время Milvus 2.4.x не поддерживает указание значений по умолчанию для скалярных или векторных полей. Эта функция запланирована на будущие релизы.

Освобождается ли место в хранилище сразу после удаления данных в Milvus?

Нет, место в хранилище не освобождается сразу после удаления данных в Milvus. Хотя при удалении данных сущности помечаются как "логически удаленные", фактическое пространство может быть освобождено не сразу. Вот почему:

  • Компактирование: Milvus автоматически уплотняет данные в фоновом режиме. Этот процесс объединяет меньшие сегменты данных в большие и удаляет логически удаленные данные (сущности, помеченные для удаления) или данные, время жизни которых истекло (TTL). Однако при уплотнении создаются новые сегменты, а старые помечаются как "Удаленные".
  • Сборка мусора: Отдельный процесс, называемый сборкой мусора (GC), периодически удаляет эти сегменты "Dropped", освобождая занимаемое ими место в хранилище. Это обеспечивает эффективное использование хранилища, но может вызвать небольшую задержку между удалением и освобождением места.

Могу ли я увидеть вставленные, удаленные или поднятые данные сразу после операции, не дожидаясь промывки?

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

При выборе уровня согласованности учитывайте компромисс между согласованностью и производительностью. Для операций, требующих немедленной видимости, используйте уровень согласованности "Strong". Для более быстрой записи приоритет отдавайте более слабой согласованности (данные могут быть видны не сразу). Дополнительные сведения см. в разделе Согласованность.

После включения функции ключа раздела какое значение по умолчанию имеет num_partitions в Milvus и почему?

Когда функция ключа раздела включена, значение по умолчанию num_partitions в Milvus устанавливается на 16. Это значение по умолчанию выбрано из соображений стабильности и производительности. При необходимости вы можете изменить значение num_partitions, указав его в функции create_collection.

Существует ли ограничение на максимальную длину выражений скалярной фильтрации?

Да, максимальная длина скалярного фильтрующего выражения ограничивается пределом передачи RPC, который задается в файле конфигурации milvus.yaml. В частности, ограничение задается параметром serverMaxRecvSize в разделе прокси:

proxy:
  grpc:
    serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte

По умолчанию максимальный размер каждого RPC-запроса составляет 64 МБ. Поэтому для успешной обработки длина фильтрующего выражения должна быть меньше этого предела.

При выполнении массового векторного поиска сколько векторов можно указать одновременно? Существует ли ограничение?

Да, количество векторов, которые можно указать при массовом векторном поиске, ограничено размером RPC-передачи, определенным в конфигурационном файле milvus.yaml. Этот предел определяется параметром serverMaxRecvSize в разделе прокси:

proxy:
  grpc:
    serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte

По умолчанию максимальный размер каждого RPC-запроса составляет 64 МБ. Поэтому для успешного выполнения запроса общий размер входных векторов, включая их размерные данные и метаданные, должен быть меньше этого предела.

Как получить все уникальные значения заданного скалярного поля из коллекции?

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

# set up iterator
iterator = client.query_iterator(
    collection_name="demo_collection",
    output_fields=["target"]
)
# do iteration and store target values into value_set 
value_set = set()
while True:
    res = iterator.next()
    if len(res) == 0:
        print("query iteration finished, close")
        iterator.close()
        break
    for i in range(len(res)):
        value_set.add(res[i]["target"])

# value_set will contain unique values for target column    

Каковы ограничения при использовании динамических полей? Например, есть ли ограничения на размер, методы модификации или ограничения на индексирование?

Динамические поля представлены внутри системы с помощью полей JSON, с ограничением по размеру 65 536 байт. Они поддерживают модификации upsert, позволяющие добавлять или обновлять поля. Однако, начиная с версии Milvus 2.5.1, динамические поля не поддерживают индексацию. Поддержка добавления индексов для JSON будет реализована в будущих выпусках.

Поддерживает ли Milvus изменения схемы?

Начиная с версии Milvus 2.5.0, изменения схемы ограничиваются специфическими модификациями, такими как настройка свойств, например, параметра mmap. Пользователи также могут изменять параметры max_length для полей varchar и max_capacity для полей массивов. Однако возможность добавлять или удалять поля в схемах планируется в будущих выпусках, что повысит гибкость управления схемами в Milvus.

Требует ли изменение max_length для VarChar реорганизации данных?

Нет, изменение max_length для поля VarChar не требует реорганизации данных, например уплотнения или реорганизации. Эта корректировка в первую очередь обновляет критерии проверки для любых новых данных, вставляемых в поле, оставляя существующие данные незатронутыми. В результате это изменение считается легким и не накладывает значительных нагрузок на систему.

У вас остались вопросы?

Вы можете:

  • Проверить Milvus на GitHub. Вы можете задавать вопросы, делиться идеями и помогать другим.
  • Присоединяйтесь к нашему сообществу Slack, чтобы найти поддержку и участвовать в работе нашего сообщества разработчиков с открытым исходным кодом.

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?