الفهرس باستخدام وحدة معالجة الرسومات
يوضح هذا الدليل الخطوات اللازمة لإنشاء فهرس مع دعم GPU في Milvus، والذي يمكن أن يحسن أداء البحث بشكل كبير في سيناريوهات الإنتاجية العالية والاستدعاء العالي. للحصول على تفاصيل حول أنواع فهارس GPU التي تدعمها Milvus، راجع فهرس GPU.
تكوين إعدادات Milvus للتحكم في ذاكرة GPU
يستخدم Milvus مخزن ذاكرة رسومات عام لتخصيص ذاكرة وحدة معالجة الرسومات.
وهو يدعم معلمتين initMemSize
و maxMemSize
في ملف تكوين Milvus. يتم تعيين حجم التجمع في البداية على initMemSize
، وسيتم توسيعه تلقائيًا إلى maxMemSize
بعد تجاوز هذا الحد.
ويكون الافتراضي initMemSize
هو 1/2 من ذاكرة وحدة معالجة الرسومات المتوفرة عند بدء تشغيل Milvus، ويكون الافتراضي maxMemSize
يساوي كل ذاكرة وحدة معالجة الرسومات المتوفرة.
حتى الإصدار Milvus 2.4.1 (بما في ذلك الإصدار 2.4.1)، استخدم Milvus تجمع ذاكرة GPU موحد. بالنسبة للإصدارات السابقة للإصدار 2.4.1( بما في ذلك الإصدار 2.4.1)، كان يوصى بتعيين كلتا القيمتين إلى 0.
gpu:
initMemSize: 0 #set the initial memory pool size.
maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool.
بدءًا من الإصدار Milvus 2.4.1 وما بعده، يتم استخدام مخزن ذاكرة وحدة معالجة الرسومات فقط لبيانات وحدة معالجة الرسومات المؤقتة أثناء عمليات البحث. لذلك، يوصى بتعيينها إلى 2048 و4096.
gpu:
initMemSize: 2048 #set the initial memory pool size.
maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool.
إنشاء فهرس
توضح الأمثلة التالية كيفية إنشاء فهارس GPU بأنواعها المختلفة.
إعداد معلمات الفهرس
عند إعداد معلمات فهرس GPU، قم بتعريف نوع_الفهرس ونوع_المقياس والبارامز:
نوع_الفهرس(سلسلة): نوع الفهرس المستخدم لتسريع البحث المتجه. تتضمن الخيارات الصالحة GPU_CAGRA و GPU_IVF_FLAT و GPU_IVF_FLAT و GPU_IVF_PQ و GPU_BRUTE_FORCE.
نوع_المقياس(سلسلة): نوع المقاييس المستخدمة لقياس تشابه المتجهات. الخيارات الصالحة هي IP و L2.
بارامز(إملاء): معلمات البناء الخاصة بالفهرس. تعتمد الخيارات الصالحة لهذه المعلمة على نوع الفهرس.
فيما يلي أمثلة على التكوينات لأنواع الفهرس المختلفة:
فهرسGPU_CAGRA
index_params = { "metric_type": "L2", "index_type": "GPU_CAGRA", "params": { 'intermediate_graph_degree': 64, 'graph_degree': 32 } }
تتضمن الخيارات الممكنة للمعلمات ما يلي:
intermediate_graph_degree(int): يؤثر على الاستدعاء ووقت الإنشاء من خلال تحديد درجة الرسم البياني قبل التقليم. القيم الموصى بها هي 32 أو 64.
درجة_الرسم البياني(int): تؤثر على أداء البحث والاستدعاء من خلال تحديد درجة الرسم البياني بعد التقليم. عادةً ما تكون نصف درجة_درجة_الرسم البياني المتوسطة. ينتج عن الفرق الأكبر بين هاتين الدرجتين وقت بناء أطول. يجب أن تكون قيمته أصغر من قيمة intermediate_graph_degree.
build_algo(سلسلة): يحدد خوارزمية إنشاء الرسم البياني قبل التقليم. الخيارات الممكنة:
IVF_PQ: تقدم جودة أعلى ولكن وقت بناء أبطأ.
NN_DESCENT: يوفر بناء أسرع مع احتمال استرجاع أقل.
cache_dataset_dataset_on_device(سلسلة، "صواب" | "خطأ"): يقرر ما إذا كان سيتم تخزين مجموعة البيانات الأصلية مؤقتًا في ذاكرة وحدة معالجة الرسومات. يعمل ضبط هذا على "صواب" على تحسين الاستدعاء من خلال تحسين نتائج البحث، بينما يعمل ضبطه على "خطأ" على الحفاظ على ذاكرة وحدة معالجة الرسومات.
فهرسGPU_IVF_FLAT أو GPU_IVF_PQ
index_params = { "metric_type": "L2", "index_type": "GPU_IVF_FLAT", # Or GPU_IVF_PQ "params": { "nlist": 1024 } }
تتطابق خيارات البارامز مع تلك المستخدمة في IVF_FLAT وIVF_PQ.
فهرسGPU_BRUTE_FORCE
index_params = { 'index_type': 'GPU_BRUTE_FORCE', 'metric_type': 'L2', 'params': {} }
لا توجد تكوينات بارامز إضافية مطلوبة.
بناء الفهرس
بعد تكوين معلمات الفهرس في index_params، قم باستدعاء طريقة create_index()
لإنشاء الفهرس.
# Get an existing collection
collection = Collection("YOUR_COLLECTION_NAME")
collection.create_index(
field_name="vector", # Name of the vector field on which an index is built
index_params=index_params
)
بحث
بمجرد إنشاء فهرس GPU، فإن الخطوة التالية هي إعداد معلمات البحث قبل إجراء البحث.
إعداد معلمات البحث
فيما يلي أمثلة على تكوينات لأنواع الفهرس المختلفة:
فهرسGPU_BRUTE_FORCE
search_params = { "metric_type": "L2", "params": {} }
لا توجد تكوينات بارامترات إضافية مطلوبة.
فهرسGPU_CAGRA
search_params = { "metric_type": "L2", "params": { "itopk_size": 128, "search_width": 4, "min_iterations": 0, "max_iterations": 0, "team_size": 0 } }
تتضمن معلمات البحث الرئيسية:
itopk_size: يحدد حجم النتائج الوسيطة المحفوظة أثناء البحث. قد تؤدي القيمة الأكبر إلى تحسين الاستدعاء على حساب أداء البحث. يجب أن تكون مساوية على الأقل للقيمة النهائية لأعلى k(الحد الأعلى) وعادةً ما تكون قوة 2 (على سبيل المثال، 16، 32، 64، 128).
عرض_البحث: يحدد عدد نقاط الدخول إلى الرسم البياني CAGRA أثناء البحث. قد تؤدي زيادة هذه القيمة إلى تحسين الاستدعاء ولكنها قد تؤثر على أداء البحث.
min_iterations / max_iterations: تتحكم هذه المعلمات في عملية تكرار البحث. بشكل افتراضي، يتم تعيينهما على 0، وتحدد CAGRA تلقائيًا عدد التكرارات بناءً على itopk_size وعرض_البحث. يمكن أن يساعد ضبط هذه القيم يدويًا في تحقيق التوازن بين الأداء والدقة.
team_size: يحدد عدد خيوط CUDA المستخدمة لحساب المسافة المترية على وحدة معالجة الرسومات. القيم الشائعة هي قوة 2 حتى 32 (على سبيل المثال 2، 4، 8، 16، 32). لها تأثير طفيف على أداء البحث. القيمة الافتراضية هي 0، حيث يقوم Milvus تلقائيًا بتحديد حجم_الفريق تلقائيًا استنادًا إلى بُعد المتجه.
فهرسGPU_IVF_FLAT أو GPU_IVF_PQ
search_params = { "metric_type": "L2", "params": {"nprobe": 10} }
تتشابه معلمات البحث لهذين النوعين من الفهرسين مع تلك المستخدمة في IVF_FLAT و IVF_PQ. لمزيد من المعلومات، راجع إجراء بحث تشابه المتجهات.
إجراء بحث
استخدم طريقة search()
لإجراء بحث تشابه متجه على فهرس GPU.
# Load data into memory
collection.load()
collection.search(
data=[[query_vector]], # Your query vector
anns_field="vector", # Name of the vector field
param=search_params,
limit=100 # Number of the results to return
)
الحدود
عند استخدام فهارس GPU، كن على دراية ببعض القيود:
بالنسبة إلى GPU_IVF_FLAT، الحد الأقصى لقيمة الحد هو 1024.
بالنسبة لفهرسي GPU_IVF_PQ و GPU_CAGRA، القيمة القصوى للحد هي 1024.
في حين أنه لا يوجد حد أقصى معين للحد على GPU_BRUTE_FORCE، يوصى بعدم تجاوز 4096 لتجنب مشاكل الأداء المحتملة.
لا تدعم فهارس وحدة معالجة الرسومات حاليًا مسافة COSINE. إذا كانت مسافة COSINE مطلوبة، يجب تطبيع البيانات أولاً، ثم يمكن استخدام مسافة المنتج الداخلي (IP) كبديل.
تحميل حماية OOM لفهارس وحدة معالجة الرسومات غير مدعوم بالكامل، قد يؤدي تحميل الكثير من البيانات إلى تعطل QueryNode.
لا تدعم فهارس وحدة معالجة الرسومات وظائف البحث مثل البحث في النطاق والبحث بالتجميع.
الأسئلة الشائعة
متى يكون من المناسب استخدام فهرس GPU؟
يكون فهرس GPU مفيدًا بشكل خاص في المواقف التي تتطلب إنتاجية عالية أو استرجاعًا عاليًا. على سبيل المثال، عند التعامل مع الدفعات الكبيرة، يمكن أن تتجاوز إنتاجية فهرسة وحدة معالجة الرسومات إنتاجية فهرسة وحدة المعالجة المركزية بما يصل إلى 100 مرة. في السيناريوهات ذات الدُفعات الأصغر، لا تزال فهارس وحدة معالجة الرسومات تتفوق بشكل كبير على فهارس وحدة المعالجة المركزية من حيث الأداء. علاوةً على ذلك، إذا كانت هناك متطلبات لإدخال البيانات بسرعة، فإن دمج وحدة معالجة الرسومات يمكن أن يسرّع عملية إنشاء الفهارس بشكل كبير.
ما هي السيناريوهات التي تكون فيها فهارس وحدة معالجة الرسومات مثل CAGRA وGPU_IVF_PQ وGPU_IVF_FFLAT وGPU_BRUTE_FORCE الأنسب؟
تُعد فهارس CAGRA مثالية للسيناريوهات التي تتطلب أداءً محسنًا، وإن كان ذلك على حساب استهلاك المزيد من الذاكرة. بالنسبة للبيئات التي يكون فيها الحفاظ على الذاكرة أولوية، يمكن أن يساعد فهرس GPU_IVF_PQ في تقليل متطلبات التخزين، على الرغم من أن ذلك يأتي مع خسارة أعلى في الدقة. يعمل فهرس GPU_IVF_FLAT كخيار متوازن، حيث يوفر حلاً وسطًا بين الأداء واستخدام الذاكرة. أخيرًا، تم تصميم فهرس GPU_BRUTE_FORCE لعمليات البحث الشاملة، مما يضمن معدل استرجاع 1 من خلال إجراء عمليات بحث اجتياحية.