ضغط التجميع
تم تصميم ضغط التجميع لتحسين أداء البحث وتقليل التكاليف في المجموعات الكبيرة. سيساعدك هذا الدليل على فهم ضغط التجميع وكيف يمكن لهذه الميزة تحسين أداء البحث.
نظرة عامة
يقوم Milvus بتخزين الكيانات الواردة في مقاطع داخل مجموعة ويغلق المقطع عندما يمتلئ. إذا حدث ذلك، يتم إنشاء مقطع جديد لاستيعاب كيانات إضافية. ونتيجة لذلك، يتم توزيع الكيانات بشكل اعتباطي عبر المقاطع. يتطلب هذا التوزيع من Milvus البحث في مقاطع متعددة للعثور على أقرب الجيران إلى متجه استعلام معين.
بدون ضغط التجميع
إذا كان بإمكان Milvus توزيع الكيانات بين المقاطع بناءً على القيم الموجودة في حقل معين، يمكن تقييد نطاق البحث داخل مقطع واحد، وبالتالي تحسين أداء البحث.
إنضغط التجميع هو ميزة في Milvus تقوم بإعادة توزيع الكيانات بين المقاطع في مجموعة استنادًا إلى القيم الموجودة في حقل قياسي. لتمكين هذه الميزة، تحتاج أولاً إلى تحديد حقل قياسي كمفتاح تجميع. يسمح ذلك ل Milvus بإعادة توزيع الكيانات في مقطع عندما تقع قيم مفتاح التجميع الخاصة بها ضمن نطاق محدد. عندما تقوم بتشغيل ضغط التجميع، يقوم Milvus بإنشاء/تحديث فهرس عام يسمى PartitionStats، والذي يسجل علاقة التعيين بين المقاطع وقيم مفاتيح التجميع.
مع ضغط التجميع
باستخدام PartitionStats كمرجع، يمكن لـ Milvus تشذيب البيانات غير ذات الصلة عند تلقي طلب بحث/استعلام يحمل قيمة مفتاح تجميع وتقييد نطاق البحث داخل المقاطع التي تم تعيينها إلى القيمة، وبالتالي تحسين أداء البحث. للحصول على تفاصيل حول تحسين الأداء، راجع الاختبارات المعيارية.
استخدام ضغط التجميع
ميزة ضغط التجميع في Milvus قابلة للتكوين بدرجة كبيرة. يمكنك اختيار تشغيله يدويًا أو تعيينه ليتم تشغيله تلقائيًا على فترات بواسطة Milvus. لتمكين ضغط التجميع، قم بما يلي:
التكوين العام
تحتاج إلى تعديل ملف تكوين Milvus كما هو موضح أدناه.
dataCoord:
compaction:
clustering:
enable: true
autoEnable: false
triggerInterval: 600
minInterval: 3600
maxInterval: 259200
newDataSizeThreshold: 512m
timeout: 7200
queryNode:
enableSegmentPrune: true
datanode:
clusteringCompaction:
memoryBufferRatio: 0.1
workPoolSize: 8
common:
usePartitionKeyAsClusteringKey: true
dataCoord.compaction.clusteringعنصر التكوين الوصف القيمة الافتراضية enableتحديد ما إذا كان سيتم تمكين ضغط التجميع أم لا.
تعيين هذا إلىtrueإذا كنت بحاجة إلى تمكين هذه الميزة لكل مجموعة لها مفتاح تجميع.falseautoEnableتحديد ما إذا كنت تريد تمكين الضغط الذي يتم تشغيله تلقائياً.
يشير تعيين هذا إلىtrueإلى أن Milvus يقوم بضغط المجموعات التي تحتوي على مفتاح تجميع في الفواصل الزمنية المحددة.falsetriggerIntervalيحدد الفاصل الزمني بالمللي ثانية الذي يبدأ عنده Milvus ضغط التجميع.
هذه المعلمة صالحة فقط عندما يتم تعيينautoEnableإلىtrue.- minIntervalيحدد الحد الأدنى للفاصل الزمني بالثواني.
هذه المعلمة صالحة فقط عندما يتم تعيينautoEnableإلىtrue.
يساعد تعيين هذه المعلمة على عدد صحيح أكبر من المشغّلInterval على تجنب عمليات التجميع المتكررة خلال فترة قصيرة.- maxIntervalيحدد الحد الأقصى للفاصل الزمني بالثواني.
هذه المعلمة صالحة فقط عندما يتم تعيينautoEnableإلىtrue.
بمجرد أن يكتشف Milvus أن المجموعة لم يتم تجميعها لمدة أطول من هذه القيمة، فإنه يفرض تجميعًا مضغوطًا.- newDataSizeThresholdيحدد العتبة العليا لتشغيل ضغط التجميع.
هذه المعلمة صالحة فقط عندما يتم تعيينautoEnableعلىtrue.
بمجرد أن يكتشف Milvus أن حجم البيانات في مجموعة ما يتجاوز هذه القيمة، فإنه يبدأ عملية ضغط التجميع.- timeoutيحدد مدة المهلة لضغط التجميع.
تفشل عملية ضغط التجميع إذا تجاوز وقت تنفيذها هذه القيمة.- queryNodeعنصر التكوين الوصف القيمة الافتراضية enableSegmentPruneتحديد ما إذا كان Milvus يقوم بتشذيب البيانات بالرجوع إلى PartitionStats عند تلقي طلبات البحث/الاستعلام.
تعيين هذا إلىtrueيُمكّن Milvus من تشذيب البيانات غير ذات الصلة من المقاطع أثناء طلب البحث/الاستعلام.falsedataNode.clusteringCompactionعنصر التكوين الوصف القيمة الافتراضية memoryBufferRatioتحديد نسبة المخزن المؤقت للذاكرة لمهام ضغط المجموعات.
يقوم Milvus بمسح البيانات عندما يتجاوز حجم البيانات حجم المخزن المؤقت المخصص المحسوب باستخدام هذه النسبة.- workPoolSizeتحديد حجم تجمع العاملين لمهمة ضغط التجميع. - commonعنصر التكوين الوصف القيمة الافتراضية usePartitionKeyAsClusteringKeyتحديد ما إذا كان سيتم استخدام مفتاح القسم في المجموعات كمفتاح تجميع.
يشير تعيين هذا إلىtrueإلى استخدام مفتاح التقسيم كمفتاح تجميع.
يمكنك دائماً تجاوز هذا الإعداد في مجموعة من خلال تعيين مفتاح التجميع بشكل صريح.false
لتطبيق التغييرات المذكورة أعلاه على مجموعة Milvus الخاصة بك، يُرجى اتباع الخطوات الواردة في تكوين Milvus مع Helm وتكوين Milvus مع مشغلي Milvus.
تكوين التجميع
لضغط التجميع في مجموعة محددة، يجب عليك تحديد حقل قياسي من المجموعة كمفتاح التجميع.
default_fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
FieldSchema(name="key", dtype=DataType.INT64, is_clustering_key=True),
FieldSchema(name="var", dtype=DataType.VARCHAR, max_length=1000, is_primary=False),
FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=dim)
]
default_schema = CollectionSchema(
fields=default_fields,
description="test clustering-key collection"
)
coll1 = Collection(name="clustering_test", schema=default_schema)
يمكنك استخدام الحقول القياسية لأنواع البيانات التالية كمفتاح التجميع: Int8 و Int16 و و Int32 و Int64 و Float و Double و VarChar.
تشغيل ضغط التجميع التجميعي
إذا قمت بتمكين الضغط التجميعي التلقائي للتجميع، يقوم برنامج Milvus تلقائيًا بتشغيل الضغط في الفاصل الزمني المحدد. بدلاً من ذلك، يمكنك تشغيل الضغط يدويًا على النحو التالي:
coll1.compact(is_clustering=True)
coll1.get_compaction_state(is_clustering=True)
coll1.wait_for_compaction_completed(is_clustering=True)
اختبار معياري
يحدد حجم البيانات وأنماط الاستعلام مجتمعةً تحسين الأداء الذي يمكن أن يحققه ضغط التجميع. يُظهر اختبار معياري داخلي أن ضغط التجميع يؤدي إلى تحسين يصل إلى 25 ضعفًا في الاستعلامات في الثانية (QPS).
يتم إجراء الاختبار المعياري على مجموعة تحتوي على كيانات من مجموعة بيانات LAION ذات 20 مليونًا و768 بُعدًا مع تعيين الحقل الرئيسي كمفتاح تجميع. بعد تشغيل ضغط التجميع في المجموعة، يتم إرسال عمليات البحث المتزامنة حتى يصل استخدام وحدة المعالجة المركزية إلى مستوى عالٍ من وحدة المعالجة المركزية.
| مرشح البحث | نسبة التقليم | الكمون (مللي ثانية) | QPS (طلبات/ثانية) | ||||
|---|---|---|---|---|---|---|---|
| متوسط | الحد الأدنى | الحد الأقصى | المتوسط | TP99 | |||
| لا يوجد | 0% | 1685 | 672 | 2294 | 1710 | 2291 | 17.75 |
| مفتاح > 200 ومفتاح < 800 | 40.2% | 1045 | 47 | 1828 | 1085 | 1617 | 28.38 |
| مفتاح > 200 ومفتاح < 600 | 59.8% | 829 | 45 | 1483 | 882 | 1303 | 35.78 |
| مفتاح > 200 ومفتاح < 400 | 79.5% | 550 | 100 | 985 | 584 | 898 | 54.00 |
| المفتاح = = 1000 | 99% | 68 | 24 | 1273 | 70 | 246 | 431.41 |
كلما ضاق نطاق البحث في مرشحات البحث، تزداد نسبة التقليم. هذا يعني أنه يتم تخطي المزيد من الكيانات أثناء عملية البحث. عند مقارنة الإحصائيات في الصفين الأول والأخير، يمكنك أن ترى أن عمليات البحث بدون ضغط التجميع تتطلب مسح المجموعة بأكملها. من ناحية أخرى، يمكن أن تحقق عمليات البحث باستخدام ضغط التجميع باستخدام مفتاح معين تحسينًا يصل إلى 25 ضعفًا.
أفضل الممارسات
إليك بعض النصائح لاستخدام ضغط التجميع بكفاءة:
قم بتمكين ذلك للمجموعات ذات أحجام البيانات الكبيرة. يتحسن أداء البحث مع وجود أحجام بيانات أكبر في المجموعة. من الجيد تمكين هذه الميزة للمجموعات التي تحتوي على أكثر من مليون كيان.
اختيار مفتاح تجميع مناسب. يمكنك استخدام الحقول القياسية المستخدمة عادةً كشروط تصفية كمفتاح تجميع. بالنسبة للمجموعات التي تحتوي على بيانات من مستأجرين متعددين، يمكنك استخدام الحقل الذي يميز مستأجر عن آخر كمفتاح تجميع.
استخدم مفتاح التقسيم كمفتاح التجميع. يمكنك تعيين
common.usePartitionKeyAsClusteringKeyإلى صواب إذا كنت تريد تمكين هذه الميزة لجميع المجموعات في مثيل Milvus الخاص بك أو إذا كنت لا تزال تواجه مشكلات في الأداء في مجموعة كبيرة بمفتاح التقسيم. من خلال القيام بذلك، سيكون لديك مفتاح تجميع ومفتاح تقسيم عندما تختار حقلاً قياسيًا في مجموعة كمفتاح تقسيم.لاحظ أن هذا الإعداد لا يمنعك من اختيار حقل قياسي آخر كمفتاح تجميع. تكون الأولوية دائمًا لمفتاح التجميع المعين صراحةً.