콘텐츠로 건너뛰기

YOLO 모델을 사용한 스레드 안전 추론

멀티 스레드 환경에서 YOLO 모델을 실행하려면 스레드 안전을 보장하기 위해 신중한 고려가 필요합니다. Python's threading 모듈을 사용하면 여러 스레드를 동시에 실행할 수 있지만 이러한 스레드에서 YOLO 모델을 사용할 때는 주의해야 할 중요한 안전 문제가 있습니다. 이 페이지에서는 스레드에 안전한 YOLO 모델 추론을 만드는 방법을 안내합니다.

Python 스레딩 이해

Python 스레드는 프로그램에서 한 번에 여러 작업을 실행할 수 있는 병렬 처리의 한 형태입니다. 하지만 Python 의 글로벌 인터프리터 잠금(GIL)은 한 번에 하나의 스레드만 Python 바이트코드를 실행할 수 있음을 의미합니다.

싱글 스레드와 멀티 스레드 예시

이는 제한 사항처럼 들리지만, 스레드는 특히 I/O 바인딩 연산이나 YOLO 의 기본 C 라이브러리에서 수행하는 것과 같이 GIL을 해제하는 연산을 사용할 때 동시성을 제공할 수 있습니다.

공유 모델 인스턴스의 위험성

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 threading를 사용하면 스레드 안전을 보장하기 위해 항상 모델을 사용할 스레드 내에서 모델을 인스턴스화합니다. 이렇게 하면 경쟁 조건을 피하고 추론 작업을 안정적으로 실행할 수 있습니다.

보다 고급 시나리오와 멀티스레드 추론 성능을 더욱 최적화하려면 다음과 같이 프로세스 기반 병렬 처리를 사용하는 것이 좋습니다. multiprocessing 또는 전용 작업자 프로세스가 있는 작업 대기열을 활용하세요.

자주 묻는 질문

멀티 스레드 Python 환경에서 YOLO 모델을 사용할 때 경쟁 조건을 피하려면 어떻게 해야 하나요?

멀티 스레드 Python 환경에서 Ultralytics YOLO 모델을 사용할 때 경쟁 조건을 방지하려면 각 스레드 내에 별도의 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 모델을 사용한 스레드 안전 추론 문서를 참조하세요.

Python 에서 멀티 스레드 YOLO 모델 추론을 실행하는 모범 사례는 무엇인가요?

Python 에서 멀티 스레드 YOLO 모델 추론을 안전하게 실행하려면 다음 모범 사례를 따르세요:

  1. 단일 모델 인스턴스를 여러 스레드에서 공유하는 대신 각 스레드 내에서 YOLO 모델을 인스턴스화합니다.
  2. Python 사용 multiprocessing 모듈을 병렬 처리하여 글로벌 인터프리터 잠금(GIL)과 관련된 문제를 방지합니다.
  3. YOLO 의 기본 C 라이브러리에서 수행하는 작업을 사용하여 GIL을 릴리스합니다.

스레드 안전 모델 인스턴스화의 예입니다:

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 모델 인스턴스가 있어야 경쟁 조건을 방지할 수 있습니다. 단일 모델 인스턴스를 여러 스레드에서 공유하면 동시 액세스로 인해 예측할 수 없는 동작과 모델 내부 상태의 수정이 발생할 수 있습니다. 별도의 인스턴스를 사용하면 스레드 격리를 보장하여 멀티스레드 작업을 안정적이고 안전하게 수행할 수 있습니다.

자세한 지침은 비스레드 안전 예제 섹션을 참조하세요: 단일 모델 인스턴스스레드 안전 예제 섹션을 참조하세요.

Python 의 글로벌 인터프리터 잠금(GIL)은 YOLO 모델 추론에 어떤 영향을 미치나요?

Python의 글로벌 인터프리터 잠금(GIL)은 한 번에 하나의 스레드만 Python 바이트코드를 실행하도록 허용하므로 CPU-바운드 멀티스레딩 작업의 성능이 제한될 수 있습니다. 그러나 YOLO 의 C 라이브러리처럼 GIL을 해제하는 라이브러리를 사용하는 I/O 바운드 작업이나 프로세스의 경우 여전히 동시성을 달성할 수 있습니다. 성능을 향상시키려면 Python 에서 프로세스 기반 병렬 처리를 사용하는 것이 좋습니다. multiprocessing 모듈.

Python 에서 스레딩에 대한 자세한 내용은 Python 스레딩 이해 섹션을 참조하세요.

YOLO 모델 추론에 스레딩 대신 프로세스 기반 병렬 처리를 사용하는 것이 더 안전한가요?

예, Python 의 multiprocessing 모듈을 병렬로 실행하는 것이 YOLO 모델 추론을 실행하는 데 더 안전하고 효율적인 경우가 많습니다. 프로세스 기반 병렬 처리는 별도의 메모리 공간을 생성하여 글로벌 인터프리터 잠금(GIL)을 피하고 동시성 문제의 위험을 줄입니다. 각 프로세스는 자체 YOLO 모델 인스턴스와 함께 독립적으로 작동합니다.

YOLO 모델을 사용한 프로세스 기반 병렬 처리에 대한 자세한 내용은 스레드 안전 추론 페이지를 참조하세요.

📅 Created 11 months ago ✏️ Updated 22 days ago

댓글