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 包加载的线程池。
- Python API,提供简单函数(
threadpool_info)和可重用对象(ThreadpoolController)。 - 上下文管理器和装饰器,用于限制特定代码段或函数中的线程数。
- 支持 BLAS 库(OpenBLAS、MKL、FlexiBLAS)和 OpenMP 实现(libgomp、libiomp、libomp)。
- 可以通过在每个工作线程中设置限制来处理 Python 线程池,同时通过控制器保持整体控制。
- 包含一个实验性 API,可在运行时切换 FlexiBLAS 后端。
- 可扩展:您可以为其他暴露线程限制 API 的原生库编写和注册自定义控制器。
相关
- 项目
- 项目
- 项目
- 项目