انتقل إلى المحتوى

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

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

فهم Python التخييط

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

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

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

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

إنشاء مثيل ل 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("yolov8n.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("yolov8n_1.pt")
shared_model_2 = YOLO("yolov8n_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("yolov8n.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 أو الاستفادة من قائمة انتظار المهام مع عمليات العمال المخصصة.



Created 2023-11-12, Updated 2024-06-02
Authors: glenn-jocher (4)

التعليقات