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

milvus-logo
LFAI

الخلفية

  • Engineering
March 03, 2020
milvus

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

الخلفية

نحن نعلم من إدارة البيانات في محرك البحث المتجه الضخم النطاق أن البحث عن التشابه المتجه يتم تنفيذه من خلال المسافة بين متجهين في الفضاء عالي الأبعاد. الهدف من البحث عن المتجهات هو إيجاد المتجهات K الأقرب إلى المتجه الهدف.

هناك العديد من الطرق لقياس المسافة بين المتجهات، مثل المسافة الإقليدية:

1-euclidean-distance.png 1-euclidean-distance.png

حيث x و y متجهان. n هو بُعد المتجهات.

للعثور على أقرب متجهات K في مجموعة البيانات، يجب حساب المسافة الإقليدية بين المتجه الهدف وجميع المتجهات في مجموعة البيانات المراد البحث عنها. بعد ذلك، يتم فرز المتجهات حسب المسافة للحصول على أقرب K من المتجهات. يتناسب العمل الحسابي تناسبًا طرديًا مع حجم مجموعة البيانات. كلما زاد حجم مجموعة البيانات، زاد العمل الحسابي الذي يتطلبه الاستعلام. تصادف أن وحدة معالجة الرسوم البيانية (GPU) المتخصصة في معالجة الرسوم البيانية تحتوي على الكثير من النوى لتوفير القدرة الحاسوبية المطلوبة. وبالتالي، يتم أيضًا أخذ دعم وحدات معالجة الرسومات المتعددة في الاعتبار أثناء تنفيذ Milvus.

المفاهيم الأساسية

كتلة البيانات (ملف الجدول)

لتحسين دعم البحث عن البيانات على نطاق واسع، قمنا بتحسين تخزين البيانات في Milvus. يقسم Milvus البيانات في جدول حسب الحجم إلى كتل بيانات متعددة. أثناء البحث المتجه، يبحث Milvus في المتجهات في كل كتلة بيانات ويدمج النتائج. تتكون عملية بحث متجه واحدة من عمليات بحث متجهية مستقلة N (N هو عدد كتل البيانات) وعمليات دمج النتائج N-1.

قائمة انتظار المهام (جدول المهام)

يحتوي كل مورد على مصفوفة مهام، والتي تسجل المهام التي تنتمي إلى المورد. لكل مهمة حالات مختلفة، بما في ذلك البدء والتحميل والتحميل والتحميل والتنفيذ والتنفيذ. يشترك المحمل والمنفذ في جهاز الحوسبة في نفس قائمة انتظار المهام.

جدولة الاستعلام

2-query-scheduling.png 2-جدولة الاستعلام.png

  1. عند بدء تشغيل خادم Milvus، يقوم Milvus بتشغيل GpuResource المقابل عبر المعلمات gpu_resource_config في ملف التكوين server_config.yaml. لا يزال يتعذر تحرير DiskResource و CpuResource في server_config.yaml. GpuResource هو مزيج من search_resources و build_index_resources ويشار إليه باسم {gpu0, gpu1} في المثال التالي:

3-sample-code.png 3-مثال الرمز.png

3-example.png 3-مثال.png

  1. يتلقى ميلفوس طلبًا. يتم تخزين البيانات الوصفية للجدول في قاعدة بيانات خارجية، وهي SQLite أو MySQl للمضيف الواحد و MySQL للموزع. بعد تلقي طلب البحث، يقوم Milvus بالتحقق من صحة ما إذا كان الجدول موجوداً والبُعد متناسقاً. بعد ذلك، يقوم Milvus بقراءة قائمة TableFile للجدول.

4-milvus-reads-tablefile-list.png 4-ميلفوس-قراءة-قائمة-ملف-جدول-قائمة-ملف-ملف.png

  1. ينشئ ميلفوس مهمة بحث. نظرًا لأن حساب كل TableFile يتم إجراؤه بشكل مستقل، يقوم Milvus بإنشاء مهمة بحث لكل TableFile. كوحدة أساسية لجدولة المهام، يحتوي SearchTask على المتجهات المستهدفة ومعلمات البحث وأسماء ملفات TableFile.

