Fitur-fitur baru
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 Kueri | v 1.0.0 | v1.1.0 |
---|---|---|
10 | 9 ms | 2 ms |
100 | 149 ms | 19 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.0 | PR-298 | |
---|---|---|
M = 16, ef_konstruksi = 100 | 274406 ms | 265631 ms |
M = 16, ef_konstruksi = 200 | 522411 ms | 499639 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) | 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 |
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.
- Perbaikan
- Perbaikan bug
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