šŸš€ Coba Zilliz Cloud, Milvus yang sepenuhnya terkelola, secara gratisā€”rasakan performa 10x lebih cepat! Coba Sekarang>>

milvus-logo
LFAI

HomeBlogsFitur-fitur baru

Fitur-fitur baru

  • News
May 20, 2021
milvus

Milvus adalah sebuah proyek perangkat lunak sumber terbuka (OSS) yang sedang berlangsung yang berfokus pada pembuatan basis data vektor tercepat dan paling andal di dunia. Fitur-fitur baru di dalam Milvus v1.1.0 adalah yang pertama dari banyak pembaruan yang akan datang, berkat dukungan jangka panjang dari komunitas sumber terbuka dan sponsor dari Zilliz. Artikel blog ini mencakup fitur-fitur baru, peningkatan, dan perbaikan bug yang disertakan dalam Milvus v1.1.0.

Langsung ke:


Fitur-fitur baru

Seperti proyek OSS lainnya, Milvus adalah sebuah karya yang terus berkembang. Kami berusaha untuk mendengarkan para pengguna kami dan komunitas sumber terbuka untuk memprioritaskan fitur-fitur yang paling penting. Pembaruan terbaru, Milvus v1.1.0, menawarkan fitur-fitur baru berikut ini:

Menentukan partisi dengan pemanggilan metode get_entity_by_id()

Untuk lebih mempercepat pencarian kemiripan vektor, Milvus 1.1.0 sekarang mendukung pengambilan vektor dari partisi tertentu. Secara umum, Milvus mendukung permintaan vektor melalui ID vektor yang ditentukan. Dalam Milvus 1.0, memanggil metode get_entity_by_id() akan mencari seluruh koleksi, yang dapat memakan waktu untuk kumpulan data yang besar. Seperti yang bisa kita lihat dari kode di bawah ini, GetVectorsByIdHelper menggunakan struktur FileHolder untuk mengulang dan menemukan vektor tertentu.

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) { 

Namun, struktur ini tidak disaring oleh partisi apa pun di FilesByTypeEx(). Di Milvus v1.1.0, sistem dapat memberikan nama partisi kepada perulangan GetVectorsIdHelper sehingga FileHolder hanya berisi segmen-segmen dari partisi tertentu. Dengan kata lain, jika Anda mengetahui dengan pasti partisi mana vektor untuk pencarian, Anda dapat menentukan nama partisi dalam pemanggilan metode get_entity_by_id() untuk mempercepat proses pencarian.

Kami tidak hanya melakukan modifikasi pada kode yang mengendalikan kueri sistem di tingkat server Milvus, tetapi juga memperbarui semua SDK kami (Python, Go, C++, Java, dan RESTful) dengan menambahkan sebuah parameter untuk menentukan nama partisi. Sebagai contoh, pada pymilvus, definisi get_entity_by_id def get_entity_by_id(self, collection_name, ids, timeout=None) diubah menjadi def get_entity_by_id(self, collection_name, partition_tags=None, ids, timeout=None).


Menentukan partisi dengan pemanggilan metode delete_entity_by_id()

Untuk membuat manajemen vektor menjadi lebih efisien, Milvus v1.1.0 sekarang mendukung penentuan nama partisi ketika menghapus sebuah vektor dalam sebuah koleksi. Pada Milvus 1.0, vektor dalam koleksi hanya dapat dihapus berdasarkan ID. Ketika memanggil metode hapus, Milvus akan memindai semua vektor di dalam koleksi. Namun, akan jauh lebih efisien untuk memindai hanya partisi yang relevan ketika bekerja dengan kumpulan data vektor dalam jumlah jutaan, miliaran, atau bahkan triliunan. Mirip dengan fitur baru untuk menentukan partisi dengan pemanggilan metode get_entity_by_id(), modifikasi dibuat pada kode Milvus menggunakan logika yang sama.


Metode baru release_collection()

Untuk mengosongkan memori yang digunakan Milvus untuk memuat koleksi pada saat runtime, sebuah metode baru release_collection() telah ditambahkan di Milvus v1.1.0 untuk secara manual membongkar koleksi tertentu dari cache.


Perbaikan

Meskipun fitur-fitur baru biasanya sangat populer, penting juga untuk meningkatkan apa yang sudah kita miliki. Berikut ini adalah peningkatan dan perbaikan umum lainnya pada Milvus v1.0.


Peningkatan kinerja pemanggilan metode get_entity_by_id()

Grafik di bawah ini adalah perbandingan performa pencarian vektor antara Milvus v1.0 dan Milvus v1.1.0:

CPU: IntelĀ® Coreā„¢ i7-8550U CPU @ 1.80GHz * 8
Ukuran file segmen = 1024 MB
Jumlah baris = 1.000.000
Redup = 128

Nomor ID Kueriv 1.0.0v1.1.0
109 ms2 ms
100149 ms19 ms


Hnswlib ditingkatkan ke v0.5.0

Milvus mengadopsi beberapa pustaka indeks yang banyak digunakan, termasuk Faiss, NMSLIB, Hnswlib, dan Annoy untuk menyederhanakan proses pemilihan jenis indeks yang tepat untuk skenario tertentu.

Hnswlib telah ditingkatkan dari v0.3.0 ke v0.5.0 di Milvus 1.1.0 karena adanya bug yang terdeteksi di versi sebelumnya. Selain itu, meningkatkan Hnswlib meningkatkan kinerja addPoint() dalam pembuatan indeks.

Seorang pengembang Zilliz membuat sebuah pull request (PR) untuk meningkatkan performa Hnswlib ketika membangun indeks di Milvus. Lihat PR #298 untuk detailnya.

Grafik di bawah ini adalah perbandingan performa addPoint() antara Hnswlib 0.5.0 dengan PR yang diajukan:

CPU: IntelĀ® Coreā„¢ i7-8550U CPU @ 1.80GHz * 8
Dataset: sift_1M (jumlah baris = 1000000, dim = 128, spasi = L2)

0.5.0PR-298
M = 16, ef_konstruksi = 100274406 ms265631 ms
M = 16, ef_konstruksi = 200522411 ms499639 ms


Peningkatan kinerja pelatihan indeks IVF

Membuat indeks mencakup pelatihan, memasukkan dan menulis data ke disk. Milvus 1.1.0 meningkatkan komponen pelatihan pembuatan indeks. Bagan di bawah ini adalah perbandingan performa pelatihan indeks IVF antara Milvus 1.0 dan Milvus 1.1.0:

CPU: IntelĀ® Coreā„¢ i7-8550U CPU @ 1.80GHz * 8
Dataset: 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


Perbaikan bug

Kami juga memperbaiki beberapa bug untuk membuat Milvus lebih stabil dan efisien ketika mengelola kumpulan data vektor. Lihat Masalah yang Diperbaiki untuk lebih jelasnya.

Try Managed Milvus for Free

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

Get Started

Like the article? Spread the word

Terus Baca