Bỏ để qua phần nội dung

Suy luận an toàn theo luồng với YOLO Mô hình

Chạy YOLO Các mô hình trong môi trường đa luồng đòi hỏi phải xem xét cẩn thận để đảm bảo an toàn cho ren. Python's threading Mô-đun cho phép bạn chạy một số luồng đồng thời, nhưng khi sử dụng YOLO Các mô hình trên các chủ đề này, có những vấn đề an toàn quan trọng cần lưu ý. Trang này sẽ hướng dẫn bạn cách tạo chuỗi an toàn YOLO suy luận mô hình.

Hiểu biết Python Luồng

Python Threads là một dạng song song cho phép chương trình của bạn chạy nhiều hoạt động cùng một lúc. Tuy nhiên PythonGlobal Interpreter Lock (GIL) của Global Interpreter Lock có nghĩa là chỉ có một luồng có thể thực thi Python bytecode tại một thời điểm.

Ví dụ đơn và đa luồng

Mặc dù điều này nghe có vẻ như là một hạn chế, các luồng vẫn có thể cung cấp tính đồng thời, đặc biệt là đối với các hoạt động liên kết I / O hoặc khi sử dụng các hoạt động giải phóng GIL, giống như các hoạt động được thực hiện bởi YOLOcủa các thư viện C cơ bản.

Sự nguy hiểm của các phiên bản mô hình dùng chung

Khởi tạo một YOLO Mô hình bên ngoài chuỗi của bạn và chia sẻ phiên bản này trên nhiều luồng có thể dẫn đến điều kiện chủng tộc, trong đó trạng thái bên trong của mô hình được sửa đổi không nhất quán do truy cập đồng thời. Điều này đặc biệt có vấn đề khi mô hình hoặc các thành phần của nó giữ trạng thái không được thiết kế để an toàn cho luồng.

Ví dụ không an toàn luồng: Phiên bản mô hình đơn

Khi sử dụng threads trong Python, điều quan trọng là phải nhận ra các mẫu có thể dẫn đến các vấn đề đồng thời. Đây là những gì bạn nên tránh: chia sẻ một đĩa đơn YOLO Phiên bản mô hình trên nhiều luồng.

# 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()

Trong ví dụ trên, các shared_model được sử dụng bởi nhiều luồng, có thể dẫn đến kết quả không thể đoán trước bởi vì predict có thể được thực thi đồng thời bởi nhiều luồng.

Ví dụ không an toàn cho luồng: Nhiều phiên bản mô hình

Tương tự, đây là một mô hình không an toàn với nhiều YOLO Phiên bản mô hình:

# 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()

Mặc dù có hai trường hợp mô hình riêng biệt, nguy cơ về các vấn đề đồng thời vẫn tồn tại. Nếu thực hiện nội bộ của YOLO không an toàn cho luồng, việc sử dụng các phiên bản riêng biệt có thể không ngăn chặn được điều kiện chủng tộc, đặc biệt nếu các phiên bản này chia sẻ bất kỳ tài nguyên hoặc trạng thái cơ bản nào không phải là luồng cục bộ.

Suy luận an toàn cho luồng

Để thực hiện suy luận an toàn theo luồng, bạn nên khởi tạo một suy luận riêng biệt YOLO mô hình trong mỗi luồng. Điều này đảm bảo rằng mỗi luồng có phiên bản mô hình riêng biệt, loại bỏ rủi ro về điều kiện đua.

Ví dụ về an toàn cho luồng

Dưới đây là cách khởi tạo một YOLO Mô hình bên trong mỗi luồng để suy luận song song an toàn:

# 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()

Trong ví dụ này, mỗi luồng tạo ra luồng riêng của nó YOLO ví dụ. Điều này ngăn chặn bất kỳ luồng nào can thiệp vào trạng thái mô hình của luồng khác, do đó đảm bảo rằng mỗi luồng thực hiện suy luận một cách an toàn và không có tương tác bất ngờ với các luồng khác.

Kết thúc

Khi sử dụng YOLO Mô hình với Python's threading, luôn khởi tạo các mô hình của bạn trong luồng sẽ sử dụng chúng để đảm bảo an toàn cho luồng. Thực hành này tránh các điều kiện đua và đảm bảo rằng các nhiệm vụ suy luận của bạn chạy đáng tin cậy.

Đối với các kịch bản nâng cao hơn và để tối ưu hóa hơn nữa hiệu suất suy luận đa luồng của bạn, hãy cân nhắc sử dụng song song dựa trên quy trình với multiprocessing hoặc tận dụng hàng đợi nhiệm vụ với các quy trình dành riêng cho nhân viên.



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

Ý kiến