تخطي إلى المحتوى

الاستدلال الآمن بالخيوط مع النماذج YOLO

يتطلب تشغيل النماذج YOLO في بيئة متعددة الخيوط دراسة متأنية لضمان سلامة الخيوط. Python's threading تسمح لك الوحدة النمطية بتشغيل عدة خيوط بشكل متزامن، ولكن عندما يتعلق الأمر باستخدام نماذج YOLO عبر هذه الخيوط، هناك قضايا أمان مهمة يجب أن تكون على دراية بها. سترشدك هذه الصفحة إلى كيفية إنشاء استدلال نموذج YOLO آمن للخيوط .

فهم الخيوط Python

Python الخيوط هي شكل من أشكال التوازي الذي يسمح لبرنامجك بتشغيل عمليات متعددة في وقت واحد. ومع ذلك، فإن القفل العالمي للمترجم الفوري (GIL) الخاص بـ Python يعني أن مؤشر ترابط واحد فقط يمكنه تنفيذ التعليمات البرمجية Python في كل مرة.

أمثلة أحادية مقابل أمثلة متعددة الخيوط

في حين أن هذا يبدو وكأنه قيد، لا يزال بإمكان الخيوط توفير التزامن، خاصة للعمليات المرتبطة بالإدخال/الإخراج أو عند استخدام العمليات التي تحرر GIL، مثل تلك التي تقوم بها مكتبات C الأساسية YOLO.

خطر مثيلات النماذج المشتركة

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

مثال غير آمن غير خيطي: مثيل نموذج واحد

عند استخدام سلاسل الرسائل في Python ، من المهم التعرف على الأنماط التي يمكن أن تؤدي إلى مشاكل التزامن. إليك ما يجب عليك تجنبه: مشاركة مثيل نموذج واحد YOLO عبر سلاسل رسائل متعددة.

# Unsafe: Sharing a single model instance across threads
from threading import Thread

from ultralytics import YOLO

# Instantiate the model outside the thread
shared_model = YOLO("yolo11n.pt")


def predict(image_path):
    """Predicts objects in an image using a preloaded YOLO model, take path string to image as argument."""
    results = shared_model.predict(image_path)
    # Process results


# Starting threads that share the same model instance
Thread(target=predict, args=("image1.jpg",)).start()
Thread(target=predict, args=("image2.jpg",)).start()

في المثال أعلاه، فإن shared_model يُستخدم من قبل عدة خيوط، مما قد يؤدي إلى نتائج غير متوقعة لأن predict يمكن تنفيذها في وقت واحد بواسطة خيوط متعددة.

مثال غير آمن غير خيطي: مثيلات نماذج متعددة

وبالمثل، هنا نمط غير آمن مع مثيلات نموذجية متعددة YOLO :

# Unsafe: Sharing multiple model instances across threads can still lead to issues
from threading import Thread

from ultralytics import YOLO

# Instantiate multiple models outside the thread
shared_model_1 = YOLO("yolo11n_1.pt")
shared_model_2 = YOLO("yolo11n_2.pt")


def predict(model, image_path):
    """Runs prediction on an image using a specified YOLO model, returning the results."""
    results = model.predict(image_path)
    # Process results


# Starting threads with individual model instances
Thread(target=predict, args=(shared_model_1, "image1.jpg")).start()
Thread(target=predict, args=(shared_model_2, "image2.jpg")).start()

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

الاستدلال الآمن الخيطي

لتنفيذ الاستدلال الآمن للخيط، يجب عليك إنشاء نموذج YOLO منفصل داخل كل مؤشر ترابط. يضمن ذلك أن يكون لكل مؤشر ترابط مثيل النموذج المعزول الخاص به، مما يزيل خطر حدوث حالات السباق.

مثال على سلسلة الرسائل الآمنة

إليك كيفية إنشاء نموذج YOLO داخل كل مؤشر ترابط للاستدلال المتوازي الآمن:

# Safe: Instantiating a single model inside each thread
from threading import Thread

from ultralytics import YOLO


def thread_safe_predict(image_path):
    """Predict on an image using a new YOLO model instance in a thread-safe manner; takes image path as input."""
    local_model = YOLO("yolo11n.pt")
    results = local_model.predict(image_path)
    # Process results


# Starting threads that each have their own model instance
Thread(target=thread_safe_predict, args=("image1.jpg",)).start()
Thread(target=thread_safe_predict, args=("image2.jpg",)).start()

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

الخاتمة

عند استخدام نماذج YOLO مع Python's threadingفاحرص دائمًا على إنشاء نماذجك داخل سلسلة الرسائل التي ستستخدمها لضمان سلامة سلسلة الرسائل. هذه الممارسة تتجنب حالات السباق وتتأكد من تشغيل مهام الاستدلال الخاصة بك بشكل موثوق.

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

