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

milvus-logo
LFAI
  • Home
  • Blog
  • اختبار حلول البحث المتجه ونشرها بسرعة باستخدام برنامج Milvus 2.0 Bootcamp

اختبار حلول البحث المتجه ونشرها بسرعة باستخدام برنامج Milvus 2.0 Bootcamp

  • Engineering
July 15, 2021
milvus

مع إصدار Milvus 2.0، قام الفريق بتجديد معسكر تدريب Milvus التمهيدي. يقدم المعسكر التمهيدي الجديد والمحسّن أدلة إرشادية محدثة وأمثلة برمجية أسهل في المتابعة لمجموعة متنوعة من حالات الاستخدام وعمليات النشر. بالإضافة إلى ذلك، تم تحديث هذا الإصدار الجديد لـ Milvus 2.0، وهو إصدار معاد تصوره من قاعدة البيانات المتجهة الأكثر تقدمًا في العالم.

اختبار الضغط على النظام الخاص بك مقابل معايير مجموعة بيانات 1 مليون و100 مليون

يحتوي الدليل المعياري على مليون و100 مليون اختبار معياري للمتجهات التي تشير إلى كيفية تفاعل نظامك مع مجموعات البيانات ذات الأحجام المختلفة.


يتضمن دليل الحلول حالات استخدام بحث التشابه المتجه الأكثر شيوعًا. وتحتوي كل حالة استخدام على حل دفتري وحل قابل للنشر على قاعدة بيانات. تتضمن حالات الاستخدام:


نشر تطبيق كامل البناء بسرعة على أي نظام

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


استخدم دفاتر الملاحظات الخاصة بسيناريو محدد لنشر التطبيقات المهيأة مسبقاً بسهولة

تحتوي دفاتر الملاحظات على مثال بسيط لنشر Milvus لحل المشكلة في حالة استخدام معينة. يمكن تشغيل كل مثال من الأمثلة من البداية إلى النهاية دون الحاجة إلى إدارة الملفات أو التكوينات. كما أن كل دفتر ملاحظات سهل المتابعة وقابل للتعديل، مما يجعلها ملفات أساسية مثالية لمشاريع أخرى.


مثال دفتر بحث تشابه الصور

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

يدور هذا الدفتر حول ثلاثة أشياء:

  • خادم ميلفوس
  • خادم ريديس (لتخزين البيانات الوصفية)
  • نموذج Resnet-18 المدرب مسبقًا.

الخطوة 1: تنزيل الحزم المطلوبة

ابدأ بتنزيل جميع الحزم المطلوبة لهذا المشروع. يتضمن هذا الدفتر جدولاً يسرد الحزم التي يجب استخدامها.

pip install -r requirements.txt

الخطوة 2: بدء تشغيل الخادم

بعد تثبيت الحزم، ابدأ تشغيل الخوادم وتأكد من تشغيل كلاهما بشكل صحيح. تأكد من اتباع التعليمات الصحيحة لبدء تشغيل خادمي ميلفوس وريديس.

الخطوة 3: تنزيل بيانات المشروع

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

! gdown "https://drive.google.com/u/1/uc?id=1jdudBiUu41kL-U5lhH3ari_WBRXyedWo&export=download"
! tar -xf 'VOCdevkit.zip'
! rm 'VOCdevkit.zip'

الخطوة 4: الاتصال بالخوادم

في هذا المثال، تعمل الخوادم على المنافذ الافتراضية على المضيف المحلي.

connections.connect(host="127.0.0.1", port=19537)
red = redis.Redis(host = '127.0.0.1', port=6379, db=0)

الخطوة 5: إنشاء مجموعة

بعد بدء تشغيل الخوادم، قم بإنشاء مجموعة في ميلفوس لتخزين جميع المتجهات. في هذا المثال، تم تعيين حجم البُعد على 512، وهو حجم مخرجات ريسنت 18، وتم تعيين مقياس التشابه على المسافة الإقليدية (L2). يدعم ميلفوس مجموعة متنوعة من مقاييس التشابه المختلفة.

collection_name = "image_similarity_search"
dim = 512
default_fields = [
    schema.FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    schema.FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=dim)
]
default_schema = schema.CollectionSchema(fields=default_fields, description="Image test collection")
collection = Collection(name=collection_name, schema=default_schema)

الخطوة 6: إنشاء فهرس للمجموعة

بمجرد إنشاء المجموعة، قم ببناء فهرس لها. في هذه الحالة، يتم استخدام فهرس IVF_SQ8. يتطلب هذا الفهرس معلمة "nlist"، والتي تخبر ميلفوس بعدد المجموعات التي يجب إنشاؤها داخل كل ملف بيانات (مقطع). تتطلب المؤشرات المختلفة معلمات مختلفة.

