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

milvus-logo
LFAI

الخاتمة

  • Engineering
August 22, 2020
milvus

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

في كيفية تحقيق Milvus للتحديث الديناميكي للبيانات والاستعلام، قدمنا العملية بأكملها من إدراج البيانات إلى مسح البيانات. دعونا نلخص بعض الأساسيات. يدير MemManager جميع المخازن المؤقتة للإدراج، مع كل MemTable يتوافق مع مجموعة (قمنا بإعادة تسمية "جدول" إلى "مجموعة" في الإصدار 0.7.0 من Milvus). يقسم Milvus تلقائيًا البيانات المدرجة في الذاكرة إلى عدة ملفات MemTableFiles. عند مسح البيانات إلى القرص، يتم تسلسل كل ملف MemTableFile إلى ملف خام. احتفظنا بهذه البنية عند تصميم دالة الحذف.

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

1-delete-request-milvus.jpg 1-حذف-طلب-حذف-ملفوس.jpg

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

عندما يتعلق الأمر بالتنفيذ، لدينا العديد من المشكلات التي يجب مراعاتها. في Milvus، تكون البيانات مرئية أو، بعبارة أخرى، قابلة للاسترداد، فقط عندما يتم مسحها إلى القرص. لذلك، لا يتم حذف البيانات التي تم مسحها أثناء استدعاء أسلوب الحذف، ولكن في عملية المسح التالية. والسبب في ذلك هو أن ملفات البيانات التي تم مسحها إلى القرص لن تتضمن بيانات جديدة بعد ذلك، وبالتالي لا يؤثر الحذف الناعم على البيانات التي تم مسحها. عند استدعاء الحذف، يمكنك حذف البيانات التي لا تزال في المخزن المؤقت المدرج مباشرة، بينما بالنسبة للبيانات التي تم مسحها، تحتاج إلى تسجيل معرف البيانات المحذوفة في الذاكرة. عند مسح البيانات إلى القرص، يكتب Milvus المعرف المحذوف إلى ملف DEL لتسجيل الكيان الذي تم حذفه في المقطع المقابل. لن تظهر هذه التحديثات إلا بعد اكتمال مسح البيانات. هذه العملية موضحة في الشكل 2. قبل الإصدار 0.7.0، لم يكن لدينا سوى آلية التنظيف التلقائي؛ أي أن ميلفوس يقوم بتسلسل البيانات في المخزن المؤقت للإدراج كل ثانية. في تصميمنا الجديد، أضفنا طريقة تدفق تسمح للمطوّرين باستدعائها بعد طريقة الحذف، مما يضمن أن البيانات المدرجة حديثًا مرئية وأن البيانات المحذوفة لم تعد قابلة للاسترداد.

2-delete-request-milvus.jpg 2-حذف-طلب-حذف-ملفوس.jpg

المشكلة الثانية هي أن ملف البيانات الخام وملف الفهرس هما ملفان منفصلان في ملف Milvus، وسجلان مستقلان في البيانات الوصفية. عند حذف معرّف محدد، نحتاج إلى العثور على الملف الخام وملف الفهرس المطابق للمعرّف وتسجيلهما معًا. وفقًا لذلك، قدمنا مفهوم المقطع. يحتوي المقطع على الملف الخام (الذي يتضمن ملفات المتجه الخام وملفات المعرف) وملف الفهرس وملف DEL. المقطع هو الوحدة الأساسية لقراءة المتجهات وكتابتها والبحث فيها في ملف ميلفوس. تتكون المجموعة (الشكل 3) من عدة مقاطع. وبالتالي، هناك العديد من مجلدات المقاطع تحت مجلد المجموعة في القرص. نظرًا لأن البيانات الوصفية الخاصة بنا تعتمد على قواعد البيانات العلائقية (SQLite أو MySQL)، فمن السهل جدًا تسجيل العلاقة داخل المقاطع، ولم تعد عملية الحذف تتطلب معالجة منفصلة للملف الخام وملف الفهرس.

3-delete-request-milvus.jpg 3-حذف-مطلب-حذف-ملف-ملفوس.jpg

المشكلة الثالثة هي كيفية تصفية البيانات المحذوفة أثناء البحث. من الناحية العملية، المعرف المسجل بواسطة DEL هو إزاحة البيانات المقابلة المخزنة في المقطع. نظرًا لأن المقطع المحذوف لا يتضمن بيانات جديدة، فلن يتغير الإزاحة. بنية بيانات DEL عبارة عن خريطة نقطية في الذاكرة، حيث يمثل البت النشط إزاحة محذوفة. وقمنا أيضًا بتحديث FAISS وفقًا لذلك: عند البحث في FAISS، لن يتم تضمين المتجه المقابل للبت النشط في حساب المسافة (الشكل 4). لن يتم تناول التغييرات على FAISS بالتفصيل هنا.

4-delete-request-milvus.jpg 4-حذف-طلب-ميلفوس.jpg

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

5-delete-request-milvus.jpg 5-حذف-طلب-مطلب-ملفوس.jpg

الخاتمة

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

لقد قدمنا الآن فلسفة التصميم وراء وظيفة الحذف وتنفيذها. هناك بالتأكيد مجال للتحسين، ونرحب بأي من تعليقاتكم أو اقتراحاتكم.

تعرف على ميلفوس: https://github.com/milvus-io/milvus. يمكنك أيضًا الانضمام إلى مجتمعنا Slack للمناقشات التقنية!

    Try Managed Milvus for Free

    Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

    Get Started

    Like the article? Spread the word

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