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

milvus-logo
LFAI
  • Home
  • Blog
  • ما هي قوى البحث عن التشابه في قاعدة بيانات متجهات ميلفوس؟

ما هي قوى البحث عن التشابه في قاعدة بيانات متجهات ميلفوس؟

  • Engineering
May 10, 2022
Yudong Cai

cover image صورة الغلاف

هذا المقال بقلم يودونغ كاي وترجمة أنجيلا ني.

بصفته محرك التنفيذ المتجه الأساسي، فإن نوير بالنسبة لميلفوس هو ما يمثله المحرك بالنسبة للسيارة الرياضية. يقدم هذا المنشور ماهية نوير، وكيف يختلف عن فايس، وكيف يتم تنظيم كود نوير.

انتقل إلى:

مفهوم نوير في أي مكان

بشكل ضيق، نوير هو واجهة تشغيل للوصول إلى الخدمات في الطبقات العليا من النظام ومكتبات البحث عن التشابه المتجه مثل Faiss و Hnswlib و Annoy في الطبقات السفلى من النظام. بالإضافة إلى ذلك، فإن Knowhere مسؤول أيضًا عن الحوسبة غير المتجانسة. وبشكل أكثر تحديدًا، يتحكم نوهير في الأجهزة (مثل وحدة المعالجة المركزية أو وحدة معالجة الرسومات) لتنفيذ طلبات بناء الفهرس والبحث. هذه هي الطريقة التي حصلت بها نوير على اسمها - معرفة مكان تنفيذ العمليات. سيتم دعم المزيد من أنواع الأجهزة بما في ذلك DPU و TPU في الإصدارات المستقبلية.

وبمعنى أوسع، يشتمل نوير أيضًا على مكتبات فهرسة أخرى تابعة لجهات خارجية مثل Faiss. لذلك، ككل، يتم التعرف على Knowhere كمحرك أساسي لحساب المتجهات في قاعدة بيانات Milvus المتجهة.

من مفهوم Knowhere، يمكننا أن نرى أنه يعالج فقط مهام حوسبة البيانات، في حين أن تلك المهام مثل التجزئة وتوازن التحميل واستعادة البيانات بعد الكوارث تقع خارج نطاق عمل Knowhere.

بدءاً من الإصدار 2.0.1 من ميلفوس 2.0.1، يصبح نوير (بالمعنى الأوسع) مستقلاً عن مشروع ميلفوس.

نوير في بنية ميلفوس

knowhere architecture بنية نولفير

تتضمن العمليات الحسابية في ميلفوس بشكل أساسي العمليات المتجهة والقياسية. يتعامل نوير فقط مع العمليات على المتجهات في ملفوس. يوضح الشكل أعلاه بنية نوير في ميلفوس.

الطبقة السفلية هي أجهزة النظام. توجد مكتبات الفهرس التابعة لجهة خارجية فوق الأجهزة. ثم يتفاعل 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 فقط الحقل المتجه للكيان (حاليًا، يتم دعم حقل متجه واحد فقط للكيانات في المجموعة). يستهدف بناء الفهرس والبحث عن تشابه المتجهات أيضاً الحقل المتجه في مقطع ما. للحصول على فهم أفضل لنموذج البيانات، اقرأ المدونة هنا.

entity fields حقول الكيانات

الفهرس

الفهرس هو نوع من بنية البيانات المستقلة عن البيانات المتجهة الأصلية. وتتطلب الفهرسة أربع خطوات: إنشاء فهرس، وتدريب البيانات، وإدراج البيانات، وإنشاء فهرس.

بالنسبة لبعض تطبيقات الذكاء الاصطناعي، يعد تدريب مجموعة البيانات عملية مستقلة عن البحث عن المتجهات. في هذا النوع من التطبيقات، يتم تدريب البيانات من مجموعات البيانات أولاً ثم إدراجها في قاعدة بيانات متجهة مثل Milvus للبحث عن التشابه. توفر مجموعات البيانات المفتوحة مثل sift1M و sift1B بيانات للتدريب والاختبار. ومع ذلك، في Knowhere، يتم خلط بيانات التدريب والبحث معًا. وهذا يعني أن نوهير يقوم بتدريب جميع البيانات في مقطع ما ثم يقوم بإدراج جميع البيانات المدربة وإنشاء فهرس لها.

