اختبار حلول البحث المتجه ونشرها بسرعة باستخدام برنامج Milvus 2.0 Bootcamp
مع إصدار 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
الخطوة 9: إجراء بحث عن تشابه المتجهات
بمجرد إدراج جميع البيانات في 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
pic2.png
pic3.png
تعلم كيفية نشر ميلفوس في بيئات مختلفة
يحتوي قسم عمليات النشر في معسكر التمهيد الجديد على جميع المعلومات الخاصة باستخدام ميلفوس في بيئات وإعدادات مختلفة. ويتضمن نشر ميشاردز، واستخدام Kubernetes مع ميلفوس، وموازنة التحميل، والمزيد. تحتوي كل بيئة على دليل مفصل خطوة بخطوة يشرح كيفية تشغيل ميلفوس فيها.
لا تكن غريباً
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word