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