تخزين البيانات الممكّنة لخريطة الذاكرة
في Milvus، تسمح الملفات المعينة بالذاكرة بتعيين محتويات الملف مباشرة في الذاكرة. تعمل هذه الميزة على تحسين كفاءة الذاكرة، خاصةً في الحالات التي تكون فيها الذاكرة المتوفرة نادرة ولكن تحميل البيانات بالكامل غير ممكن. يمكن لآلية التحسين هذه أن تزيد من سعة البيانات مع ضمان الأداء حتى حد معين؛ ومع ذلك، عندما تتجاوز كمية البيانات الذاكرة بمقدار كبير، قد يعاني أداء البحث والاستعلام من تدهور خطير، لذا يرجى اختيار تشغيل هذه الميزة أو إيقاف تشغيلها حسب الاقتضاء.
تكوين تعيين الذاكرة
بدءًا من Milvus 2.4، لديك المرونة لضبط ملف التكوين الثابت لتكوين إعدادات تعيين الذاكرة الافتراضية للمجموعة بأكملها قبل النشر. بالإضافة إلى ذلك، هناك خيار يمكنك من تغيير المعلمات ديناميكيًا لضبط إعدادات تعيين الذاكرة على مستوى المجموعة والفهرس. بالنظر إلى المستقبل، ستعمل التحديثات المستقبلية على توسيع إمكانيات تعيين الذاكرة لتشمل التكوينات على مستوى الحقل.
قبل نشر المجموعة: التكوين العام
قبل نشر المجموعة، تطبق الإعدادات على مستوى المجموعة تعيين الذاكرة عبر المجموعة بأكملها. يضمن ذلك التزام جميع الكائنات الجديدة تلقائيًا بهذه التكوينات. من المهم ملاحظة أن تعديل هذه الإعدادات يتطلب إعادة تشغيل المجموعة لتصبح فعالة.
لضبط إعدادات تعيين ذاكرة مجموعتك، قم بتحرير الملف configs/milvus.yaml
. ضمن هذا الملف، يمكنك تحديد ما إذا كنت تريد تمكين تعيين الذاكرة بشكل افتراضي وتحديد مسار الدليل لتخزين الملفات المعينة بالذاكرة. إذا تم ترك المسار (mmapDirPath
) غير محدد، فسيقوم النظام افتراضيًا بتخزين الملفات المعينة للذاكرة في {localStorage.path}/mmap
. لمزيد من المعلومات، راجع التكوينات المتعلقة بالتخزين المحلي.
# This parameter was set in configs/milvus.yaml
...
queryNode:
mmap:
# Set memory mapping property for whole cluster
mmapEnabled: false | true
# Set memory-mapped directory path, if you leave mmapDirPath unspecified, the memory-mapped files will be stored in {localStorage.path}/ mmap by default.
mmapDirPath: any/valid/path
....
بعد 2.4.10
، ينقسم التكوين queryNode.mmap.mmapEnabled
إلى أربعة حقول منفصلة أدناه، وجميع الإعدادات الافتراضية هي false
:
queryNode.mmap.vectorField
، يتحكم فيما إذا كانت بيانات المتجه هي mmap;queryNode.mmap.vectorIndex
، يتحكم فيما إذا كان فهرس المتجه هو mmap;queryNode.mmap.scalarField
، يتحكم فيما إذا كانت البيانات القياسية هي mmap;queryNode.mmap.scalarIndex
، يتحكم فيما إذا كان الفهرس القياسي هو mmap;
# This parameter was set in configs/milvus.yaml
...
queryNode:
mmap:
vectorField: false # Enable mmap for loading vector data
vectorIndex: false # Enable mmap for loading vector index
scalarField: false # Enable mmap for loading scalar data
scalarIndex: false # Enable mmap for loading scalar index
....
بالإضافة إلى ذلك، يمكن فقط تشغيل وإيقاف تشغيل فهرس المتجه وبيانات المتجه mmap لمجموعة على حدة، ولكن ليس للآخرين.
التوافق: إذا تم تعيين التكوين الأصلي queryNode.mmap.mmapEnabled
إلى true
، فسيتم تعيين التكوين المضاف حديثًا إلى true
في هذا الوقت. إذا تم تعيين queryNode.mmap.mmapEnabled
على false
، إذا تم تعيين التكوين الجديد على true
، فستكون القيمة النهائية true
.
أثناء تشغيل الكتلة: التكوين الديناميكي
أثناء وقت تشغيل المجموعة، يمكنك ضبط إعدادات تعيين الذاكرة ديناميكيًا على مستوى المجموعة أو الفهرس.
على مستوى المجموعة، يتم تطبيق تعيين الذاكرة على جميع البيانات الأولية غير المفهرسة داخل المجموعة، باستثناء المفاتيح الأساسية والطوابع الزمنية ومعرفات الصفوف. هذا النهج مناسب بشكل خاص للإدارة الشاملة لمجموعات البيانات الكبيرة.
لإجراء تعديلات ديناميكية على إعدادات تعيين الذاكرة داخل مجموعة، استخدم الأسلوب set_properties()
. هنا، يمكنك التبديل mmap.enabled
بين True
أو False
حسب الحاجة.
# Get existing collection
collection = Collection("test_collection") # Replace with your collection name
# Set memory mapping property to True or Flase
collection.set_properties({'mmap.enabled': True})
بعد 2.4.10
، إعدادات تعيين الذاكرة داخل مجموعة، استخدم الأسلوب add_field
. هنا، يمكنك التبديل mmap_enabled
بين True
أو False
حسب الحاجة.
schema = MilvusClient.create_schema()
schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=768, mmap_enabled=True)
بالنسبة للإعدادات على مستوى الفهرس، يمكن تطبيق تعيين الذاكرة بشكل خاص على فهارس المتجهات دون التأثير على أنواع البيانات الأخرى. هذه الميزة لا تقدر بثمن بالنسبة للمجموعات التي تتطلب أداءً محسنًا لعمليات البحث عن المتجهات.
لتمكين أو تعطيل تعيين الذاكرة لفهرس داخل مجموعة، قم باستدعاء الأسلوب alter_index()
، مع تحديد اسم الفهرس الهدف في index_name
وتعيين mmap.enabled
إلى True
أو False
.
collection.alter_index(
index_name="vector_index", # Replace with your vector index name
extra_params={"mmap.enabled": True} # Enable memory mapping for index
)
تخصيص مسار التخزين في عمليات النشر المختلفة
يتم تعيين الملفات المعينة بالذاكرة افتراضيًا إلى الدليل /mmap
داخل localStorage.path
. إليك كيفية تخصيص هذا الإعداد عبر طرق النشر المختلفة:
- بالنسبة لـ Milvus المثبت باستخدام مخطط Helm:
# new-values.yaml
extraConfigFiles:
user.yaml: |+
queryNode:
mmap:
mmapEnabled: true
mmapDirPath: any/valid/path
helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
- بالنسبة ل Milvus المثبتة باستخدام مشغل Milvus:
# patch.yaml
spec:
config:
queryNode:
mmap:
mmapEnabled: true
mmapDirPath: any/valid/path
kubectl patch milvus <milvus-name> --patch-file patch.yaml
- بالنسبة لـ Milvus المثبت باستخدام Docker:
# A new installation script is provided to enable mmap-related settings.
الحدود
لا يمكن تمكين تعيين الذاكرة لمجموعة محملة، تأكد من تحرير المجموعة قبل تمكين تعيين الذاكرة.
تعيين الذاكرة غير مدعوم لفهارس DiskANN أو فئة GPU.
الأسئلة الشائعة
في أي السيناريوهات يوصى بتمكين تعيين الذاكرة؟ ما هي المفاضلات بعد تمكين هذه الميزة؟
يوصى بتعيين الذاكرة عندما تكون الذاكرة محدودة أو عندما تكون متطلبات الأداء معتدلة. يؤدي تمكين هذه الميزة إلى زيادة سعة تحميل البيانات. على سبيل المثال، في حالة تكوين وحدتي معالجة مركزية وذاكرة بسعة 8 جيجابايت، يمكن أن يسمح تمكين تعيين الذاكرة بتحميل بيانات أكثر بما يصل إلى 4 أضعاف مقارنةً بعدم تمكينها. يختلف التأثير على الأداء:
مع وجود ذاكرة كافية، يكون الأداء المتوقع مشابهًا لأداء استخدام الذاكرة فقط.
في حالة عدم كفاية الذاكرة، قد يتدهور الأداء المتوقع.
ما هي العلاقة بين تكوينات مستوى المجموعة ومستوى الفهرس؟
مستوى التجميع ومستوى الفهرس ليست علاقات شاملة، يتحكم مستوى التجميع فيما إذا كانت البيانات الأصلية ممكّنة على مستوى الذاكرة أم لا، بينما مستوى الفهرس مخصص للفهارس المتجهة فقط.
هل هناك أي نوع فهرس موصى به لتعيين الذاكرة؟
نعم، يوصى باستخدام HNSW لتمكين mmap. لقد اختبرنا فهارس سلاسل HNSW و IVF_FLAT و IVF_PQ/SQ من قبل، وانخفض أداء فهارس سلسلة IVF بشكل خطير، بينما لا يزال انخفاض الأداء عند تشغيل mmap لفهارس HNSW ضمن التوقعات.
ما نوع التخزين المحلي المطلوب لتعيين الذاكرة؟
يعمل القرص عالي الجودة على تحسين الأداء، مع كون محركات أقراص NVMe الخيار المفضل.
هل يمكن تعيين الذاكرة للبيانات القياسية؟
يمكن تطبيق تعيين الذاكرة على البيانات القياسية، ولكن لا يمكن تطبيقه على الفهارس المبنية على الحقول القياسية.
كيف يتم تحديد الأولوية لتكوينات تعيين الذاكرة عبر مستويات مختلفة؟
في Milvus، عندما يتم تحديد تكوينات تعيين الذاكرة بشكل صريح عبر مستويات متعددة، تشترك التكوينات على مستوى الفهرس ومستوى المجموعة في الأولوية العليا، ثم تليها التكوينات على مستوى المجموعة.
إذا قمتُ بالترقية من Milvus 2.3 وقمتُ بتكوين مسار دليل تعيين الذاكرة، ماذا سيحدث؟
إذا قمت بالترقية من Milvus 2.3 وقمت بتكوين مسار دليل تعيين الذاكرة (
mmapDirPath
)، فسيتم الاحتفاظ بالتكوين الخاص بك، وسيكون الإعداد الافتراضي لتعيين الذاكرة الممكّن (mmapEnabled
)true
. من المهم ترحيل البيانات الوصفية لمزامنة تكوين ملفاتك الحالية المعينة للذاكرة. لمزيد من التفاصيل، راجع ترحيل البيانات الوصفية.