الأسئلة الشائعة

كيف يمكنني تجنب حالات السباق عند استخدام نماذج YOLO في بيئة Python متعددة الخيوط؟

لمنع حدوث حالات السباق عند استخدام نماذج Ultralytics YOLO في بيئة Python متعددة الخيوط، قم بإنشاء نموذج YOLO منفصل داخل كل مؤشر ترابط. يضمن ذلك أن يكون لكل مؤشر ترابط مثيل النموذج المعزول الخاص به، مما يتجنب التعديل المتزامن لحالة النموذج.

مثال على ذلك:

from threading import Thread

from ultralytics import YOLO


def thread_safe_predict(image_path):
    """Predict on an image in a thread-safe manner."""
    local_model = YOLO("yolo11n.pt")
    results = local_model.predict(image_path)
    # Process results


Thread(target=thread_safe_predict, args=("image1.jpg",)).start()
Thread(target=thread_safe_predict, args=("image2.jpg",)).start()

لمزيد من المعلومات حول ضمان سلامة الخيط، قم بزيارة الاستدلال الآمن للخيوط باستخدام نماذج YOLO .

ما هي أفضل الممارسات لتشغيل استدلال نموذج YOLO متعدد الخيوط في Python ؟

لتشغيل استدلال نموذج YOLO متعدد الخيوط بأمان في Python ، اتبع أفضل الممارسات التالية:

  1. قم بتثبيت النماذج YOLO داخل كل مؤشر ترابط بدلاً من مشاركة مثيل نموذج واحد عبر مؤشرات الترابط.
  2. استخدم Python multiprocessing وحدة للمعالجة المتوازية لتجنب المشاكل المتعلقة بالقفل العالمي للمترجم الفوري (GIL).
  3. حرر GIL باستخدام العمليات التي تقوم بها مكتبات C الأساسية YOLO.

مثال على إنشاء النموذج الآمن من الخيط:

from threading import Thread

from ultralytics import YOLO


def thread_safe_predict(image_path):
    """Runs inference in a thread-safe manner with a new YOLO model instance."""
    model = YOLO("yolo11n.pt")
    results = model.predict(image_path)
    # Process results


# Initiate multiple threads
Thread(target=thread_safe_predict, args=("image1.jpg",)).start()
Thread(target=thread_safe_predict, args=("image2.jpg",)).start()

للحصول على سياق إضافي، ارجع إلى القسم الخاص بالاستدلال الآمن الترابطي.

لماذا يجب أن يكون لكل مؤشر ترابط مثيل نموذج YOLO خاص به؟

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

للحصول على إرشادات مفصّلة، راجع المثال غير الآمن للتسلسل اللولبي: قسم المثال أحادي النموذج وقسم المثال الآمن الخيطي.

كيف يؤثر قفل المفسر العالمي (GIL) Python على الاستدلال على نموذج YOLO ؟

Pythonيسمح القفل العالمي للمترجم التفسيري (GIL) لمؤشر ترابط واحد فقط بتنفيذ التعليمات البرمجية Python في كل مرة، مما قد يحد من أداء المهام متعددة الخيوط المرتبطة بالإدخال/الإخراج CPU. ومع ذلك، بالنسبة للعمليات المرتبطة بالإدخال/الإخراج أو العمليات التي تستخدم مكتبات تحرر GIL، مثل مكتبات C YOLO ، لا يزال بإمكانك تحقيق التزامن. لتحسين الأداء، ضع في اعتبارك استخدام التوازي القائم على المعالجة مع Python's multiprocessing الوحدة النمطية.

لمزيد من المعلومات حول الترابط في Python ، راجع قسم فهم الترابط Python .

هل من الآمن استخدام التوازي القائم على العمليات بدلاً من الترابط في استنتاج نموذج YOLO ؟

نعم، باستخدام Python multiprocessing أكثر أمانًا وأكثر كفاءة في كثير من الأحيان لتشغيل استنتاج نموذج YOLO بالتوازي. ينشئ التوازي القائم على المعالجة مساحات ذاكرة منفصلة، مما يؤدي إلى تجنب قفل المترجم العالمي (GIL) وتقليل مخاطر مشاكل التزامن. ستعمل كل عملية بشكل مستقل مع مثيل نموذج YOLO الخاص بها.

لمزيد من التفاصيل حول التوازي القائم على العمليات مع نماذج YOLO ، راجع الصفحة الخاصة بالاستدلال الآمن الترابطي.

📅 تم إنشاؤها منذ 1 سنة مضت ✏️ تم التحديث منذ 2 شهر

التعليقات