5-table-file-list-task-creator.png 5-جدول-ملف-قائمة-ملف-مهمة-منشئ-ملف-بنج

  1. يختار ميلفوس جهاز حوسبة. يعتمد الجهاز الذي ينفذ فيه SearchTask عملية الحوسبة على وقت الإكمال المقدر لكل جهاز. ويحدد وقت الإكمال المقدر الفاصل الزمني المقدر بين الوقت الحالي والوقت المقدر لاكتمال الحساب.

على سبيل المثال، عندما يتم تحميل كتلة بيانات لمهمة بحث إلى ذاكرة وحدة المعالجة المركزية، تكون مهمة البحث التالية في انتظار قائمة انتظار مهام حساب وحدة المعالجة المركزية وتكون قائمة انتظار مهام حساب وحدة معالجة الرسومات خاملة. يساوي وقت الإكمال المقدر لوحدة المعالجة المركزية مجموع التكلفة الزمنية المقدرة لمهمة البحث السابقة ومهمة البحث الحالية. يساوي وقت الإكمال المقدر لوحدة معالجة الرسومات مجموع الوقت اللازم لتحميل كتل البيانات إلى وحدة معالجة الرسومات والتكلفة الزمنية المقدرة لمهمة البحث الحالية SearchTask. يساوي وقت الإكمال المقدر لمهمة بحث في مورد ما متوسط وقت التنفيذ لجميع مهام البحث في المورد. يختار Milvus بعد ذلك جهازًا بأقل وقت إكمال تقديري ويخصص مهمة البحث إلى الجهاز.

نفترض هنا أن وقت الإكمال المقدر لوحدة معالجة الرسومات1 أقصر.

6-GPU1-shorter-estimated-completion-time.png 6-وحدة معالجة الرسوميات1-وقت الإكمال المقدر-الأقصر.png

  1. يضيف Milvus مهمة البحث SearchTask إلى قائمة انتظار المهام في DiskResource.

  2. ينقل Milvus مهمة البحث إلى قائمة انتظار المهام في CpuResource. يقوم مؤشر ترابط التحميل في CpuResource بتحميل كل مهمة من قائمة انتظار المهام بالتتابع. يقوم CpuResource بقراءة كتل البيانات المقابلة إلى ذاكرة وحدة المعالجة المركزية.

  3. ينقل Milvus SearchTask إلى GpuResource. يقوم مؤشر ترابط التحميل في GpuResource بنسخ البيانات من ذاكرة وحدة المعالجة المركزية إلى ذاكرة وحدة معالجة الرسومات. يقوم GpuResource بقراءة كتل البيانات المقابلة إلى ذاكرة وحدة معالجة الرسومات.

  4. يقوم Milvus بتنفيذ SearchTask في GpuResource. نظرًا لأن نتيجة SearchTask صغيرة نسبيًا، يتم إرجاع النتيجة مباشرةً إلى ذاكرة وحدة المعالجة المركزية.

7-scheduler.png 7-Scheduler.png

  1. يدمج Milvus نتيجة SearchTask في نتيجة البحث بأكملها.

8-milvus-merges-searchtast-result.png 8-ملفوس-يدمج-يدمج-نتيجة-مهمة-بحث-نتيجة-بحث.png

بعد اكتمال جميع مهام البحث، يقوم ميلفوس بإرجاع نتيجة البحث كاملة إلى العميل.

بناء الفهرس

بناء الفهرس هو في الأساس نفس عملية البحث بدون عملية الدمج. لن نتحدث عن هذا بالتفصيل.

تحسين الأداء

التخزين المؤقت

كما ذكرنا من قبل، يجب تحميل كتل البيانات إلى أجهزة التخزين المقابلة مثل ذاكرة وحدة المعالجة المركزية أو ذاكرة وحدة معالجة الرسومات قبل إجراء الحساب. لتجنب التحميل المتكرر للبيانات، يقدم Milvus ذاكرة التخزين المؤقت LRU (الأقل استخدامًا مؤخرًا). عندما تمتلئ ذاكرة التخزين المؤقت، تقوم كتل البيانات الجديدة بإبعاد كتل البيانات القديمة. يمكنك تخصيص حجم ذاكرة التخزين المؤقت بواسطة ملف التكوين بناءً على حجم الذاكرة الحالي. يوصى باستخدام ذاكرة تخزين مؤقت كبيرة لتخزين بيانات البحث لتوفير وقت تحميل البيانات بفعالية وتحسين أداء البحث.

