🚀 免費嘗試 Zilliz Cloud,完全托管的 Milvus,體驗速度提升 10 倍!立即嘗試

milvus-logo
LFAI

HomeBlogs新功能

新功能

  • News
May 20, 2021
milvus

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.0v1.1.0
109 毫秒2 ms
100149 毫秒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.0PR-298
M = 16, ef_construction = 100274406 ms265631 ms
M = 16, ef_construction = 200522411 ms499639 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)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

繼續閱讀