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

milvus-logo
LFAI
  • Home
  • Blog
  • Новые возможности

Новые возможности

  • News
May 20, 2021
milvus

Milvus - это постоянный проект с открытым исходным кодом (OSS), направленный на создание самой быстрой и надежной в мире базы данных векторов. Новые функции в Milvus v1.1.0 - это первое из множества грядущих обновлений, благодаря долгосрочной поддержке сообщества разработчиков открытого ПО и спонсорству компании Zilliz. В этой статье блога рассказывается о новых функциях, улучшениях и исправлениях ошибок, включенных в Milvus v1.1.0.

Перейти к:


Новые возможности

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

Указывать разделы с помощью вызовов методов get_entity_by_id().

Чтобы еще больше ускорить поиск векторного сходства, Milvus 1.1.0 теперь поддерживает получение векторов из указанного раздела. Как правило, Milvus поддерживает запрос векторов через указанные идентификаторы векторов. В Milvus 1.0 при вызове метода get_entity_by_id() выполняется поиск по всей коллекции, что может занять много времени при работе с большими наборами данных. Как видно из приведенного ниже кода, GetVectorsByIdHelper использует структуру FileHolder для перебора и поиска конкретного вектора.

std::vector<meta::CollectionSchema> collection_array; 
 auto status = meta_ptr_->ShowPartitions(collection.collection_id_, collection_array); 
  
 collection_array.push_back(collection); 
 status = meta_ptr_->FilesByTypeEx(collection_array, file_types, files_holder); 
 if (!status.ok()) { 
     std::string err_msg = "Failed to get files for GetVectorByID: " + status.message(); 
     LOG_ENGINE_ERROR_ << err_msg; 
     return status; 
 } 
  
 if (files_holder.HoldFiles().empty()) { 
     LOG_ENGINE_DEBUG_ << "No files to get vector by id from"; 
     return Status(DB_NOT_FOUND, "Collection is empty"); 
 } 
  
 cache::CpuCacheMgr::GetInstance()->PrintInfo(); 
 status = GetVectorsByIdHelper(id_array, vectors, files_holder); 
DBImpl::GetVectorsByIdHelper(const IDNumbers& id_array, std::vector<engine::VectorsData>& vectors, 
                              meta::FilesHolder& files_holder) { 
     // attention: this is a copy, not a reference, since the files_holder.UnMarkFile will change the array internal 
     milvus::engine::meta::SegmentsSchema files = files_holder.HoldFiles(); 
     LOG_ENGINE_DEBUG_ << "Getting vector by id in " << files.size() << " files, id count = " << id_array.size(); 
  
     // sometimes not all of id_array can be found, we need to return empty vector for id not found 
     // for example: 
     // id_array = [1, -1, 2, -1, 3] 
     // vectors should return [valid_vector, empty_vector, valid_vector, empty_vector, valid_vector] 
     // the ID2RAW is to ensure returned vector sequence is consist with id_array 
     using ID2VECTOR = std::map<int64_t, VectorsData>; 
     ID2VECTOR map_id2vector; 
  
     vectors.clear(); 
  
     IDNumbers temp_ids = id_array; 
     for (auto& file : files) { 

Однако эта структура не фильтруется никакими разделами в FilesByTypeEx(). В Milvus v1.1.0 система может передавать имена разделов в цикл GetVectorsIdHelper, чтобы FileHolder содержал только сегменты из указанных разделов. Другими словами, если вы точно знаете, к какому разделу относится искомый вектор, вы можете указать имя раздела в вызове метода get_entity_by_id(), чтобы ускорить процесс поиска.

Мы не только внесли изменения в код, управляющий системными запросами на уровне сервера Milvus, но и обновили все наши SDK (Python, Go, C++, Java и RESTful), добавив параметр для указания имен разделов. Например, в pymilvus определение get_entity_by_id def get_entity_by_id(self, collection_name, ids, timeout=None) изменено на def get_entity_by_id(self, collection_name, partition_tags=None, ids, timeout=None).


Указание разделов с помощью вызовов метода delete_entity_by_id().

Чтобы сделать управление векторами более эффективным, Milvus v1.1.0 теперь поддерживает указание имен разделов при удалении вектора в коллекции. В Milvus 1.0 векторы в коллекции можно было удалять только по идентификатору. При вызове метода delete Milvus просканирует все векторы в коллекции. Однако при работе с массивными наборами данных, состоящими из миллионов, миллиардов или даже триллионов векторов, гораздо эффективнее сканировать только соответствующие разделы. Аналогично новой возможности указания разделов при вызове метода get_entity_by_id(), в код Milvus были внесены изменения, использующие ту же логику.


Новый метод release_collection()

Чтобы освободить память, которую Milvus использовал для загрузки коллекций во время выполнения, в Milvus v1.1.0 был добавлен новый метод release_collection() для ручной выгрузки определенных коллекций из кэша.


Улучшения

Несмотря на то, что новые возможности - это, как правило, все, что нужно, важно также улучшать то, что у нас уже есть. Ниже перечислены обновления и другие общие улучшения по сравнению с Milvus v1.0.


Улучшена производительность вызова метода get_entity_by_id().

На диаграмме ниже представлено сравнение производительности векторного поиска между Milvus v1.0 и Milvus v1.1.0:

ПРОЦЕССОР: Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
Размер файла сегмента = 1024 MB
Количество строк = 1,000,000
Dim = 128

Идентификатор запроса Numv 1.0.0v1.1.0
109 мс2 мс
100149 мс19 мс


Hnswlib обновлен до версии 0.5.0

Milvus использует несколько широко используемых библиотек индексов, включая Faiss, NMSLIB, Hnswlib и Annoy, чтобы упростить процесс выбора подходящего типа индекса для конкретного сценария.

Hnswlib была обновлена с версии 0.3.0 до версии 0.5.0 в Milvus 1.1.0 из-за ошибки, обнаруженной в предыдущей версии. Кроме того, обновление Hnswlib улучшает производительность addPoint() при построении индексов.

Разработчик Zilliz создал запрос на исправление (PR) для улучшения производительности Hnswlib при построении индексов в Milvus. Подробности см. в PR #298.

На диаграмме ниже представлено сравнение производительности addPoint() между Hnswlib 0.5.0 и предложенным PR:

ПРОЦЕССОР: Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
Набор данных: sift_1M (row count = 1000000, dim = 128, space = L2)

0.5.0PR-298
M = 16, ef_construction = 100274406 мс265631 мс
M = 16, ef_construction = 200522411 мс499639 мс


Улучшенная производительность обучения индекса IVF

Создание индекса включает в себя обучение, вставку и запись данных на диск. В Milvus 1.1.0 улучшен компонент обучения при создании индекса. На диаграмме ниже представлено сравнение производительности обучения индекса ЭКО между Milvus 1.0 и Milvus 1.1.0:

ПРОЦЕССОР: Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
Набор данных: sift_1m (row_count = 1000000, dim = 128, metric_type = L2)

v1.0.0 (мс)v1.1.0 (мс)
ivf_flat (nlist = 2048)9007981544
ivf_pq (nlist = 2048, m=16)10353597115
ivf_pq (nlist = 2048, m=32)108638104558
ivf_flat (nlist = 4096)340643310685
ivf_pq (nlist = 4096, m=16)351982323758
ivf_pq (nlist = 4096, m=32)357359330887


Исправления ошибок

Мы также исправили несколько ошибок, чтобы сделать Milvus более стабильным и эффективным при работе с векторными наборами данных. Подробнее см. в разделе "Исправленные проблемы".

Try Managed Milvus for Free

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

Get Started

Like the article? Spread the word

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