تداخل تحميل البيانات والحساب

لا يمكن لذاكرة التخزين المؤقت تلبية احتياجاتنا لتحسين أداء البحث. يجب إعادة تحميل البيانات عندما تكون الذاكرة غير كافية أو عندما يكون حجم مجموعة البيانات كبيرًا جدًا. نحتاج إلى تقليل تأثير تحميل البيانات على أداء البحث. ينتمي تحميل البيانات، سواءً كان من القرص إلى ذاكرة وحدة المعالجة المركزية أو من ذاكرة وحدة المعالجة المركزية إلى ذاكرة وحدة معالجة الرسومات، إلى عمليات الإدخال والإخراج وبالكاد يحتاج إلى أي عمل حسابي من المعالجات. لذا، نأخذ بعين الاعتبار إجراء تحميل البيانات والحساب بالتوازي من أجل استخدام أفضل للموارد.

نقوم بتقسيم الحوسبة على كتلة بيانات إلى 3 مراحل (التحميل من القرص إلى ذاكرة وحدة المعالجة المركزية، وحساب وحدة المعالجة المركزية، ودمج النتائج) أو 4 مراحل (التحميل من القرص إلى ذاكرة وحدة المعالجة المركزية، والتحميل من ذاكرة وحدة المعالجة المركزية إلى ذاكرة وحدة معالجة الرسومات، وحساب وحدة معالجة الرسومات، واسترجاع النتائج، ودمج النتائج). لنأخذ الحوسبة على 3 مراحل كمثال، يمكننا إطلاق 3 خيوط مسؤولة عن المراحل الثلاث لتعمل على شكل أنابيب تعليمات. نظرًا لأن مجموعات النتائج صغيرة في الغالب، فإن دمج النتائج لا يستغرق الكثير من الوقت. في بعض الحالات، يمكن أن يؤدي تداخل تحميل البيانات والحساب إلى تقليل وقت البحث بمقدار 1/2.

9-sequential-overlapping-load-milvus.png 9-التحميل المتسلسل-التداخل-التحميل-ملفوس.png

المشاكل والحلول

سرعات نقل مختلفة

في السابق، كان Milvus يستخدم استراتيجية Round Robin لجدولة المهام متعددة وحدات معالجة الرسومات. عملت هذه الاستراتيجية بشكل مثالي في خادمنا المكون من 4 وحدات معالجة GPU وكان أداء البحث أفضل 4 مرات. ومع ذلك، لم يكن الأداء أفضل بمرتين بالنسبة لمضيفي وحدة معالجة الجاذبية الثنائية لدينا. لقد أجرينا بعض التجارب واكتشفنا أن سرعة نسخ البيانات لوحدة معالجة الرسومات كانت 11 جيجابايت/ثانية. ومع ذلك، بالنسبة لوحدة معالجة رسومات أخرى، كانت 3 جيجابايت/ثانية. بعد الرجوع إلى وثائق اللوحة الرئيسية، تأكدنا من أن اللوحة الرئيسية كانت متصلة بوحدة معالجة رسومات واحدة عبر PCIe x16 ووحدة معالجة رسومات أخرى عبر PCIe x4. وهذا يعني أن وحدات معالجة الرسومات هذه لها سرعات نسخ مختلفة. في وقت لاحق، أضفنا وقت النسخ لقياس الجهاز الأمثل لكل مهمة بحث.

العمل المستقبلي

بيئة الأجهزة مع زيادة التعقيد

في الظروف الحقيقية، قد تكون بيئة الأجهزة أكثر تعقيدًا. بالنسبة لبيئات الأجهزة التي تحتوي على وحدات معالجة مركزية متعددة، وذاكرة ذات بنية NUMA، و NVLink، و NVSwitch، فإن الاتصال عبر وحدات المعالجة المركزية/وحدات معالجة الرسومات يجلب الكثير من الفرص للتحسين.

تحسين الاستعلام

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

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