default_index = {"index_type": "IVF_SQ8", "params": {"nlist": 2048}, "metric_type": "L2"}
collection.create_index(field_name="vector", index_params=default_index)
collection.load()

الخطوة 7: إعداد النموذج ومُحمّل البيانات

بعد بناء فهرس IVF_SQ8، قم بإعداد الشبكة العصبية ومُحمّل البيانات. الشبكة العصبية pytorch resnet-18 المُستخدمة في هذا المثال خالية من الطبقة الأخيرة التي تضغط المتجهات للتصنيف وقد تفقد معلومات قيّمة.

model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet18', pretrained=True)
encoder = torch.nn.Sequential(*(list(model.children())[:-1]))

يجب تعديل مجموعة البيانات ومُحمّل البيانات بحيث تكون قادرة على معالجة الصور مسبقًا وتجميعها مع توفير مسارات ملفات الصور. يمكن القيام بذلك باستخدام أداة تحميل بيانات torchvision المعدلة قليلاً. من أجل المعالجة المسبقة، يجب اقتصاص الصور وتطبيعها نظرًا لأن نموذج resnet-18 يتم تدريبه على حجم ونطاق قيم محددين.

dataset = ImageFolderWithPaths(data_dir, transform=transforms.Compose([
                                                transforms.Resize(256),
                                                transforms.CenterCrop(224),
                                                transforms.ToTensor(),
                                                transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])]))

dataloader = torch.utils.data.DataLoader(dataset, num_workers=0, batch_si

الخطوة 8: إدراج المتجهات في المجموعة

بعد إعداد المجموعة، يمكن معالجة الصور وتحميلها في المجموعة التي تم إنشاؤها. يتم أولاً سحب الصور بواسطة أداة تحميل البيانات وتشغيلها من خلال نموذج resnet-18. ثم يتم إدراج تضمينات المتجهات الناتجة في Milvus، والتي تُرجع معرّفًا فريدًا لكل متجه. يتم بعد ذلك إدراج معرّفات المتجهات ومسارات ملفات الصور كأزواج قيمة مفتاح في خادم ريديس.

steps = len(dataloader)
step = 0
for inputs, labels, paths in dataloader:
    with torch.no_grad():
        output = encoder(inputs).squeeze()
        output = output.numpy()

    mr = collection.insert([output.tolist()])
    ids = mr.primary_keys
    for x in range(len(ids)):
        red.set(str(ids[x]), paths[x])
    if step%5 == 0:
        print("Insert Step: " + str(step) + "/" + str(steps))
    step += 1

بمجرد إدراج جميع البيانات في Milvus وRedis، يمكن إجراء بحث تشابه المتجهات الفعلي. في هذا المثال، يتم سحب ثلاث صور تم اختيارها عشوائيًا من خادم Redis لإجراء بحث تشابه المتجهات.

random_ids = [int(red.randomkey()) for x in range(3)]
search_images = [x.decode("utf-8") for x in red.mget(random_ids)]

تمر هذه الصور أولاً بنفس المعالجة المسبقة التي تم العثور عليها في الخطوة 7 ثم يتم دفعها من خلال نموذج resnet-18.

transform_ops = transforms.Compose([
                transforms.Resize(256),
                transforms.CenterCrop(224),
                transforms.ToTensor(),
                transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])

embeddings = [transform_ops(Image.open(x)) for x in search_images]
embeddings = torch.stack(embeddings, dim=0)

with torch.no_grad():
    embeddings = encoder(embeddings).squeeze().numpy()

ثم يتم استخدام التضمينات المتجهة الناتجة لإجراء بحث. أولاً، قم بتعيين معلمات البحث، بما في ذلك اسم المجموعة المراد البحث فيها، و nprobe (عدد المجموعات المراد البحث فيها)، و top_k (عدد المتجهات التي تم إرجاعها). في هذا المثال، يجب أن يكون البحث سريعًا جدًا.

search_params = {"metric_type": "L2", "params": {"nprobe": 32}}
start = time.time()
results = collection.search(embeddings, "vector", param=search_params, limit=3, expr=None)
end = time.time() - start

الخطوة 10: نتائج البحث عن الصور

يتم استخدام معرّفات المتجهات التي تم إرجاعها من الاستعلامات للعثور على الصور المقابلة. ثم يتم استخدام Matplotlib لعرض نتائج البحث عن الصور.

pic1.png pic1.png pic2.pngpic2.png pic3.pngpic3.png


تعلم كيفية نشر ميلفوس في بيئات مختلفة

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


لا تكن غريباً

  • اقرأ مدونتنا
  • تفاعل مع مجتمعنا مفتوح المصدر على Slack.
  • استخدم أو ساهم في Milvus، قاعدة البيانات المتجهة الأكثر شعبية في العالم، على Github.

    Try Managed Milvus for Free

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

    Get Started

    Like the article? Spread the word

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