🚀 جرب Zilliz Cloud، الـ Milvus المدارة بالكامل، مجاناً — تجربة أداء أسرع بـ 10 أضعاف! جرب الآن>>

milvus-logo
LFAI

الميزات الجديدة

  • News
May 20, 2021
milvus

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.0v1.1.0
109 مللي ثانية2 مللي ثانية
100149 مللي ثانية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.0PR-298
M = 16، ef_construction = 100274406 مللي ثانية265631 مللي ثانية
M = 16، ef_construction = 200522411 مللي ثانية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)9007981544
ivf_pq (قائمة رقمية = 2048، م=16)10353597115
ivf_pq (القائمة = 2048، م=32)108638104558
ivf_flat (القائمة = 4096)340643310685
ivf_pq (القائمة = 4096، م=16)351982323758
ivf_pq (القائمة = 4096، م=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

استمر في القراءة