ضغط التجميع
تم تصميم ضغط التجميع لتحسين أداء البحث وتقليل التكاليف في المجموعات الكبيرة. سيساعدك هذا الدليل على فهم ضغط التجميع وكيف يمكن لهذه الميزة تحسين أداء البحث.
نظرة عامة
يقوم 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
إذا كنت بحاجة إلى تمكين هذه الميزة لكل مجموعة لها مفتاح تجميع.false
autoEnable
تحديد ما إذا كنت تريد تمكين الضغط الذي يتم تشغيله تلقائياً.
يشير تعيين هذا إلىtrue
إلى أن Milvus يقوم بضغط المجموعات التي تحتوي على مفتاح تجميع في الفواصل الزمنية المحددة.false
triggerInterval
يحدد الفاصل الزمني بالمللي ثانية الذي يبدأ عنده Milvus ضغط التجميع.
هذه المعلمة صالحة فقط عندما يتم تعيينautoEnable
إلىtrue
.- minInterval
يحدد الحد الأدنى للفاصل الزمني بالثواني.
هذه المعلمة صالحة فقط عندما يتم تعيينautoEnable
إلىtrue
.
يساعد تعيين هذه المعلمة على عدد صحيح أكبر من المشغّلInterval على تجنب عمليات التجميع المتكررة خلال فترة قصيرة.- maxInterval
يحدد الحد الأقصى للفاصل الزمني بالثواني.
هذه المعلمة صالحة فقط عندما يتم تعيينautoEnable
إلىtrue
.
بمجرد أن يكتشف Milvus أن المجموعة لم يتم تجميعها لمدة أطول من هذه القيمة، فإنه يفرض تجميعًا مضغوطًا.- newDataSizeThreshold
يحدد العتبة العليا لتشغيل ضغط التجميع.
هذه المعلمة صالحة فقط عندما يتم تعيينautoEnable
علىtrue
.
بمجرد أن يكتشف Milvus أن حجم البيانات في مجموعة ما يتجاوز هذه القيمة، فإنه يبدأ عملية ضغط التجميع.- timeout
يحدد مدة المهلة لضغط التجميع.
تفشل عملية ضغط التجميع إذا تجاوز وقت تنفيذها هذه القيمة.- queryNode
عنصر التكوين الوصف القيمة الافتراضية enableSegmentPrune
تحديد ما إذا كان Milvus يقوم بتشذيب البيانات بالرجوع إلى PartitionStats عند تلقي طلبات البحث/الاستعلام.
تعيين هذا إلىtrue
يُمكّن Milvus من تشذيب البيانات غير ذات الصلة من المقاطع أثناء طلب البحث/الاستعلام.false
dataNode.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 الخاص بك أو إذا كنت لا تزال تواجه مشكلات في الأداء في مجموعة كبيرة بمفتاح التقسيم. من خلال القيام بذلك، سيكون لديك مفتاح تجميع ومفتاح تقسيم عندما تختار حقلاً قياسيًا في مجموعة كمفتاح تقسيم.لاحظ أن هذا الإعداد لا يمنعك من اختيار حقل قياسي آخر كمفتاح تجميع. تكون الأولوية دائمًا لمفتاح التجميع المعين صراحةً.