joblib/threadpoolctl

Python helpers to limit the number of threads used in native libraries that handle their own internal threadpool (BLAS and OpenMP implementations)

해결하는 문제

과학 컴퓨팅 및 데이터 과학 프로그램은 종종 자체 스레드 풀을 유지 관리하는 BLAS 및 OpenMP와 같은 네이티브 라이브러리에 의존합니다. 병렬 처리를 중첩하면(예: 자체 멀티스레드 코드 내에서 BLAS 작업을 실행) 이러한 기본 풀이 CPU를 과도하게 구독하여 속도 저하를 유발할 수 있습니다. 이 프로젝트는 이러한 스레드 풀을 검사하고 사용하는 스레드 수를 제한하는 도구를 제공하여 낭비를 방지하고 성능을 예측 가능하게 유지하는 데 도움이 됩니다.

작동 방식

Python 프로세스에 이미 로드된 네이티브 공유 라이브러리(예: numpy 또는 scipy에서)를 검사하고 해당 스레드 풀 구성을 노출하여 작동합니다. 다음을 수행할 수 있습니다.

  • 명령줄(python -m threadpoolctl -i numpy scipy.linalg)을 사용하여 각 라이브러리의 스레드 풀에 대한 JSON 스냅샷을 출력합니다.
  • Python에서 threadpool_info()를 호출하여 프로그래밍 방식으로 동일한 정보를 확인합니다.
  • threadpool_limits 컨텍스트 관리자 또는 ThreadpoolController 개체를 사용하여 특정 라이브러리 제품군(예: BLAS 또는 OpenMP)에 대한 최대 스레드 수를 임시로 설정합니다.
  • 함수에 데코레이터로 제한을 적용하거나 각 작업자 스레드에서 컨트롤러를 사용하여 Python 스레드 풀 내에서 제한을 관리할 수 있습니다.

이 프로젝트는 또한 라이브러리마다 제한 의미가 다르다는 사실(일부는 전역 프로세스 전체 제한을 설정하고 일부는 현재 스레드에만 영향을 미침)을 처리하고 의도와 일치하는 API를 선택하려고 합니다.

대상 사용자

이것은 네이티브 스레드 풀을 사용하는 수치 라이브러리로 작업하는 Python 개발자를 위한 것입니다. 예를 들어 성능에 민감하거나 병렬 워크로드에서 numpy, scipy, scikit-learn, xgboost 또는 유사한 도구를 사용하는 모든 사람을 위한 것입니다. Python 수준 병렬 처리와 네이티브 병렬 처리를 결합하고 각 계층이 사용하는 스레드 수를 조정하려는 경우 특히 유용합니다.

주요 기능

  • Python 패키지에서 로드한 스레드 풀을 빠르게 검사하기 위한 명령줄 도구.
  • 간단한 함수(threadpool_info)와 재사용 가능한 개체(ThreadpoolController)를 모두 갖춘 Python API.
  • 특정 코드 섹션이나 함수 내에서 스레드 수를 제한하기 위한 컨텍스트 관리자 및 데코레이터.
  • BLAS 라이브러리(OpenBLAS, MKL, FlexiBLAS)와 OpenMP 구현(libgomp, libiomp, libomp)을 모두 지원합니다.
  • 각 작업자 스레드에서 제한을 설정하고 컨트롤러를 통해 전체 제어를 유지하여 Python 스레드 풀을 처리할 수 있습니다.
  • 런타임에 FlexiBLAS 백엔드를 전환하는 실험적 API가 포함되어 있습니다.
  • 확장 가능: 스레드 제한 API를 노출하는 다른 네이티브 라이브러리에 대한 사용자 지정 컨트롤러를 작성하고 등록할 수 있습니다.

관련

  • 프로젝트
  • 프로젝트
  • 프로젝트
  • 프로젝트