ما هي قوى البحث عن التشابه في قاعدة بيانات متجهات ميلفوس؟
صورة الغلاف
هذا المقال بقلم يودونغ كاي وترجمة أنجيلا ني.
بصفته محرك التنفيذ المتجه الأساسي، فإن نوير بالنسبة لميلفوس هو ما يمثله المحرك بالنسبة للسيارة الرياضية. يقدم هذا المنشور ماهية نوير، وكيف يختلف عن فايس، وكيف يتم تنظيم كود نوير.
انتقل إلى:
مفهوم نوير في أي مكان
بشكل ضيق، نوير هو واجهة تشغيل للوصول إلى الخدمات في الطبقات العليا من النظام ومكتبات البحث عن التشابه المتجه مثل Faiss و Hnswlib و Annoy في الطبقات السفلى من النظام. بالإضافة إلى ذلك، فإن Knowhere مسؤول أيضًا عن الحوسبة غير المتجانسة. وبشكل أكثر تحديدًا، يتحكم نوهير في الأجهزة (مثل وحدة المعالجة المركزية أو وحدة معالجة الرسومات) لتنفيذ طلبات بناء الفهرس والبحث. هذه هي الطريقة التي حصلت بها نوير على اسمها - معرفة مكان تنفيذ العمليات. سيتم دعم المزيد من أنواع الأجهزة بما في ذلك DPU و TPU في الإصدارات المستقبلية.
وبمعنى أوسع، يشتمل نوير أيضًا على مكتبات فهرسة أخرى تابعة لجهات خارجية مثل Faiss. لذلك، ككل، يتم التعرف على Knowhere كمحرك أساسي لحساب المتجهات في قاعدة بيانات Milvus المتجهة.
من مفهوم Knowhere، يمكننا أن نرى أنه يعالج فقط مهام حوسبة البيانات، في حين أن تلك المهام مثل التجزئة وتوازن التحميل واستعادة البيانات بعد الكوارث تقع خارج نطاق عمل Knowhere.
بدءاً من الإصدار 2.0.1 من ميلفوس 2.0.1، يصبح نوير (بالمعنى الأوسع) مستقلاً عن مشروع ميلفوس.
نوير في بنية ميلفوس
بنية نولفير
تتضمن العمليات الحسابية في ميلفوس بشكل أساسي العمليات المتجهة والقياسية. يتعامل نوير فقط مع العمليات على المتجهات في ملفوس. يوضح الشكل أعلاه بنية نوير في ميلفوس.
الطبقة السفلية هي أجهزة النظام. توجد مكتبات الفهرس التابعة لجهة خارجية فوق الأجهزة. ثم يتفاعل Knowhere مع عقدة الفهرس وعقدة الاستعلام في الأعلى عبر CGO.
تتحدث هذه المقالة عن نوير بمعناه الأوسع، كما هو محدد داخل الإطار الأزرق في الرسم التوضيحي للبنية.
نوير مقابل فايس
لا يقتصر دور Knowhere على توسيع وظائف Faiss فحسب، بل يعمل أيضًا على تحسين الأداء. وبشكل أكثر تحديدًا، يتمتع نوير بالمزايا التالية.
1. دعم BitsetView
في البداية، تم تقديم مجموعة البتات في Milvus لغرض "الحذف الناعم". لا يزال المتجه المحذوف حذفًا ناعمًا موجودًا في قاعدة البيانات ولكن لن يتم حسابه أثناء البحث أو الاستعلام عن تشابه المتجهات. يتوافق كل بت في مجموعة البتات مع متجه مفهرس. إذا تم وضع علامة "1" على أحد المتجهات في مجموعة البتات، فهذا يعني أن هذا المتجه محذوف بشكل ناعم ولن يتم تضمينه أثناء البحث عن المتجهات.
تتم إضافة معلمات مجموعة البتات إلى جميع واجهات برمجة تطبيقات استعلام فهرس فايس المكشوفة في نوير، بما في ذلك فهارس وحدة المعالجة المركزية ووحدة معالجة الرسومات.
تعرف على المزيد حول كيفية تمكين مجموعة البتات من تعدد استخدامات البحث المتجه.
2. دعم المزيد من مقاييس التشابه لفهرسة المتجهات الثنائية
بالإضافة إلى هامينغ، يدعم نوهير أيضًا Jaccard وTanimoto وTanimoto وSupstructure وSubstructure. يمكن استخدام Jaccard وTanimoto لقياس التشابه بين مجموعتين من العينات بينما يمكن استخدام البنية الفائقة والبنية الفرعية لقياس تشابه البنى الكيميائية.
3. دعم مجموعة تعليمات AVX512
يدعم فايس نفسه مجموعات تعليمات متعددة بما في ذلك AArch64، SSE4.2، AVX2. يوسع Knowhere مجموعات التعليمات المدعومة عن طريق إضافة AVX512، والتي يمكن أن تحسن أداء بناء الفهرس والاستعلام بنسبة 20% إلى 30% مقارنةً ب AVX2.
4. الاختيار التلقائي لتعليمات SIMD
تم تصميم Knowhere ليعمل بشكل جيد على مجموعة واسعة من معالجات وحدة المعالجة المركزية (سواءً في المنصات المحلية أو السحابية) مع تعليمات SIMD مختلفة (على سبيل المثال، SIMD SSE و AVX و AVX2 و AVX512). وبالتالي، فإن التحدي هو، بالنظر إلى جزء واحد من برنامج ثنائي البرمجيات (أي Milvus)، كيف يمكن جعله يستدعي تلقائيًا تعليمات SIMD المناسبة على أي معالج وحدة المعالجة المركزية؟ لا يدعم Faiss الاختيار التلقائي لتعليمات SIMD ويحتاج المستخدمون إلى تحديد علامة SIMD يدويًا (على سبيل المثال، "-msse4") أثناء التحويل البرمجي. ومع ذلك، تم بناء Knowhere من خلال إعادة هيكلة قاعدة كود Faiss. يتم تحليل الدوال الشائعة (على سبيل المثال، حوسبة التشابه) التي تعتمد على تسريع SIMD. ثم يتم تنفيذ أربعة إصدارات لكل دالة (أي SSE، AVX، AVX2، AVX512) ويتم وضع كل منها في ملف مصدر منفصل. ثم يتم تجميع الملفات المصدرية بشكل فردي مع علامة SIMD المقابلة. لذلك، في وقت التشغيل، يمكن ل Knowhere اختيار تعليمات SIMD الأنسب تلقائيًا في وقت التشغيل بناءً على علامات وحدة المعالجة المركزية الحالية ثم ربط مؤشرات الدالة الصحيحة باستخدام التثبيت.
5. تحسينات أخرى للأداء
اقرأ ميلفوس: نظام إدارة بيانات المتجهات المصمم لغرض معين لمعرفة المزيد عن تحسين أداء نوهير.
فهم كود نوير
كما ذكرنا في القسم الأول، يتعامل نوير مع عمليات البحث عن المتجهات فقط. لذلك، يعالج Knowhere فقط الحقل المتجه للكيان (حاليًا، يتم دعم حقل متجه واحد فقط للكيانات في المجموعة). يستهدف بناء الفهرس والبحث عن تشابه المتجهات أيضاً الحقل المتجه في مقطع ما. للحصول على فهم أفضل لنموذج البيانات، اقرأ المدونة هنا.
حقول الكيانات
الفهرس
الفهرس هو نوع من بنية البيانات المستقلة عن البيانات المتجهة الأصلية. وتتطلب الفهرسة أربع خطوات: إنشاء فهرس، وتدريب البيانات، وإدراج البيانات، وإنشاء فهرس.
بالنسبة لبعض تطبيقات الذكاء الاصطناعي، يعد تدريب مجموعة البيانات عملية مستقلة عن البحث عن المتجهات. في هذا النوع من التطبيقات، يتم تدريب البيانات من مجموعات البيانات أولاً ثم إدراجها في قاعدة بيانات متجهة مثل Milvus للبحث عن التشابه. توفر مجموعات البيانات المفتوحة مثل sift1M و sift1B بيانات للتدريب والاختبار. ومع ذلك، في Knowhere، يتم خلط بيانات التدريب والبحث معًا. وهذا يعني أن نوهير يقوم بتدريب جميع البيانات في مقطع ما ثم يقوم بإدراج جميع البيانات المدربة وإنشاء فهرس لها.
هيكل كود نوير
DataObj هي الفئة الأساسية لكل بنية البيانات في نوير. Size()
هي الطريقة الافتراضية الوحيدة في DataObj. يرث صنف الفهرس من DataObj مع حقل يسمى "size_". تحتوي فئة الفهرس أيضًا على طريقتين افتراضيتين - Serialize()
و Load()
. فئة VecIndex المشتقة من الفهرس هي الفئة الأساسية الافتراضية لجميع فهارس المتجهات. توفر VecIndex طرقًا تتضمن Train()
و Query()
و GetStatistics()
و ClearStatistics()
.
الفئة الأساسية
يتم سرد أنواع الفهارس الأخرى على اليمين في الشكل أعلاه.
- يحتوي فهرس فايس على فئتين فرعيتين: فهرس FaissBaseIndex لجميع الفهارس على متجهات النقطة العائمة، وفهرس FaissBaseBinaryIndex لجميع الفهارس على المتجهات الثنائية.
- GPUIndex هي الفئة الأساسية لجميع فهارس Faiss GPU.
- OffsetBaseBaseIndex هي الفئة الأساسية لجميع الفهارس المطورة ذاتيًا. يتم تخزين معرف المتجه فقط في ملف الفهرس. ونتيجة لذلك، يمكن تقليل حجم ملف الفهرس للمتجهات ذات الـ 128 بُعدًا بمقدار 2 من حيث الحجم. نوصي بأخذ المتجهات الأصلية في الاعتبار أيضًا عند استخدام هذا النوع من الفهرس للبحث عن تشابه المتجهات.
IDMAP
من الناحية الفنية، IDMAP ليس فهرسًا، بل يُستخدم للبحث بالقوة الغاشمة. عندما يتم إدراج المتجهات في قاعدة بيانات المتجهات، لا يلزم تدريب البيانات وبناء الفهرس. سيتم إجراء عمليات البحث مباشرةً على بيانات المتجهات المدرجة.
ومع ذلك، من أجل اتساق الكود، يرث IDMAP أيضًا من فئة VecIndex بجميع واجهاتها الافتراضية. استخدام IDMAP هو نفسه استخدام الفهارس الأخرى.
IVF
فهارس IVF (الملف المقلوب) هي الأكثر استخدامًا. وفئة IVF مشتقة من VecIndex وFaissBaseIndex، وتمتد كذلك إلى IVFSQ وIVFPQ. يشتق GPUIVF من GPUIndex وIVF. ثم يمتد GPUIVF كذلك إلى GPUIVFSQ وGPUIVFPQ.
IVFSQHybrid هي فئة للفهرس الهجين المطور ذاتيًا الذي يتم تنفيذه بواسطة التكميم الخشن على وحدة معالجة الرسومات. ويتم تنفيذ البحث في الدلو على وحدة المعالجة المركزية. يمكن أن يقلل هذا النوع من الفهرس من حدوث نسخ الذاكرة بين وحدة المعالجة المركزية ووحدة معالجة الرسومات من خلال الاستفادة من قوة الحوسبة لوحدة معالجة الرسومات. يحتوي IVFSQHybrid على نفس معدل الاستدعاء مثل GPUIVFSQ ولكنه يأتي بأداء أفضل.
بنية الفئة الأساسية للفهارس الثنائية أبسط نسبيًا. يتم اشتقاق BinaryIDMAP و BinaryIVF من FaissBaseBinaryBinaryIndex و VecIndex.
فهرس الطرف الثالث
في الوقت الحالي، هناك نوعان فقط من فهارس الطرف الثالث مدعومان باستثناء فهرس فايس: الفهرس القائم على الشجرة Annoy، والفهرس القائم على الرسم البياني HNSW. هذان الفهرسان الخارجيان الشائعان والمستخدمان بشكل متكرر كلاهما مشتقان من VecIndex.
إضافة فهارس إلى "نوير
إذا كنت تريد إضافة فهارس جديدة إلى نوير، يمكنك الرجوع إلى الفهارس الموجودة أولاً:
- لإضافة فهرس قائم على الكمية، ارجع إلى IVF_FLAT.
- لإضافة فهرس قائم على الرسم البياني، ارجع إلى HNSW.
- لإضافة فهرس مستند إلى الشجرة، ارجع إلى أنوي.
بعد الرجوع إلى الفهرس الموجود، يمكنك اتباع الخطوات أدناه لإضافة فهرس جديد إلى نوير.
- أضف اسم الفهرس الجديد في
IndexEnum
. نوع البيانات هو سلسلة. - أضف فحص التحقق من صحة البيانات على الفهرس الجديد في الملف
ConfAdapter.cpp
. التحقق من الصحة هو بشكل أساسي للتحقق من صحة المعلمات لتدريب البيانات والاستعلام. - قم بإنشاء ملف جديد للفهرس الجديد. يجب أن تتضمن الفئة الأساسية للفهرس الجديد
VecIndex
، والواجهة الافتراضية اللازمةVecIndex
. - أضف منطق بناء الفهرس للفهرس الجديد في
VecIndexFactory::CreateVecIndex()
. - أضف اختبار الوحدة ضمن الدليل
unittest
.
حول سلسلة الغوص العميق
مع الإعلان الرسمي عن التوفر العام لميلفوس 2.0، نظمنا سلسلة مدونات الغوص العميق هذه لتقديم تفسير متعمق لبنية ميلفوس وكود المصدر. تشمل الموضوعات التي تتناولها سلسلة المدونات هذه ما يلي:
- مفهوم نوير في أي مكان
- نوير في بنية ميلفوس
- نوير مقابل فايس
- فهم كود نوير
- إضافة فهارس إلى "نوير
- حول سلسلة الغوص العميق
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