هيكل كود نوير

DataObj هي الفئة الأساسية لكل بنية البيانات في نوير. Size() هي الطريقة الافتراضية الوحيدة في DataObj. يرث صنف الفهرس من DataObj مع حقل يسمى "size_". تحتوي فئة الفهرس أيضًا على طريقتين افتراضيتين - Serialize() و Load(). فئة VecIndex المشتقة من الفهرس هي الفئة الأساسية الافتراضية لجميع فهارس المتجهات. توفر VecIndex طرقًا تتضمن Train() و Query() و GetStatistics() و ClearStatistics().

base clase الفئة الأساسية

يتم سرد أنواع الفهارس الأخرى على اليمين في الشكل أعلاه.

  • يحتوي فهرس فايس على فئتين فرعيتين: فهرس FaissBaseIndex لجميع الفهارس على متجهات النقطة العائمة، وفهرس FaissBaseBinaryIndex لجميع الفهارس على المتجهات الثنائية.
  • GPUIndex هي الفئة الأساسية لجميع فهارس Faiss GPU.
  • OffsetBaseBaseIndex هي الفئة الأساسية لجميع الفهارس المطورة ذاتيًا. يتم تخزين معرف المتجه فقط في ملف الفهرس. ونتيجة لذلك، يمكن تقليل حجم ملف الفهرس للمتجهات ذات الـ 128 بُعدًا بمقدار 2 من حيث الحجم. نوصي بأخذ المتجهات الأصلية في الاعتبار أيضًا عند استخدام هذا النوع من الفهرس للبحث عن تشابه المتجهات.

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 من FaissBaseBinaryBinaryIndex و VecIndex.

third-party index فهرس الطرف الثالث

في الوقت الحالي، هناك نوعان فقط من فهارس الطرف الثالث مدعومان باستثناء فهرس فايس: الفهرس القائم على الشجرة Annoy، والفهرس القائم على الرسم البياني HNSW. هذان الفهرسان الخارجيان الشائعان والمستخدمان بشكل متكرر كلاهما مشتقان من VecIndex.

إضافة فهارس إلى "نوير

إذا كنت تريد إضافة فهارس جديدة إلى نوير، يمكنك الرجوع إلى الفهارس الموجودة أولاً:

  • لإضافة فهرس قائم على الكمية، ارجع إلى IVF_FLAT.
  • لإضافة فهرس قائم على الرسم البياني، ارجع إلى HNSW.
  • لإضافة فهرس مستند إلى الشجرة، ارجع إلى أنوي.

بعد الرجوع إلى الفهرس الموجود، يمكنك اتباع الخطوات أدناه لإضافة فهرس جديد إلى نوير.

  1. أضف اسم الفهرس الجديد في IndexEnum. نوع البيانات هو سلسلة.
  2. أضف فحص التحقق من صحة البيانات على الفهرس الجديد في الملف ConfAdapter.cpp. التحقق من الصحة هو بشكل أساسي للتحقق من صحة المعلمات لتدريب البيانات والاستعلام.
  3. قم بإنشاء ملف جديد للفهرس الجديد. يجب أن تتضمن الفئة الأساسية للفهرس الجديد VecIndex ، والواجهة الافتراضية اللازمة VecIndex.
  4. أضف منطق بناء الفهرس للفهرس الجديد في VecIndexFactory::CreateVecIndex().
  5. أضف اختبار الوحدة ضمن الدليل unittest.

حول سلسلة الغوص العميق

مع الإعلان الرسمي عن التوفر العام لميلفوس 2.0، نظمنا سلسلة مدونات الغوص العميق هذه لتقديم تفسير متعمق لبنية ميلفوس وكود المصدر. تشمل الموضوعات التي تتناولها سلسلة المدونات هذه ما يلي:

Like the article? Spread the word

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