Новые возможности
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
Идентификатор запроса Num | v 1.0.0 | v1.1.0 |
---|---|---|
10 | 9 мс | 2 мс |
100 | 149 мс | 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.0 | PR-298 | |
---|---|---|
M = 16, ef_construction = 100 | 274406 мс | 265631 мс |
M = 16, ef_construction = 200 | 522411 мс | 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) | 90079 | 81544 |
ivf_pq (nlist = 2048, m=16) | 103535 | 97115 |
ivf_pq (nlist = 2048, m=32) | 108638 | 104558 |
ivf_flat (nlist = 4096) | 340643 | 310685 |
ivf_pq (nlist = 4096, m=16) | 351982 | 323758 |
ivf_pq (nlist = 4096, m=32) | 357359 | 330887 |
Исправления ошибок
Мы также исправили несколько ошибок, чтобы сделать Milvus более стабильным и эффективным при работе с векторными наборами данных. Подробнее см. в разделе "Исправленные проблемы".
- Улучшения
- Исправления ошибок
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word