新功能
Milvus是一個持續進行中的開放原始碼軟體 (OSS) 專案,專注於建立全球最快、最可靠的向量資料庫。由於開源社群的長期支持以及 Zilliz 的贊助,Milvus v1.1.0 的新功能是眾多更新中的第一個。這篇部落格文章涵蓋 Milvus v1.1.0 所包含的新功能、改進與錯誤修正。
跳至
新功能
就像任何 OSS 專案一樣,Milvus 是一個永遠在進步中的工作。我們努力傾聽用戶和開源社群的意見,優先處理最重要的功能。最新更新版本 Milvus v1.1.0 提供以下新功能:
以get_entity_by_id()
方法呼叫指定分區
為了進一步加速向量相似性搜尋,Milvus 1.1.0 現在支援從指定的分割區檢索向量。一般而言,Milvus 支援透過指定向量 ID 來查詢向量。在 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 中,集合中的向量只能透過 ID 刪除。當呼叫 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 的向量搜尋效能比較:
CPU:Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
Segment file size = 1024 MB
Row count = 1,000,000
Dim = 128
查詢 ID 編號 | v 1.0.0 | v1.1.0 |
---|---|---|
10 | 9 毫秒 | 2 ms |
100 | 149 毫秒 | 19 ms |
Hnswlib 升級至 v0.5.0
Milvus 採用多個廣泛使用的索引函式庫,包括 Faiss、NMSLIB、Hnswlib 和 Annoy,以簡化針對特定情況選擇適當索引類型的過程。
在 Milvus 1.1.0 中,Hnswlib 已從 v0.3.0 升級至 v0.5.0,這是由於在早期版本中發現了一個錯誤。此外,升級 Hnswlib 也改善了addPoint()
在建立索引時的效能。
一位 Zilliz 開發人員建立了一個 pull request (PR) 來改善 Hnswlib 在 Milvus 中建立索引時的效能。詳情請參閱PR #298。
下圖為 Hnswlib 0.5.0 與 PR 建議的addPoint()
效能比較:
CPU: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 ms | 265631 ms |
M = 16, ef_construction = 200 | 522411 ms | 499639 ms |
改進的 IVF 索引訓練效能
建立索引包括訓練、插入和寫入資料到磁碟。Milvus 1.1.0 改善了索引建立的訓練部分。下圖是 Milvus 1.0 和 Milvus 1.1.0 的 IVF 索引訓練效能比較:
CPU:Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
資料集:sift_1m (row_count = 1000000, dim = 128, metric_type = L2)
v1.0.0 (ms) | v1.1.0 (ms) | |
---|---|---|
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 在管理向量資料集時更穩定、更有效率。詳情請參閱修正的問題。
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word