الميزات الجديدة
Milvus هو مشروع برمجيات مفتوحة المصدر (OSS) مستمر يركز على بناء أسرع قاعدة بيانات متجهات في العالم وأكثرها موثوقية. الميزات الجديدة داخل Milvus v1.1.0 هي أول التحديثات القادمة بفضل الدعم طويل الأمد من مجتمع البرمجيات مفتوحة المصدر والرعاية من Zilliz. تغطي مقالة المدونة هذه الميزات الجديدة والتحسينات وإصلاحات الأخطاء المضمنة في الإصدار Milvus v1.1.0.
انتقل إلى:
الميزات الجديدة
مثل أي مشروع برمجيات مفتوحة المصدر، فإن ميلفوس هو عمل دائم قيد التطوير. نحن نسعى جاهدين للاستماع إلى مستخدمينا ومجتمع المصادر المفتوحة لتحديد أولويات الميزات الأكثر أهمية. يقدم آخر تحديث، Milvus v1.1.0، الميزات الجديدة التالية:
تحديد الأقسام باستخدام get_entity_by_id()
استدعاءات طريقة
لزيادة تسريع البحث عن تشابه المتجهات، يدعم Milvus 1.1.0 الآن استرجاع المتجهات من قسم محدد. بشكل عام، يدعم Milvus الاستعلام عن المتجهات من خلال معرفات متجهات محددة. في الإصدار Milvus 1.0 من 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، بل قمنا أيضًا بتحديث جميع حزم SDKs الخاصة بنا (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، لا يمكن حذف المتجهات في مجموعة إلا عن طريق المعرف. عند استدعاء طريقة الحذف، سيقوم Milvus بمسح جميع المتجهات في المجموعة. ومع ذلك، فإنه من الأكثر كفاءة بكثير مسح الأجزاء ذات الصلة فقط عند العمل مع مجموعات بيانات متجهات ضخمة بملايين أو مليارات أو حتى تريليون متجه. على غرار الميزة الجديدة لتحديد الأقسام باستخدام استدعاءات الأسلوب get_entity_by_id()
، تم إجراء تعديلات على كود Milvus باستخدام نفس المنطق.
طريقة جديدة release_collection()
لتحرير ذاكرة Milvus المستخدمة لتحميل المجموعات في وقت التشغيل، تمت إضافة طريقة جديدة release_collection()
في Milvus v1.1.0 لتفريغ مجموعات محددة يدويًا من ذاكرة التخزين المؤقت.
التحسينات
على الرغم من أن الميزات الجديدة عادةً ما تكون في غاية الأهمية، إلا أنه من المهم أيضًا تحسين ما لدينا بالفعل. ما يلي هو ترقيات وتحسينات عامة أخرى على الإصدار 1.0 من ميلفوس.
تحسين أداء استدعاء الأسلوب get_entity_by_id()
الرسم البياني أدناه هو مقارنة أداء البحث المتجه بين Milvus v1.0 و Milvus v1.1.0:
وحدة المعالجة المركزية: وحدة المعالجة المركزية Intel® Core™ i7-8550U @ 1.80 جيجا هرتز * 8
حجم ملف المقطع = 1024 ميجابايت
عدد الصفوف = 1,000,000
خافت = 128
رقم معرف الاستعلام | 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 وطلب العلاقات العامة المقترح:
وحدة المعالجة المركزية: وحدة المعالجة المركزية Intel® Core™ i7-8550U @ 1.80 جيجا هرتز * 8
مجموعة البيانات: sift_1M (عدد الصفوف = 1000000، خافت = 128، المساحة = 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 على تحسين عنصر التدريب في بناء الفهرس. الرسم البياني أدناه هو مقارنة لأداء تدريب فهرس IVF بين Milvus 1.0 و Milvus 1.1.0:
وحدة المعالجة المركزية: وحدة المعالجة المركزية Intel® Core™ i7-8550U @ 1.80 جيجا هرتز * 8
مجموعة البيانات: sift_1m (عدد الصفوف = 1000000، خافت = 128، نوع_المقياس = L2)
الإصدار 1.0.0 (مللي ثانية) | الإصدار 1.1.0 (مللي ثانية) | |
---|---|---|
ivf_flat (nlist = 2048) | 90079 | 81544 |
ivf_pq (قائمة رقمية = 2048، م=16) | 103535 | 97115 |
ivf_pq (القائمة = 2048، م=32) | 108638 | 104558 |
ivf_flat (القائمة = 4096) | 340643 | 310685 |
ivf_pq (القائمة = 4096، م=16) | 351982 | 323758 |
ivf_pq (القائمة = 4096، م=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